[Pkg-mono-svn-commits] [mono] 01/01: Imported Upstream version 3.2.8+dfsg

Jo Shields directhex at moszumanska.debian.org
Wed Feb 19 23:04:24 UTC 2014


This is an automated email from the git hooks/post-receive script.

directhex pushed a commit to annotated tag upstream/3.2.8+dfsg
in repository mono.

commit 9972bf87b4f27d9c8f358ef8414ac1ab957a2f0f
Author: Jo Shields <directhex at apebox.org>
Date:   Wed Feb 19 22:12:43 2014 +0000

    Imported Upstream version 3.2.8+dfsg
---
 LICENSE                                            |     7 -
 Makefile.am                                        |     7 +
 Makefile.in                                        |   104 +-
 README                                             |   592 -
 README.md                                          |   539 +
 aclocal.m4                                         |   384 +-
 autogen.sh                                         |    12 +-
 compile                                            |     3 +-
 config.guess                                       |   144 +-
 config.h.in                                        |    34 +
 config.sub                                         |     3 +
 configure                                          |   652 +-
 configure.in                                       |   150 +-
 data/{net_2_0 => }/Browsers/Compat.browser         |     0
 data/Makefile.am                                   |     7 +-
 data/Makefile.in                                   |    78 +-
 data/aspnetwebstack.pc.in                          |     2 +-
 data/config.in                                     |     4 +-
 data/net_2_0/Browsers/ChangeLog                    |     6 -
 data/net_2_0/Browsers/Makefile.am                  |     4 +-
 data/net_2_0/Browsers/Makefile.in                  |    18 +-
 data/net_2_0/Makefile.in                           |    68 +-
 data/net_4_0/Browsers/Makefile.am                  |     6 +
 data/net_4_0/Browsers/Makefile.in                  |   534 +
 data/net_4_0/Makefile.am                           |     2 +-
 data/net_4_0/Makefile.in                           |    70 +-
 data/net_4_5/Browsers/Makefile.am                  |     6 +
 data/net_4_5/Browsers/Makefile.in                  |   534 +
 data/net_4_5/Makefile.am                           |     2 +-
 data/net_4_5/Makefile.in                           |    70 +-
 data/xbuild12.pc                                   |     7 +
 depcomp                                            |     3 +-
 docs/Makefile.in                                   |    13 +-
 docs/current-api                                   |     1 +
 docs/public-api                                    |     1 +
 eglib/Makefile.in                                  |   106 +-
 eglib/aclocal.m4                                   |   379 +-
 eglib/configure                                    |   186 +-
 eglib/m4/Makefile.in                               |    14 +-
 eglib/m4/libtool.m4                                |    55 +-
 eglib/src/Makefile.in                              |    67 +-
 eglib/src/gmisc-win32.c                            |    10 +-
 eglib/test/Makefile.in                             |    32 +-
 eglib/test/sizes.c                                 |    18 +-
 external/cecil/.gitattributes                      |     1 +
 external/cecil/Mono.Cecil.PE/Image.cs              |     1 +
 external/cecil/Mono.Cecil.PE/ImageReader.cs        |    10 +-
 external/cecil/Mono.Cecil.PE/ImageWriter.cs        |    39 +-
 external/cecil/Mono.Cecil.nuspec                   |     2 +-
 external/cecil/Mono.Cecil.sln.DotSettings          |    35 +
 external/cecil/Mono.Cecil/AssemblyNameReference.cs |    11 +-
 external/cecil/Mono.Cecil/AssemblyReader.cs        |   126 +-
 external/cecil/Mono.Cecil/AssemblyWriter.cs        |     2 +-
 external/cecil/Mono.Cecil/BaseAssemblyResolver.cs  |     7 +
 external/cecil/Mono.Cecil/EventDefinition.cs       |     4 +-
 external/cecil/Mono.Cecil/FunctionPointerType.cs   |     1 +
 external/cecil/Mono.Cecil/GenericParameter.cs      |    10 +
 external/cecil/Mono.Cecil/Import.cs                |   235 +-
 external/cecil/Mono.Cecil/MetadataResolver.cs      |    17 +
 external/cecil/Mono.Cecil/MetadataSystem.cs        |    23 +-
 external/cecil/Mono.Cecil/ModuleDefinition.cs      |   123 +-
 external/cecil/Mono.Cecil/ModuleKind.cs            |    10 +
 external/cecil/Mono.Cecil/TypeParser.cs            |    10 +-
 external/cecil/Mono.Cecil/TypeReference.cs         |     9 +
 external/cecil/Mono.Cecil/TypeSpecification.cs     |     5 +-
 external/cecil/Mono.Cecil/TypeSystem.cs            |    31 +-
 external/cecil/Mono/Empty.cs                       |    14 +
 external/cecil/Test/Mono.Cecil.Tests.csproj        |    12 +-
 .../cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs  |    17 +
 .../Test/Mono.Cecil.Tests/ImportCecilTests.cs      |    64 +
 .../Test/Mono.Cecil.Tests/ImportReflectionTests.cs |     4 +-
 .../cecil/Test/Mono.Cecil.Tests/ResolveTests.cs    |    15 +
 external/cecil/Test/libs/nunit-2.4.8/license.txt   |    15 -
 external/cecil/Test/libs/nunit-2.6.2/license.txt   |    15 +
 .../cecil/rocks/Test/Mono.Cecil.Rocks.Tests.csproj |    12 +-
 .../cecil/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs  |    19 +-
 .../symbols/mdb/Test/Mono.Cecil.Mdb.Tests.csproj   |    12 +-
 .../symbols/pdb/Microsoft.Cci.Pdb/BitAccess.cs     |     6 +
 .../cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFile.cs |   218 +-
 .../symbols/pdb/Microsoft.Cci.Pdb/PdbFunction.cs   |    56 +-
 .../symbols/pdb/Microsoft.Cci.Pdb/PdbScope.cs      |     2 +-
 .../cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbSlot.cs |     5 +-
 .../symbols/pdb/Microsoft.Cci.Pdb/PdbTokenLine.cs  |    33 +
 external/cecil/symbols/pdb/Mono.Cecil.Pdb.csproj   |     7 +-
 .../cecil/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs  |     7 +-
 .../symbols/pdb/Test/Mono.Cecil.Pdb.Tests.csproj   |    12 +-
 external/ikvm/awt/ShellApi.cs                      |     2 +-
 .../ikvm/classpath/ikvm/internal/HasCallerID.java  |    36 -
 external/ikvm/ikvm/starter.cs                      |    81 +-
 external/ikvm/ikvmc/CompilerClassLoader.cs         |   285 +-
 external/ikvm/ikvmstub/ikvmstub.cs                 |    12 +-
 external/ikvm/openjdk/FORKED                       |   132 +
 external/ikvm/openjdk/allsources.lst               |    42 +-
 .../imageio/plugins/jpeg/JPEGImageReaderSpi.java   |   112 -
 .../imageio/plugins/jpeg/JPEGImageWriterSpi.java   |   119 -
 .../ikvm/internal/AnnotationAttributeBase.java     |   194 +-
 external/ikvm/openjdk/ikvm/internal/Winsock.java   |     1 +
 .../ikvm/openjdk/java/awt/image/BufferedImage.java |    82 +-
 .../openjdk/java/awt/image/IndexColorModel.java    |    10 +-
 external/ikvm/openjdk/java/io/FileInputStream.java |    45 +-
 .../ikvm/openjdk/java/io/FileOutputStream.java     |    45 +-
 .../ikvm/openjdk/java/io/ObjectStreamClass.java    |    46 +-
 .../ikvm/openjdk/java/io/ObjectStreamField.java    |    10 +
 .../ikvm/openjdk/java/io/RandomAccessFile.java     |    59 +-
 external/ikvm/openjdk/java/lang/Class.java         |   181 +-
 external/ikvm/openjdk/java/lang/ClassLoader.java   |    57 +-
 external/ikvm/openjdk/java/lang/Package.java       |   615 +
 external/ikvm/openjdk/java/lang/System.java        |    11 +-
 external/ikvm/openjdk/java/lang/Thread.java        |    37 +-
 .../openjdk/java/lang/invoke/MethodHandles.java    |    14 +-
 .../openjdk/java/lang/reflect/Constructor.java     |     6 +-
 external/ikvm/openjdk/java/lang/reflect/Field.java |   186 +-
 .../ikvm/openjdk/java/lang/reflect/Method.java     |     6 +-
 external/ikvm/openjdk/java/lang/reflect/Proxy.java |   159 +-
 .../java/net/DefaultDatagramSocketImplFactory.java |    51 +-
 .../java/net/DualStackPlainDatagramSocketImpl.java |    34 +-
 .../net/DualStackPlainDatagramSocketImpl_c.java    |     9 +-
 .../openjdk/java/net/DualStackPlainSocketImpl.java |    37 +-
 .../java/net/DualStackPlainSocketImpl_c.java       |     6 +-
 .../ikvm/openjdk/java/net/PlainSocketImpl.java     |    25 +-
 .../ikvm/openjdk/java/net/SocketInputStream.java   |    10 +-
 .../ikvm/openjdk/java/net/SocketOutputStream.java  |     7 +-
 .../java/net/TwoStacksPlainDatagramSocketImpl.java |    52 +-
 .../net/TwoStacksPlainDatagramSocketImpl_c.java    |    45 +-
 .../openjdk/java/net/TwoStacksPlainSocketImpl.java |    44 +-
 .../java/net/TwoStacksPlainSocketImpl_c.java       |    17 +-
 external/ikvm/openjdk/java/net/net_util_md.java    |    59 +-
 .../openjdk/java/security/AccessController.java    |    48 +-
 external/ikvm/openjdk/java/sql/DriverManager.java  |   370 +-
 .../ikvm/openjdk/java/util/ResourceBundle.java     |    29 +-
 external/ikvm/openjdk/java/util/TimeZone.java      |    69 +-
 external/ikvm/openjdk/map.xml                      |    24 +-
 external/ikvm/openjdk/response.txt                 |    38 +-
 external/ikvm/openjdk/sun/awt/AppContext.java      |   214 +-
 external/ikvm/openjdk/sun/awt/AppContextDC.java    |    45 -
 external/ikvm/openjdk/sun/awt/SunToolkit.java      |   142 +-
 .../openjdk/sun/awt/image/ByteComponentRaster.java |   919 --
 .../openjdk/sun/awt/image/BytePackedRaster.java    |  1389 --
 .../sun/awt/image/IntegerComponentRaster.java      |   685 -
 .../sun/awt/image/OffScreenImageSource.java        |   195 -
 .../sun/awt/image/ShortComponentRaster.java        |   829 -
 .../ikvm/openjdk/sun/font/StandardGlyphVector.java |    17 +-
 external/ikvm/openjdk/sun/misc/IoTrace.java        |   170 +
 external/ikvm/openjdk/sun/misc/JavaAWTAccess.java  |    42 +
 external/ikvm/openjdk/sun/misc/SharedSecrets.java  |    16 +-
 external/ikvm/openjdk/sun/misc/Unsafe.java         |     2 +-
 .../openjdk/sun/nio/ch/DatagramChannelImpl.java    |    52 +-
 .../ikvm/openjdk/sun/nio/ch/FileChannelImpl.java   |    29 +-
 external/ikvm/openjdk/sun/nio/ch/Net.java          |   107 +-
 .../openjdk/sun/nio/fs/NetFileSystemProvider.java  |     2 +-
 .../ikvm/openjdk/sun/reflect/CallerSensitive.java  |    41 +
 external/ikvm/openjdk/sun/reflect/Reflection.java  |     9 +
 .../ikvm/openjdk/sun/reflect/misc/ReflectUtil.java |   252 +
 external/ikvm/reflect/AssemblyName.cs              |   213 +-
 external/ikvm/reflect/Binder.cs                    |    30 +-
 external/ikvm/reflect/Emit/AssemblyBuilder.cs      |    75 +-
 .../ikvm/reflect/Emit/CustomAttributeBuilder.cs    |    39 +-
 external/ikvm/reflect/Emit/ExceptionHandler.cs     |     2 +-
 external/ikvm/reflect/Emit/ILGenerator.cs          |     7 +-
 external/ikvm/reflect/Emit/ModuleBuilder.cs        |    48 +-
 external/ikvm/reflect/Emit/TypeBuilder.cs          |    56 +-
 external/ikvm/reflect/Fusion.cs                    |   551 +-
 external/ikvm/reflect/IKVM.Reflection.csproj       |     9 +-
 external/ikvm/reflect/MethodSignature.cs           |     9 +-
 external/ikvm/reflect/Missing.cs                   |    38 +-
 external/ikvm/reflect/Module.cs                    |    10 +
 external/ikvm/reflect/Projection.cs                |   602 +
 external/ikvm/reflect/Reader/AssemblyReader.cs     |     8 +-
 external/ikvm/reflect/Reader/ModuleReader.cs       |    50 +-
 external/ikvm/reflect/Reader/PEReader.cs           |     8 +-
 external/ikvm/reflect/Reader/TypeDefImpl.cs        |    43 -
 external/ikvm/reflect/Type.cs                      |    80 +-
 external/ikvm/reflect/Universe.cs                  |   130 +-
 external/ikvm/reflect/Writer/MetadataWriter.cs     |     9 +
 external/ikvm/reflect/Writer/PEWriter.cs           |    24 +-
 external/ikvm/reflect/Writer/TextSection.cs        |    17 +-
 external/ikvm/reflect/reflect.build                |    24 +
 external/ikvm/runtime/ClassFile.cs                 |   107 +-
 external/ikvm/runtime/DynamicTypeWrapper.cs        |  1034 +-
 external/ikvm/runtime/ExceptionHelper.cs           |    14 +-
 external/ikvm/runtime/JniInterface.cs              |   127 +-
 external/ikvm/runtime/MemberWrapper.cs             |   640 +-
 external/ikvm/runtime/TypeWrapper.cs               |   402 +-
 external/ikvm/runtime/attributes.cs                |     9 +
 external/ikvm/runtime/common.cs                    |    76 +-
 external/ikvm/runtime/intrinsics.cs                |    60 +-
 external/ikvm/runtime/openjdk/java.lang.cs         |  1332 ++
 external/ikvm/runtime/openjdk/java.lang.invoke.cs  |    73 +-
 external/ikvm/runtime/openjdk/java.lang.reflect.cs |   767 +
 external/ikvm/runtime/openjdk/misc.cs              |   585 +
 external/ikvm/runtime/openjdk/sun.nio.ch.cs        |    39 +-
 external/ikvm/runtime/openjdk/sun.reflect.cs       |  2293 +++
 external/ikvm/runtime/stubgen/ClassFileWriter.cs   |    25 +
 external/ikvm/runtime/stubgen/StubGenerator.cs     |   120 +-
 external/ikvm/runtime/verifier.cs                  |   248 +-
 external/ikvm/runtime/vfs.cs                       |    42 +-
 external/ikvm/runtime/vm.cs                        |    23 +-
 external/rx/.gitignore                             |     3 +
 external/rx/Ix/NET/.gitattributes                  |    22 -
 external/rx/Ix/NET/.gitignore                      |   163 -
 external/rx/Ix/NET/35MSSharedLib1024.snk           |   Bin 0 -> 160 bytes
 external/rx/Ix/NET/Common.targets                  |   279 +-
 external/rx/Ix/NET/Enumerable.cs                   |     2 +-
 external/rx/Ix/NET/Import.targets                  |    28 +-
 external/rx/Ix/NET/Interactive Extensions.sln      |   262 +-
 .../InteractiveExtensionsForAndroid.nuspec         |    25 +
 .../rx/Ix/NET/Ix_Xamarin/Ix_Xamarin_android.sln    |    36 +
 external/rx/Ix/NET/Ix_Xamarin/Ix_Xamarin_iOS.sln   |     9 +
 .../android_System.Interactive.Async.csproj        |   109 +
 .../android_System.Interactive.Providers.csproj    |    70 +
 .../android_System.Interactive.csproj              |    91 +
 .../ios_System.Interactive.Async.csproj            |   124 +
 .../ios_System.Interactive.Providers.csproj        |    85 +
 .../ios_System.Interactive.csproj                  |   106 +
 .../System.Interactive.Async/IAsyncEnumerable.cs   |     4 +-
 .../System.Interactive.Async/IAsyncEnumerator.cs   |     4 +-
 .../NET/System.Interactive.Async/IAsyncGrouping.cs |     4 +-
 .../IOrderedAsyncEnumerable.cs                     |     4 +-
 .../Properties/AssemblyInfo.cs                     |    22 +-
 .../System.Interactive.Async.csproj                |     7 +-
 .../Properties/AssemblyInfo.cs                     |    23 +-
 .../System.Interactive.Providers.csproj            |     8 +-
 .../System.Interactive/EnumerableEx.Creation.cs    |    11 +
 .../rx/Ix/NET/System.Interactive/IAwaitable.cs     |    23 +
 external/rx/Ix/NET/System.Interactive/IYielder.cs  |   101 +
 .../System.Interactive/Properties/AssemblyInfo.cs  |    23 +-
 .../System.Interactive/System.Interactive.csproj   |    10 +-
 external/rx/Ix/NET/Tests/App.cs                    |     2 +-
 external/rx/Ix/NET/Tests/AsyncTests.Aggregates.cs  |    11 +-
 external/rx/Ix/NET/Tests/AsyncTests.Bugs.cs        |    12 +-
 external/rx/Ix/NET/Tests/AsyncTests.Conversions.cs |    12 +-
 external/rx/Ix/NET/Tests/AsyncTests.Creation.cs    |    11 +-
 external/rx/Ix/NET/Tests/AsyncTests.Exceptions.cs  |    13 +-
 external/rx/Ix/NET/Tests/AsyncTests.Multiple.cs    |    11 +-
 external/rx/Ix/NET/Tests/AsyncTests.Single.cs      |    11 +-
 external/rx/Ix/NET/Tests/AsyncTests.cs             |    11 +-
 .../rx/Ix/NET/Tests/Properties/AssemblyInfo.cs     |     7 +-
 external/rx/Ix/NET/Tests/Tests.Aggregates.cs       |     9 +-
 external/rx/Ix/NET/Tests/Tests.Buffering.cs        |    11 +-
 external/rx/Ix/NET/Tests/Tests.Creation.cs         |    30 +-
 external/rx/Ix/NET/Tests/Tests.Exceptions.cs       |     9 +-
 external/rx/Ix/NET/Tests/Tests.Imperative.cs       |     9 +-
 external/rx/Ix/NET/Tests/Tests.Multiple.cs         |     9 +-
 external/rx/Ix/NET/Tests/Tests.Qbservable.cs       |    27 +-
 external/rx/Ix/NET/Tests/Tests.Single.cs           |     9 +-
 external/rx/Ix/NET/Tests/Tests.cs                  |     9 +-
 external/rx/Ix/NET/Tests/Tests.csproj              |    13 +-
 external/rx/README.md                              |    14 +
 external/rx/Rakefile                               |    40 +
 .../rx/Rx/NET/Resources/Artwork/Logo_Color.design  |   Bin 0 -> 10291 bytes
 .../NET/Resources/Artwork/Logo_Color_2010x2000.psd |   Bin 0 -> 1391084 bytes
 .../NET/Resources/Artwork/Logo_Color_300x300.png   |   Bin 0 -> 39715 bytes
 .../rx/Rx/NET/Samples/Portable/.nuget/NuGet.Config |     6 +
 .../Rx/NET/Samples/Portable/.nuget/NuGet.targets   |   136 +
 .../Net40ConsoleApp_NuGet.csproj                   |    79 +
 .../Portable/Net40ConsoleApp_NuGet/Program.cs      |    46 +
 .../Properties/AssemblyInfo.cs                     |    36 +
 .../Portable/Net40ConsoleApp_NuGet/packages.config |     8 +
 .../Net40ConsoleApplication.csproj                 |    95 +
 .../Portable/Net40ConsoleApplication/Program.cs    |    46 +
 .../Properties/AssemblyInfo.cs                     |    36 +
 external/rx/Rx/NET/Samples/Portable/Portable.sln   |    85 +
 .../Portable/PortableClassLibrary/PortableClass.cs |    28 +
 .../PortableClassLibrary.csproj                    |    72 +
 .../Properties/AssemblyInfo.cs                     |    30 +
 .../PortableClassLibrary_NuGet/PortableClass.cs    |    28 +
 .../PortableClassLibrary_NuGet.csproj              |   101 +
 .../Properties/AssemblyInfo.cs                     |    30 +
 .../Portable/PortableClassLibrary_NuGet/app.config |    11 +
 .../PortableClassLibrary_NuGet/packages.config     |     8 +
 .../Portable/SilverlightApplication/App.xaml       |     8 +
 .../Portable/SilverlightApplication/App.xaml.cs    |    68 +
 .../Portable/SilverlightApplication/MainPage.xaml  |    24 +
 .../SilverlightApplication/MainPage.xaml.cs        |    58 +
 .../Properties/AppManifest.xml                     |     0
 .../Properties/AssemblyInfo.cs                     |    35 +
 .../SilverlightApplication.csproj                  |   138 +
 external/rx/Rx/NET/Source/.nuget/NuGet.Config      |     6 +
 external/rx/Rx/NET/Source/.nuget/NuGet.targets     |   136 +
 external/rx/Rx/NET/Source/35MSSharedLib1024.snk    |   Bin 0 -> 160 bytes
 external/rx/Rx/NET/Source/BuildAll.proj            |     6 +
 external/rx/Rx/NET/Source/Common.targets           |   127 +-
 external/rx/Rx/NET/Source/Import.targets           |    53 +-
 external/rx/Rx/NET/Source/Local.testsettings       |    16 -
 .../Properties/AssemblyInfo.cs                     |    12 +-
 .../Microsoft.Reactive.Testing/ReactiveTest.cs     |    26 +-
 .../rx/Rx/NET/Source/Playground/Playground.csproj  |     2 +-
 external/rx/Rx/NET/Source/Rx.sln                   |  1087 +-
 .../Rx_Xamarin/ReactiveExtensionsForAndroid.nuspec |    29 +
 .../Rx_Xamarin/ReactiveExtensionsForiOS.nuspec     |    28 +
 .../NET/Source/Rx_Xamarin/Rx_Xamarin_android.sln   |    37 +-
 .../rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_iOS.sln |    19 -
 .../rx/Rx/NET/Source/Rx_Xamarin/android/Makefile   |    11 -
 .../ReactiveTestApplication/Assets/AboutAssets.txt |    19 +
 .../ReactiveTestApplication/MainActivity.cs        |    19 +
 .../Properties/AndroidManifest.xml                 |     6 +
 .../Properties/AssemblyInfo.cs                     |    23 +
 .../ReactiveTestApplication.csproj                 |    68 +
 .../Resources/AboutResources.txt                   |    44 +
 .../Resources/Resource.designer.cs                 |   171 +
 .../Resources/drawable/Icon.png                    |   Bin 0 -> 2574 bytes
 .../Source/Rx_Xamarin/android/andr-unit-rx.patch   |    74 -
 .../android/libs/Mono.Reactive.Testing.dll.mdb     |   Bin 6251 -> 0 bytes
 .../android/libs/System.Reactive.Core.dll.mdb      |   Bin 49867 -> 0 bytes
 .../android/libs/System.Reactive.Debugger.dll.mdb  |   Bin 323 -> 0 bytes
 .../libs/System.Reactive.Experimental.dll.mdb      |   Bin 8347 -> 0 bytes
 .../libs/System.Reactive.Interfaces.dll.mdb        |   Bin 112 -> 0 bytes
 .../android/libs/System.Reactive.Linq.dll.mdb      |   Bin 268498 -> 0 bytes
 .../libs/System.Reactive.PlatformServices.dll.mdb  |   Bin 8154 -> 0 bytes
 .../android/libs/System.Reactive.Providers.dll.mdb |   Bin 77332 -> 0 bytes
 .../libs/System.Reactive.Runtime.Remoting.dll.mdb  |   Bin 112 -> 0 bytes
 .../android_Mono.Reactive.Testing.csproj           |    42 +-
 .../android_System.Reactive.Core.csproj            |    33 +-
 .../android_System.Reactive.Debugger.csproj        |    55 +-
 .../android_System.Reactive.Experimental.csproj    |    41 +-
 .../android_System.Reactive.Interfaces.csproj      |    20 +-
 .../android_System.Reactive.Linq.csproj            |    40 +-
 ...android_System.Reactive.PlatformServices.csproj |    47 +-
 .../android_System.Reactive.Providers.csproj       |    47 +-
 ...android_System.Reactive.Runtime.Remoting.csproj |    34 +-
 .../android_Tests.System.Reactive.csproj           |    99 +-
 .../samples/GithubApiClientSample/MainActivity.cs  |     2 +-
 .../Properties/AssemblyInfo.cs                     |     2 +-
 .../Resources/Resource.designer.cs                 |     2 +-
 .../ReactiveAndroidSample.sln                      |    20 +
 .../ReactiveAndroidSample/Assets/AboutAssets.txt   |    19 +
 .../ReactiveAndroidSample/MainActivity.cs          |    47 +
 .../Properties/AssemblyInfo.cs                     |    28 +
 .../ReactiveAndroidSample.csproj                   |    73 +
 .../Resources/AboutResources.txt                   |    44 +
 .../Resources/Resource.designer.cs                 |   115 +
 .../Resources/drawable/Icon.png                    |   Bin 0 -> 2574 bytes
 .../Resources/layout/Main.axml                     |    16 +
 .../Resources/values/Strings.xml                   |     5 +
 .../iOS/Tests.System.Reactive/AppDelegate.cs       |     2 +-
 .../Rx_Xamarin/iOS/Tests.System.Reactive/Main.cs   |     2 +-
 .../NET/Source/Rx_Xamarin/iOS/ios_UnitTest/Main.cs |     2 +-
 .../iOS/ios_UnitTest/UnitTestAppDelegate.cs        |     2 +-
 .../ios_Mono.Reactive.Testing.csproj               |    51 +-
 .../ios_System.Reactive.Core.csproj                |   186 +-
 .../ios_System.Reactive.Debugger.csproj            |    36 +-
 .../ios_System.Reactive.Experimental.csproj        |    48 +-
 .../ios_System.Reactive.Interfaces.csproj          |    70 +-
 .../ios_System.Reactive.Linq.csproj                |   374 +-
 .../ios_System.Reactive.PlatformServices.csproj    |    72 +-
 .../ios_System.Reactive.Providers.csproj           |    58 +-
 .../ios_System.Reactive.Runtime.Remoting.csproj    |    34 +-
 .../ios_System.Reactive.Windows.Forms.csproj       |    34 +-
 .../ios_System.Reactive.Windows.Threading.csproj   |    48 +-
 .../ios_Tests.System.Reactive.csproj               |   217 +-
 .../System.Reactive.Core/InternalsVisibleTo.cs     |     7 +-
 .../Properties/AssemblyInfo.cs                     |    14 +-
 .../ConcurrencyAbstractionLayer.Default.cs         |   132 +-
 .../Concurrency/LocalScheduler.TimerQueue.cs       |    12 +-
 .../Concurrency/Synchronization.ObserveOn.cs       |     6 +-
 .../Reactive/Internal/ConcurrentDictionary.cs      |     2 +
 .../Internal/PlatformEnlightenmentProvider.cs      |     2 +-
 .../Reactive/Internal/Semaphore.Silverlight.cs     |     2 +-
 .../System.Reactive.Core/Strings_Core.Generated.cs |     2 +-
 .../System.Reactive.Core.csproj                    |    11 +
 .../Source/System.Reactive.Core/packages.config    |     4 +
 .../Properties/AssemblyInfo.cs                     |    14 +-
 .../System.Reactive.Debugger.csproj                |     2 +
 .../InternalsVisibleTo.cs                          |     4 +-
 .../Properties/AssemblyInfo.cs                     |    14 +-
 .../Reactive/Linq/QbservableEx.Generated.cs        |     5 +-
 .../System.Reactive.Experimental.csproj            |     2 +
 .../System.Reactive.Interfaces/IObservable.cs      |     5 +-
 .../Source/System.Reactive.Interfaces/IObserver.cs |     2 +
 .../Properties/AssemblyInfo.cs                     |    16 +-
 .../Reactive/Linq/IQbservable.cs                   |     2 +-
 .../Reactive/Linq/IQbservableProvider.cs           |     2 +-
 .../System.Reactive.Interfaces.csproj              |     2 +
 .../System.Reactive.Linq/GlobalSuppressions.cs     |   322 +-
 .../System.Reactive.Linq/InternalsVisibleTo.cs     |     6 +-
 .../Properties/AssemblyInfo.cs                     |    15 +-
 .../Reactive/Internal/Helpers.cs                   |     2 +-
 .../Reactive/Internal/ReflectionUtils.cs           |     8 +-
 .../Reactive/Linq/IQueryLanguage.cs                |    23 +-
 .../Reactive/Linq/Observable.Blocking.cs           |    14 +-
 .../Reactive/Linq/Observable.Concurrency.cs        |     2 +-
 .../Reactive/Linq/Observable.Creation.cs           |     6 +-
 .../Reactive/Linq/Observable.Imperative.cs         |     2 +-
 .../Reactive/Linq/Observable.Multiple.cs           |    13 +-
 .../Reactive/Linq/Observable.Single.cs             |     6 +-
 .../Linq/Observable.StandardSequenceOperators.cs   |   367 +-
 .../Reactive/Linq/Observable/AddRef.cs             |     2 +-
 .../Reactive/Linq/Observable/Aggregate.cs          |     2 +-
 .../Reactive/Linq/Observable/All.cs                |     2 +-
 .../Reactive/Linq/Observable/Amb.cs                |     2 +-
 .../Reactive/Linq/Observable/Any.cs                |     8 +-
 .../Reactive/Linq/Observable/AsObservable.cs       |     4 +-
 .../Reactive/Linq/Observable/Average.cs            |     2 +-
 .../Reactive/Linq/Observable/Buffer.cs             |    40 +-
 .../Reactive/Linq/Observable/Case.cs               |     2 +-
 .../Reactive/Linq/Observable/Cast.cs               |     4 +-
 .../Reactive/Linq/Observable/Catch.cs              |     8 +-
 .../Reactive/Linq/Observable/Collect.cs            |     2 +-
 .../Reactive/Linq/Observable/CombineLatest.cs      |     2 +-
 .../Reactive/Linq/Observable/Concat.cs             |     2 +-
 .../Reactive/Linq/Observable/Contains.cs           |     2 +-
 .../Reactive/Linq/Observable/Count.cs              |     8 +-
 .../Reactive/Linq/Observable/DefaultIfEmpty.cs     |     2 +-
 .../Reactive/Linq/Observable/Defer.cs              |     2 +-
 .../Reactive/Linq/Observable/Delay.cs              |    26 +-
 .../Reactive/Linq/Observable/DelaySubscription.cs  |     2 +-
 .../Reactive/Linq/Observable/Dematerialize.cs      |     2 +-
 .../Reactive/Linq/Observable/Distinct.cs           |     2 +-
 .../Linq/Observable/DistinctUntilChanged.cs        |     2 +-
 .../Reactive/Linq/Observable/Do.cs                 |     2 +-
 .../Reactive/Linq/Observable/DoWhile.cs            |     2 +-
 .../Reactive/Linq/Observable/ElementAt.cs          |     2 +-
 .../Reactive/Linq/Observable/Empty.cs              |     2 +-
 .../Reactive/Linq/Observable/Finally.cs            |     2 +-
 .../Reactive/Linq/Observable/FirstAsync.cs         |     8 +-
 .../Reactive/Linq/Observable/For.cs                |     2 +-
 .../Reactive/Linq/Observable/ForEach.cs            |     6 +-
 .../Reactive/Linq/Observable/FromEvent.cs          |     2 +-
 .../Reactive/Linq/Observable/FromEventPattern.cs   |    16 +-
 .../Reactive/Linq/Observable/Generate.cs           |    14 +-
 .../Reactive/Linq/Observable/GetEnumerator.cs      |     2 +-
 .../Reactive/Linq/Observable/GroupBy.cs            |    16 +-
 .../Reactive/Linq/Observable/GroupByUntil.cs       |    58 +-
 .../Reactive/Linq/Observable/GroupJoin.cs          |    30 +-
 .../Reactive/Linq/Observable/If.cs                 |     2 +-
 .../Reactive/Linq/Observable/IgnoreElements.cs     |     4 +-
 .../Reactive/Linq/Observable/IsEmpty.cs            |     2 +-
 .../Reactive/Linq/Observable/Join.cs               |    30 +-
 .../Reactive/Linq/Observable/LastAsync.cs          |     8 +-
 .../Reactive/Linq/Observable/Latest.cs             |     2 +-
 .../Reactive/Linq/Observable/LongCount.cs          |     8 +-
 .../Reactive/Linq/Observable/Materialize.cs        |     2 +-
 .../Reactive/Linq/Observable/Max.cs                |     8 +-
 .../Reactive/Linq/Observable/MaxBy.cs              |     2 +-
 .../Reactive/Linq/Observable/Merge.cs              |    28 +-
 .../Reactive/Linq/Observable/Min.cs                |     8 +-
 .../Reactive/Linq/Observable/MinBy.cs              |     2 +-
 .../Reactive/Linq/Observable/MostRecent.cs         |     2 +-
 .../Reactive/Linq/Observable/Multicast.cs          |     2 +-
 .../Reactive/Linq/Observable/Never.cs              |     2 +-
 .../Reactive/Linq/Observable/Next.cs               |     2 +-
 .../Reactive/Linq/Observable/ObserveOn.cs          |     8 +-
 .../Reactive/Linq/Observable/OfType.cs             |     2 +-
 .../Reactive/Linq/Observable/OnErrorResumeNext.cs  |     2 +-
 .../Reactive/Linq/Observable/PushToPullAdapter.cs  |     2 +-
 .../Reactive/Linq/Observable/Range.cs              |     2 +-
 .../Reactive/Linq/Observable/RefCount.cs           |     2 +-
 .../Reactive/Linq/Observable/Repeat.cs             |     2 +-
 .../Reactive/Linq/Observable/Return.cs             |     2 +-
 .../Reactive/Linq/Observable/Sample.cs             |     8 +-
 .../Reactive/Linq/Observable/Scan.cs               |     2 +-
 .../Reactive/Linq/Observable/Select.cs             |    12 +-
 .../Reactive/Linq/Observable/SelectMany.cs         |  1008 +-
 .../Reactive/Linq/Observable/SequenceEqual.cs      |     8 +-
 .../Reactive/Linq/Observable/SingleAsync.cs        |     8 +-
 .../Reactive/Linq/Observable/Skip.cs               |    12 +-
 .../Reactive/Linq/Observable/SkipLast.cs           |     8 +-
 .../Reactive/Linq/Observable/SkipUntil.cs          |     4 +-
 .../Reactive/Linq/Observable/SkipWhile.cs          |     8 +-
 .../Reactive/Linq/Observable/Sum.cs                |     2 +-
 .../Reactive/Linq/Observable/Switch.cs             |     8 +-
 .../Reactive/Linq/Observable/Synchronize.cs        |     2 +-
 .../Reactive/Linq/Observable/Take.cs               |    12 +-
 .../Reactive/Linq/Observable/TakeLast.cs           |     8 +-
 .../Reactive/Linq/Observable/TakeLastBuffer.cs     |     8 +-
 .../Reactive/Linq/Observable/TakeUntil.cs          |     4 +-
 .../Reactive/Linq/Observable/TakeWhile.cs          |     8 +-
 .../Reactive/Linq/Observable/Throttle.cs           |     8 +-
 .../Reactive/Linq/Observable/Throw.cs              |     2 +-
 .../Reactive/Linq/Observable/TimeInterval.cs       |     2 +-
 .../Reactive/Linq/Observable/Timeout.cs            |    20 +-
 .../Reactive/Linq/Observable/Timer.cs              |     8 +-
 .../Reactive/Linq/Observable/Timestamp.cs          |     2 +-
 .../Reactive/Linq/Observable/ToArray.cs            |     2 +-
 .../Reactive/Linq/Observable/ToDictionary.cs       |     2 +-
 .../Reactive/Linq/Observable/ToList.cs             |     2 +-
 .../Reactive/Linq/Observable/ToLookup.cs           |     2 +-
 .../Reactive/Linq/Observable/ToObservable.cs       |     2 +-
 .../Reactive/Linq/Observable/Using.cs              |     2 +-
 .../Reactive/Linq/Observable/Where.cs              |    10 +-
 .../Reactive/Linq/Observable/While.cs              |     2 +-
 .../Reactive/Linq/Observable/Window.cs             |    40 +-
 .../Reactive/Linq/Observable/Zip.cs                |     8 +-
 .../Reactive/Linq/Observable/_.cs                  |     2 +-
 .../Reactive/Linq/QueryLanguage.Aggregates.cs      |     2 +-
 .../Reactive/Linq/QueryLanguage.Binding.cs         |     2 +-
 .../Reactive/Linq/QueryLanguage.Blocking.cs        |     4 +-
 .../Reactive/Linq/QueryLanguage.Concurrency.cs     |     2 +-
 .../Reactive/Linq/QueryLanguage.Conversions.cs     |     2 +-
 .../Reactive/Linq/QueryLanguage.Creation.cs        |     2 +-
 .../Reactive/Linq/QueryLanguage.Events.cs          |    18 +-
 .../Reactive/Linq/QueryLanguage.Imperative.cs      |     2 +-
 .../Reactive/Linq/QueryLanguage.Multiple.cs        |     2 +-
 .../Reactive/Linq/QueryLanguage.Single.cs          |     6 +-
 .../QueryLanguage.StandardSequenceOperators.cs     |   212 +-
 .../Reactive/Linq/QueryLanguage.Time.cs            |    10 +-
 .../Reactive/Subjects/BehaviorSubject.cs           |    32 +
 .../System.Reactive.Linq/Strings_Linq.Generated.cs |     2 +-
 .../System.Reactive.Linq.csproj                    |     2 +
 .../Observable.Aliases.cs                          |   422 +
 .../Qbservable.Aliases.Generated.cs                |   449 +
 .../System.Reactive.Observable.Aliases.csproj      |    59 +
 .../Properties/AssemblyInfo.cs                     |    14 +-
 .../Concurrency/ConcurrencyAbstractionLayerImpl.cs |    52 +-
 .../Reactive/Concurrency/EventLoopScheduler.cs     |    10 +
 .../Reactive/Concurrency/TaskPoolScheduler.cs      |     8 +
 .../Internal/PlatformEnlightenmentProvider.cs      |     2 +-
 .../Strings_PlatformServices.Generated.cs          |     2 +-
 .../System.Reactive.PlatformServices.csproj        |     2 +
 .../Properties/AssemblyInfo.cs                     |    12 +-
 .../Reactive/Joins/QueryablePattern.cs             |     2 +-
 .../Reactive/Joins/QueryablePlan.cs                |     2 +-
 .../Reactive/Linq/Qbservable.Generated.cs          |   912 +-
 .../Reactive/ObservableQuery.cs                    |     8 +-
 .../Strings_Providers.Generated.cs                 |     2 +-
 .../System.Reactive.Providers.csproj               |     2 +
 .../Properties/AssemblyInfo.cs                     |    12 +-
 .../Properties/AssemblyInfo.cs                     |    12 +-
 .../Properties/AssemblyInfo.cs                     |    14 +-
 .../Properties/AssemblyInfo.cs                     |    12 +-
 .../System.Reactive.WindowsRuntime.csproj          |    52 +-
 .../Tests.System.Reactive/Dummies/DummyFunc.cs     |    10 +
 .../Properties/AssemblyInfo.cs                     |     5 -
 .../Stress/Core/Schedulers/EventLoop.cs            |    74 +
 .../Tests.System.Reactive.csproj                   |    10 +-
 .../Source/Tests.System.Reactive/Tests/Aliases.cs  |    37 +
 .../Tests/Concurrency/EventLoopSchedulerTest.cs    |    11 +
 .../DefaultConcurrencyAbstractionLayerTest.cs      |    78 +
 .../Tests/Linq/ObservableMultipleTest.cs           |     3 +
 .../Linq/ObservableStandardQueryOperatorTest.cs    | 15862 +++++++++++++------
 .../Tests/Linq/ObservableTimeTest.cs               |    42 +
 .../Tests/Linq/Subjects/BehaviorSubjectTest.cs     |    71 +
 external/rx/Rx/NET/Source/packages.config          |     6 +
 .../packages/Microsoft.Bcl.1.0.19/License.rtf      |   505 +
 .../Microsoft.Bcl.1.0.19.nupkg                     |   Bin 0 -> 882543 bytes
 .../Microsoft.Bcl.1.0.19.nuspec                    |    39 +
 .../packages/Microsoft.Bcl.1.0.19/ReleaseNotes.txt |    24 +
 .../Microsoft.Bcl.1.0.19/content/net45/_._         |     0
 .../content/portable-net45+win8+wp8/_._            |     0
 .../packages/Microsoft.Bcl.1.0.19/content/sl4/_._  |     0
 .../packages/Microsoft.Bcl.1.0.19/content/sl5/_._  |     0
 .../packages/Microsoft.Bcl.1.0.19/content/win8/_._ |     0
 .../packages/Microsoft.Bcl.1.0.19/content/wp8/_._  |     0
 .../lib/net40/System.Runtime.xml                   |    56 +
 .../lib/net40/System.Threading.Tasks.xml           |   475 +
 .../lib/net40/ensureRedirect.xml                   |     0
 .../packages/Microsoft.Bcl.1.0.19/lib/net45/_._    |     0
 .../System.Runtime.xml                             |   860 +
 .../System.Threading.Tasks.xml                     |  8969 +++++++++++
 .../ensureRedirect.xml                             |     0
 .../portable-net40+sl4+win8+wp8/System.Runtime.xml |    56 +
 .../System.Threading.Tasks.xml                     |  8969 +++++++++++
 .../portable-net40+sl4+win8+wp8/ensureRedirect.xml |     0
 .../lib/portable-net40+sl4+win8/System.Runtime.xml |    56 +
 .../System.Threading.Tasks.xml                     |  8969 +++++++++++
 .../lib/portable-net40+sl4+win8/ensureRedirect.xml |     0
 .../portable-net40+sl5+win8+wp8/System.Runtime.xml |    56 +
 .../System.Threading.Tasks.xml                     |   475 +
 .../portable-net40+sl5+win8+wp8/ensureRedirect.xml |     0
 .../lib/portable-net40+win8+wp8/System.Runtime.xml |    56 +
 .../System.Threading.Tasks.xml                     |   475 +
 .../lib/portable-net40+win8+wp8/ensureRedirect.xml |     0
 .../lib/portable-net40+win8/System.Runtime.xml     |    56 +
 .../portable-net40+win8/System.Threading.Tasks.xml |   475 +
 .../lib/portable-net40+win8/ensureRedirect.xml     |     0
 .../lib/portable-net45+win8+wp8/_._                |     0
 .../lib/sl4-windowsphone71/System.Runtime.xml      |   860 +
 .../sl4-windowsphone71/System.Threading.Tasks.xml  |  8969 +++++++++++
 .../lib/sl4-windowsphone71/ensureRedirect.xml      |     0
 .../lib/sl4/System.Runtime.xml                     |    56 +
 .../lib/sl4/System.Threading.Tasks.xml             |  8969 +++++++++++
 .../lib/sl5/System.Runtime.xml                     |    56 +
 .../lib/sl5/System.Threading.Tasks.xml             |   475 +
 .../packages/Microsoft.Bcl.1.0.19/lib/win8/_._     |     0
 .../packages/Microsoft.Bcl.1.0.19/lib/wp8/_._      |     0
 .../Microsoft.Bcl.Async.1.0.16/License.rtf         |   522 +
 .../Microsoft.Bcl.Async.1.0.16.nupkg               |   Bin 0 -> 504369 bytes
 .../Microsoft.Bcl.Async.1.0.16.nuspec              |    33 +
 .../Microsoft.Bcl.Async.1.0.16/ReleaseNotes.txt    |    18 +
 ...icrosoft.Threading.Tasks.Extensions.Desktop.xml |   684 +
 .../net40/Microsoft.Threading.Tasks.Extensions.xml |   275 +
 .../lib/net40/Microsoft.Threading.Tasks.xml        |   630 +
 .../net45/Microsoft.Threading.Tasks.Extensions.xml |   275 +
 .../lib/net45/Microsoft.Threading.Tasks.xml        |   630 +
 .../Microsoft.Threading.Tasks.Extensions.xml       |   275 +
 .../Microsoft.Threading.Tasks.xml                  |   630 +
 .../Microsoft.Threading.Tasks.Extensions.xml       |   275 +
 .../Microsoft.Threading.Tasks.xml                  |   630 +
 .../Microsoft.Threading.Tasks.Extensions.xml       |   275 +
 .../Microsoft.Threading.Tasks.xml                  |   630 +
 .../Microsoft.Threading.Tasks.Extensions.Phone.xml |   141 +
 .../Microsoft.Threading.Tasks.Extensions.xml       |   275 +
 .../Microsoft.Threading.Tasks.xml                  |   630 +
 ...soft.Threading.Tasks.Extensions.Silverlight.xml |   141 +
 .../sl4/Microsoft.Threading.Tasks.Extensions.xml   |   275 +
 .../lib/sl4/Microsoft.Threading.Tasks.xml          |   630 +
 .../win8/Microsoft.Threading.Tasks.Extensions.xml  |   275 +
 .../lib/win8/Microsoft.Threading.Tasks.xml         |   630 +
 .../Microsoft.Threading.Tasks.Extensions.Phone.xml |   141 +
 .../wp8/Microsoft.Threading.Tasks.Extensions.xml   |   275 +
 .../lib/wp8/Microsoft.Threading.Tasks.xml          |   630 +
 .../Microsoft.Bcl.Build.1.0.10/License-Stable.rtf  |   505 +
 .../Microsoft.Bcl.Build.1.0.10.nupkg               |   Bin 0 -> 46014 bytes
 .../Microsoft.Bcl.Build.1.0.10.nuspec              |    21 +
 .../Microsoft.Bcl.Build.1.0.10/content/net40/_._   |     0
 .../content/netcore45/_._                          |     0
 .../content/portable-net40+win8+sl4+wp71/_._       |     0
 .../content/sl4-windowsphone71/_._                 |     0
 .../Microsoft.Bcl.Build.1.0.10/content/sl4/_._     |     0
 .../Microsoft.Bcl.Build.1.0.10/tools/Install.ps1   |    37 +
 .../tools/Microsoft.Bcl.Build.targets              |   232 +
 .../Microsoft.Bcl.Build.1.0.10/tools/Uninstall.ps1 |    25 +
 .../packages/Microsoft.Bcl.Build.1.0.4/License.rtf |   505 +
 .../Microsoft.Bcl.Build.1.0.4.nupkg                |   Bin 0 -> 33316 bytes
 .../Microsoft.Bcl.Build.1.0.4.nuspec               |    19 +
 .../Microsoft.Bcl.Build.1.0.4/content/net40/_._    |     0
 .../content/netcore45/_._                          |     0
 .../content/portable-net40+win8+sl4+wp71/_._       |     0
 .../content/sl4-windowsphone71/_._                 |     0
 .../Microsoft.Bcl.Build.1.0.4/content/sl4/_._      |     0
 .../Microsoft.Bcl.Build.1.0.4/tools/Install.ps1    |    18 +
 .../tools/Microsoft.Bcl.Build.targets              |   227 +
 .../Microsoft.Bcl.Build.1.0.4/tools/Uninstall.ps1  |    13 +
 .../rx/Rx/NET/Source/packages/repositories.config  |     4 +
 .../ConsoleApp45_NoPlatformServices.csproj         |    30 +-
 .../Rx/ConsoleApp45_NoPlatformServices/Program.cs  |     2 +-
 .../Rx/NET/Test/Rx/ConsoleApp45_NuGet/App.config   |    16 -
 .../ConsoleApp45_NuGet/ConsoleApp45_NuGet.csproj   |    36 +-
 .../Rx/NET/Test/Rx/ConsoleApp45_NuGet/Program.cs   |     2 +-
 .../NET/Test/Rx/ConsoleApp45_NuGet/packages.config |    14 +-
 .../PortableLibraryProfile78_NuGet.csproj          |    18 +-
 .../PortableLibraryProfile78_NuGet/packages.config |    10 +-
 external/rx/Rx/NET/Test/Rx/Rx.sln                  |   271 -
 .../rx/Rx/NET/Test/Rx/SilverlightApp5/App.xaml     |     8 -
 .../rx/Rx/NET/Test/Rx/SilverlightApp5/App.xaml.cs  |    68 -
 .../Rx/NET/Test/Rx/SilverlightApp5/MainPage.xaml   |    14 -
 .../NET/Test/Rx/SilverlightApp5/MainPage.xaml.cs   |    51 -
 .../Rx/SilverlightApp5/Properties/AssemblyInfo.cs  |    35 -
 .../Test/Rx/SilverlightApp5/SilverlightApp5.csproj |   120 -
 .../Rx/SilverlightApp5_NoPlatformServices/App.xaml |     8 -
 .../SilverlightApp5_NoPlatformServices/App.xaml.cs |    68 -
 .../MainPage.xaml                                  |    14 -
 .../MainPage.xaml.cs                               |    51 -
 .../Properties/AppManifest.xml                     |     6 -
 .../Properties/AssemblyInfo.cs                     |    35 -
 .../SilverlightApp5_NoPlatformServices.csproj      |   119 -
 .../rx/Rx/NET/Test/Rx/WinFormsApp45/App.config     |     6 -
 .../Rx/NET/Test/Rx/WinFormsApp45/Form1.Designer.cs |    84 -
 external/rx/Rx/NET/Test/Rx/WinFormsApp45/Form1.cs  |    40 -
 .../rx/Rx/NET/Test/Rx/WinFormsApp45/Form1.resx     |   120 -
 .../rx/Rx/NET/Test/Rx/WinFormsApp45/Program.cs     |    22 -
 .../Rx/WinFormsApp45/Properties/AssemblyInfo.cs    |    36 -
 .../WinFormsApp45/Properties/Resources.Designer.cs |    71 -
 .../Rx/WinFormsApp45/Properties/Resources.resx     |   117 -
 .../WinFormsApp45/Properties/Settings.Designer.cs  |    30 -
 .../Rx/WinFormsApp45/Properties/Settings.settings  |     7 -
 .../NET/Test/Rx/WinFormsApp45/WinFormsApp45.csproj |   122 -
 .../rx/Rx/NET/Test/Rx/WinFormsApp45_NuGet/Form1.cs |     2 +-
 .../WinFormsApp45_NuGet/WinFormsApp45_NuGet.csproj |    26 +-
 .../Test/Rx/WinFormsApp45_NuGet/packages.config    |    12 +-
 .../WindowsPhoneAgent7/Properties/AssemblyInfo.cs  |    37 -
 .../Test/Rx/WindowsPhoneAgent7/ScheduledAgent.cs   |    64 -
 .../WindowsPhoneAgent7/WindowsPhoneAgent7.csproj   |    78 -
 .../WindowsPhoneAgent8/Properties/AssemblyInfo.cs  |    37 -
 .../Test/Rx/WindowsPhoneAgent8/ScheduledAgent.cs   |    52 -
 .../WindowsPhoneAgent8/WindowsPhoneAgent8.csproj   |   112 -
 .../rx/Rx/NET/Test/Rx/WindowsPhoneApp7/App.xaml    |    19 -
 .../rx/Rx/NET/Test/Rx/WindowsPhoneApp7/App.xaml.cs |   142 -
 .../Test/Rx/WindowsPhoneApp7/ApplicationIcon.png   |   Bin 1881 -> 0 bytes
 .../Rx/NET/Test/Rx/WindowsPhoneApp7/Background.png |   Bin 3521 -> 0 bytes
 .../Rx/NET/Test/Rx/WindowsPhoneApp7/MainPage.xaml  |    37 -
 .../NET/Test/Rx/WindowsPhoneApp7/MainPage.xaml.cs  |    55 -
 .../Rx/WindowsPhoneApp7/Properties/AppManifest.xml |     6 -
 .../Rx/WindowsPhoneApp7/Properties/AssemblyInfo.cs |    37 -
 .../WindowsPhoneApp7/Properties/WMAppManifest.xml  |    37 -
 .../Test/Rx/WindowsPhoneApp7/SplashScreenImage.jpg |   Bin 9417 -> 0 bytes
 .../Rx/WindowsPhoneApp7/WindowsPhoneApp7.csproj    |   119 -
 .../WindowsPhoneApp7_NoPlatformServices/App.xaml   |    19 -
 .../App.xaml.cs                                    |   142 -
 .../ApplicationIcon.png                            |   Bin 1881 -> 0 bytes
 .../Background.png                                 |   Bin 3521 -> 0 bytes
 .../MainPage.xaml                                  |    37 -
 .../MainPage.xaml.cs                               |    51 -
 .../Properties/AppManifest.xml                     |     6 -
 .../Properties/AssemblyInfo.cs                     |    37 -
 .../Properties/WMAppManifest.xml                   |    35 -
 .../SplashScreenImage.jpg                          |   Bin 9417 -> 0 bytes
 .../WindowsPhoneApp7_NoPlatformServices.csproj     |   112 -
 .../Rx/NET/Test/Rx/WindowsPhoneApp7_NuGet/App.xaml |    19 -
 .../NET/Test/Rx/WindowsPhoneApp7_NuGet/App.xaml.cs |   142 -
 .../Rx/WindowsPhoneApp7_NuGet/ApplicationIcon.png  |   Bin 1881 -> 0 bytes
 .../Test/Rx/WindowsPhoneApp7_NuGet/Background.png  |   Bin 3521 -> 0 bytes
 .../Test/Rx/WindowsPhoneApp7_NuGet/MainPage.xaml   |    37 -
 .../Rx/WindowsPhoneApp7_NuGet/MainPage.xaml.cs     |    54 -
 .../Properties/AppManifest.xml                     |     6 -
 .../Properties/AssemblyInfo.cs                     |    37 -
 .../Properties/WMAppManifest.xml                   |    37 -
 .../WindowsPhoneApp7_NuGet/SplashScreenImage.jpg   |   Bin 9417 -> 0 bytes
 .../WindowsPhoneApp7_NuGet.csproj                  |   132 -
 .../Test/Rx/WindowsPhoneApp7_NuGet/packages.config |    10 -
 .../rx/Rx/NET/Test/Rx/WindowsPhoneApp8/App.xaml    |    20 -
 .../rx/Rx/NET/Test/Rx/WindowsPhoneApp8/App.xaml.cs |   223 -
 .../Rx/WindowsPhoneApp8/Assets/AlignmentGrid.png   |   Bin 9042 -> 0 bytes
 .../Rx/WindowsPhoneApp8/Assets/ApplicationIcon.png |   Bin 3392 -> 0 bytes
 .../Assets/Tiles/FlipCycleTileLarge.png            |   Bin 9930 -> 0 bytes
 .../Assets/Tiles/FlipCycleTileMedium.png           |   Bin 9070 -> 0 bytes
 .../Assets/Tiles/FlipCycleTileSmall.png            |   Bin 3674 -> 0 bytes
 .../Assets/Tiles/IconicTileMediumLarge.png         |   Bin 4937 -> 0 bytes
 .../Assets/Tiles/IconicTileSmall.png               |   Bin 3724 -> 0 bytes
 .../Test/Rx/WindowsPhoneApp8/LocalizedStrings.cs   |    14 -
 .../Rx/NET/Test/Rx/WindowsPhoneApp8/MainPage.xaml  |    64 -
 .../NET/Test/Rx/WindowsPhoneApp8/MainPage.xaml.cs  |    64 -
 .../Rx/WindowsPhoneApp8/Properties/AppManifest.xml |     6 -
 .../Rx/WindowsPhoneApp8/Properties/AssemblyInfo.cs |    37 -
 .../WindowsPhoneApp8/Properties/WMAppManifest.xml  |    38 -
 .../Resources/AppResources.Designer.cs             |   127 -
 .../WindowsPhoneApp8/Resources/AppResources.resx   |   137 -
 .../Rx/WindowsPhoneApp8/WindowsPhoneApp8.csproj    |   179 -
 .../rx/Rx/NET/Test/Rx/WindowsStoreApp8/App.xaml    |    20 -
 .../rx/Rx/NET/Test/Rx/WindowsStoreApp8/App.xaml.cs |    90 -
 .../NET/Test/Rx/WindowsStoreApp8/Assets/Logo.png   |   Bin 801 -> 0 bytes
 .../Test/Rx/WindowsStoreApp8/Assets/SmallLogo.png  |   Bin 329 -> 0 bytes
 .../Rx/WindowsStoreApp8/Assets/SplashScreen.png    |   Bin 2146 -> 0 bytes
 .../Test/Rx/WindowsStoreApp8/Assets/StoreLogo.png  |   Bin 429 -> 0 bytes
 .../Rx/WindowsStoreApp8/Common/StandardStyles.xaml |  1829 ---
 .../Rx/NET/Test/Rx/WindowsStoreApp8/MainPage.xaml  |    15 -
 .../NET/Test/Rx/WindowsStoreApp8/MainPage.xaml.cs  |    63 -
 .../Test/Rx/WindowsStoreApp8/Package.appxmanifest  |    27 -
 .../Rx/WindowsStoreApp8/Properties/AssemblyInfo.cs |    29 -
 .../Rx/WindowsStoreApp8/WindowsStoreApp8.csproj    |   164 -
 .../WindowsStoreApp8_TemporaryKey.pfx              |   Bin 2512 -> 0 bytes
 .../Rx/WindowsStoreApp8_NuGet/MainPage.xaml.cs     |     2 +-
 .../Rx/WindowsStoreApp8_NuGet/Package.appxmanifest |    29 +-
 .../WindowsStoreApp8_NuGet.csproj                  |    50 +-
 .../WindowsStoreApp8_NuGet_TemporaryKey.pfx        |   Bin 2512 -> 2512 bytes
 .../NET/Test/Rx/WindowsStoreApp8_NuGet/app.config  |    19 -
 .../Test/Rx/WindowsStoreApp8_NuGet/packages.config |    16 +-
 external/rx/Rx/NET/Test/Rx/WpfApp45/App.config     |     6 -
 external/rx/Rx/NET/Test/Rx/WpfApp45/App.xaml       |     8 -
 external/rx/Rx/NET/Test/Rx/WpfApp45/App.xaml.cs    |    17 -
 .../rx/Rx/NET/Test/Rx/WpfApp45/MainWindow.xaml     |    10 -
 .../rx/Rx/NET/Test/Rx/WpfApp45/MainWindow.xaml.cs  |    48 -
 .../Test/Rx/WpfApp45/Properties/AssemblyInfo.cs    |    55 -
 .../Rx/WpfApp45/Properties/Resources.Designer.cs   |    71 -
 .../NET/Test/Rx/WpfApp45/Properties/Resources.resx |   117 -
 .../Rx/WpfApp45/Properties/Settings.Designer.cs    |    30 -
 .../Test/Rx/WpfApp45/Properties/Settings.settings  |     7 -
 .../rx/Rx/NET/Test/Rx/WpfApp45/WpfApp45.csproj     |   138 -
 .../rx/Rx/NET/Test/Rx/WpfApp45_NuGet/App.config    |    22 -
 .../NET/Test/Rx/WpfApp45_NuGet/MainWindow.xaml.cs  |     2 +-
 .../Test/Rx/WpfApp45_NuGet/WpfApp45_NuGet.csproj   |    39 +-
 .../Rx/NET/Test/Rx/WpfApp45_NuGet/packages.config  |    14 +-
 external/rx/Rx/NET/Test/Rx/WpfXbapApp45/App.xaml   |     8 -
 .../rx/Rx/NET/Test/Rx/WpfXbapApp45/App.xaml.cs     |    18 -
 external/rx/Rx/NET/Test/Rx/WpfXbapApp45/Page1.xaml |    14 -
 .../rx/Rx/NET/Test/Rx/WpfXbapApp45/Page1.xaml.cs   |    57 -
 .../Rx/WpfXbapApp45/Properties/AssemblyInfo.cs     |    55 -
 .../WpfXbapApp45/Properties/Resources.Designer.cs  |    62 -
 .../Test/Rx/WpfXbapApp45/Properties/Resources.resx |   117 -
 .../WpfXbapApp45/Properties/Settings.Designer.cs   |    30 -
 .../Rx/WpfXbapApp45/Properties/Settings.settings   |     7 -
 .../Test/Rx/WpfXbapApp45/Properties/app.manifest   |    26 -
 .../NET/Test/Rx/WpfXbapApp45/WpfXbapApp45.csproj   |   151 -
 .../Rx/WpfXbapApp45/WpfXbapApp45_TemporaryKey.pfx  |   Bin 1660 -> 0 bytes
 .../NET/Test/Rx/WpfXbapApp45_NuGet/Page1.xaml.cs   |     2 +-
 .../WpfXbapApp45_NuGet/WpfXbapApp45_NuGet.csproj   |    64 +-
 .../NET/Test/Rx/WpfXbapApp45_NuGet/packages.config |    13 +-
 .../Rx-Core.2.0.21030/Rx-Core.2.0.21030.nupkg      |   Bin 501008 -> 0 bytes
 .../Rx-Core.2.0.21030/Rx-Core.2.0.21030.nuspec     |    25 -
 .../lib/Net40/System.Reactive.Core.XML             |  2617 ---
 .../lib/Net45/System.Reactive.Core.XML             |  2873 ----
 .../System.Reactive.Core.XML                       |  2873 ----
 .../SL4-WindowsPhone71/System.Reactive.Core.XML    |  2516 ---
 .../lib/SL5/System.Reactive.Core.XML               |  2617 ---
 .../lib/WP8/System.Reactive.Core.XML               |  2873 ----
 .../lib/WinRT45/System.Reactive.Core.XML           |  2873 ----
 .../Rx-Interfaces.2.0.21030.nupkg                  |   Bin 122414 -> 0 bytes
 .../Rx-Interfaces.2.0.21030.nuspec                 |    21 -
 .../lib/Net40/System.Reactive.Interfaces.XML       |   336 -
 .../lib/Net45/System.Reactive.Interfaces.XML       |   336 -
 .../System.Reactive.Interfaces.XML                 |   336 -
 .../System.Reactive.Interfaces.XML                 |   336 -
 .../lib/SL5/System.Reactive.Interfaces.XML         |   368 -
 .../lib/WP8/System.Reactive.Interfaces.XML         |   336 -
 .../lib/WinRT45/System.Reactive.Interfaces.XML     |   336 -
 .../Rx-Linq.2.0.21030/Rx-Linq.2.0.21030.nupkg      |   Bin 1796359 -> 0 bytes
 .../Rx-Linq.2.0.21030/Rx-Linq.2.0.21030.nuspec     |    26 -
 .../lib/Net40/System.Reactive.Linq.XML             | 10411 ------------
 .../lib/Net45/System.Reactive.Linq.XML             | 10466 ------------
 .../System.Reactive.Linq.XML                       | 10466 ------------
 .../SL4-WindowsPhone71/System.Reactive.Linq.XML    |  7488 ---------
 .../lib/SL5/System.Reactive.Linq.XML               | 10411 ------------
 .../lib/WP8/System.Reactive.Linq.XML               | 10466 ------------
 .../lib/WinRT45/System.Reactive.Linq.XML           | 10466 ------------
 .../Rx-Main.2.0.21030/Rx-Main.2.0.21030.nupkg      |   Bin 2750 -> 0 bytes
 .../Rx-Main.2.0.21030/Rx-Main.2.0.21030.nuspec     |    24 -
 .../Rx-PlatformServices.2.0.21030.nupkg            |   Bin 151585 -> 0 bytes
 .../Rx-PlatformServices.2.0.21030.nuspec           |    26 -
 .../content/Portable-Net45+WinRT45+WP8/Readme.txt  |    16 -
 .../lib/Net40/System.Reactive.PlatformServices.XML |   378 -
 .../lib/Net45/System.Reactive.PlatformServices.XML |   378 -
 .../System.Reactive.PlatformServices.XML           |   311 -
 .../lib/SL5/System.Reactive.PlatformServices.XML   |   354 -
 .../lib/WP8/System.Reactive.PlatformServices.XML   |   378 -
 .../WinRT45/System.Reactive.PlatformServices.XML   |   376 -
 .../Rx-Providers.2.0.21030.nupkg                   |   Bin 739296 -> 0 bytes
 .../Rx-Providers.2.0.21030.nuspec                  |    25 -
 .../lib/Net40/System.Reactive.Providers.XML        |  9846 ------------
 .../lib/Net45/System.Reactive.Providers.XML        |  9846 ------------
 .../System.Reactive.Providers.XML                  |  9846 ------------
 .../System.Reactive.Providers.XML                  |  6806 --------
 .../lib/SL5/System.Reactive.Providers.XML          |  9846 ------------
 .../lib/WP8/System.Reactive.Providers.XML          |  9846 ------------
 .../lib/WinRT45/System.Reactive.Providers.XML      |  9846 ------------
 .../Rx-Remoting.2.0.21030.nupkg                    |   Bin 33541 -> 0 bytes
 .../Rx-Remoting.2.0.21030.nuspec                   |    21 -
 .../lib/Net40/System.Reactive.Runtime.Remoting.XML |    51 -
 .../lib/Net45/System.Reactive.Runtime.Remoting.XML |    51 -
 .../Rx-WinForms.2.0.21030.nupkg                    |   Bin 35309 -> 0 bytes
 .../Rx-WinForms.2.0.21030.nuspec                   |    24 -
 .../lib/Net40/System.Reactive.Windows.Forms.XML    |    90 -
 .../lib/Net45/System.Reactive.Windows.Forms.XML    |    90 -
 .../Rx-WinRT.2.0.21030/Rx-WinRT.2.0.21030.nupkg    |   Bin 27072 -> 0 bytes
 .../Rx-WinRT.2.0.21030/Rx-WinRT.2.0.21030.nuspec   |    21 -
 .../lib/WinRT45/System.Reactive.WindowsRuntime.XML |   312 -
 .../Rx-WindowStoreApps.2.0.21030.nupkg             |   Bin 21619 -> 0 bytes
 .../Rx-WindowStoreApps.2.0.21030.nuspec            |    22 -
 .../WinRT45/System.Reactive.Windows.Threading.XML  |   256 -
 .../Rx-XAML.2.0.21030/Rx-XAML.2.0.21030.nupkg      |   Bin 112304 -> 0 bytes
 .../Rx-XAML.2.0.21030/Rx-XAML.2.0.21030.nuspec     |    25 -
 .../Net40/System.Reactive.Windows.Threading.XML    |   196 -
 .../Net45/System.Reactive.Windows.Threading.XML    |   285 -
 .../System.Reactive.Windows.Threading.XML          |   196 -
 .../lib/SL5/System.Reactive.Windows.Threading.XML  |   196 -
 .../lib/WP8/System.Reactive.Windows.Threading.XML  |   196 -
 .../WinRT45/System.Reactive.Windows.Threading.XML  |   256 -
 .../rx/Rx/NET/Test/Rx/packages/repositories.config |     1 -
 external/rx/Rx/NET/tools/HomoIcon/HomoIcon.csproj  |    59 +
 external/rx/Rx/NET/tools/HomoIcon/HomoIcon.sln     |    28 +
 external/rx/Rx/NET/tools/HomoIcon/HomoIcon.vssscc  |    10 +
 external/rx/Rx/NET/tools/HomoIcon/Program.cs       |   974 ++
 .../NET/tools/HomoIcon/Properties/AssemblyInfo.cs  |    36 +
 external/rx/component/Details.md                   |    35 +
 external/rx/component/GettingStarted.md            |   108 +
 external/rx/component/License.md                   |    15 +
 external/rx/component/README                       |     7 +
 external/rx/component/build-package.sh             |    19 +
 external/rx/component/rx_128x128.png               |   Bin 0 -> 12929 bytes
 external/rx/xpkg/Details.md                        |    35 +
 external/rx/xpkg/GettingStarted.md                 |   108 +
 external/rx/xpkg/Makefile                          |    54 +
 external/rx/xpkg/ProjectReferences.png             |   Bin 0 -> 24455 bytes
 external/rx/xpkg/README                            |    12 +
 external/rx/xpkg/RxForXamarin_128x128.png          |   Bin 0 -> 12929 bytes
 external/rx/xpkg/build-package.sh                  |    27 +
 ikvm-native/Makefile.in                            |    46 +-
 install-sh                                         |    14 +-
 libgc/Makefile.in                                  |   140 +-
 libgc/aclocal.m4                                   |   434 +-
 libgc/config.guess                                 |   144 +-
 libgc/config.sub                                   |     3 +
 libgc/configure                                    |   265 +-
 libgc/darwin_stop_world.c                          |    17 -
 libgc/doc/Makefile.in                              |    13 +-
 libgc/include/Makefile.am                          |     2 -
 libgc/include/Makefile.in                          |    72 +-
 libgc/include/libgc-mono-debugger.h                |    27 -
 libgc/include/private/Makefile.in                  |    14 +-
 libgc/ltmain.sh                                    |    32 +-
 libgc/m4/Makefile.in                               |    14 +-
 libgc/m4/libtool.m4                                |    55 +-
 libgc/pthread_stop_world.c                         |    34 -
 libgc/pthread_support.c                            |    24 -
 ltmain.sh                                          |    32 +-
 m4/Makefile.in                                     |    14 +-
 m4/libtool.m4                                      |    55 +-
 man/Makefile.in                                    |    18 +-
 man/mono.1                                         |     6 +
 mcs/Makefile                                       |     4 +-
 mcs/build/Makefile                                 |     3 +-
 mcs/build/common/Consts.cs                         |     3 +-
 mcs/build/common/Consts.cs.in                      |     1 +
 mcs/build/profiles/net_2_0.make                    |     1 +
 mcs/build/profiles/net_3_5.make                    |     1 +
 mcs/build/profiles/net_4_0.make                    |     1 +
 mcs/build/profiles/net_4_5.make                    |     1 +
 mcs/build/profiles/xbuild_12.make                  |     7 +
 mcs/class/Facades/Makefile                         |    35 +-
 .../System.Collections.Concurrent/AssemblyInfo.cs  |    23 +-
 .../Facades/System.Collections.Concurrent/Makefile |    13 +-
 .../System.Collections.Concurrent.dll.sources      |     4 +-
 .../TypeForwarders.cs                              |    20 +-
 .../Facades/System.Collections/AssemblyInfo.cs     |    23 +-
 mcs/class/Facades/System.Collections/Makefile      |    13 +-
 .../System.Collections.dll.sources                 |     4 +-
 .../Facades/System.Collections/TypeForwarders.cs   |    24 +-
 .../AssemblyInfo.cs                                |    23 +-
 .../System.ComponentModel.Annotations/Makefile     |    13 +-
 .../System.ComponentModel.Annotations.dll.sources  |     4 +-
 .../TypeForwarders.cs                              |    20 +-
 .../AssemblyInfo.cs                                |    23 +-
 .../System.ComponentModel.EventBasedAsync/Makefile |    13 +-
 ...stem.ComponentModel.EventBasedAsync.dll.sources |     4 +-
 .../TypeForwarders.cs                              |    14 +-
 .../Facades/System.ComponentModel/AssemblyInfo.cs  |    23 +-
 mcs/class/Facades/System.ComponentModel/Makefile   |    13 +-
 .../System.ComponentModel.dll.sources              |     4 +-
 .../System.ComponentModel/TypeForwarders.cs        |    14 +-
 .../System.Diagnostics.Contracts/AssemblyInfo.cs   |    23 +-
 .../Facades/System.Diagnostics.Contracts/Makefile  |    13 +-
 .../System.Diagnostics.Contracts.dll.sources       |     4 +-
 .../System.Diagnostics.Contracts/TypeForwarders.cs |    22 +-
 .../System.Diagnostics.Debug/AssemblyInfo.cs       |    23 +-
 .../Facades/System.Diagnostics.Debug/Makefile      |    13 +-
 .../System.Diagnostics.Debug.dll.sources           |     4 +-
 .../System.Diagnostics.Debug/TypeForwarders.cs     |    14 +-
 .../System.Diagnostics.Tools/AssemblyInfo.cs       |    23 +-
 .../Facades/System.Diagnostics.Tools/Makefile      |    13 +-
 .../System.Diagnostics.Tools.dll.sources           |     4 +-
 .../System.Diagnostics.Tools/TypeForwarders.cs     |    14 +-
 .../Facades/System.Dynamic.Runtime/AssemblyInfo.cs |    23 +-
 mcs/class/Facades/System.Dynamic.Runtime/Makefile  |    13 +-
 .../System.Dynamic.Runtime.dll.sources             |     4 +-
 .../System.Dynamic.Runtime/TypeForwarders.cs       |    41 +-
 .../Facades/System.Globalization/AssemblyInfo.cs   |    23 +-
 mcs/class/Facades/System.Globalization/Makefile    |    13 +-
 .../System.Globalization.dll.sources               |     4 +-
 .../Facades/System.Globalization/TypeForwarders.cs |    16 +-
 mcs/class/Facades/System.IO/AssemblyInfo.cs        |    23 +-
 mcs/class/Facades/System.IO/Makefile               |    13 +-
 mcs/class/Facades/System.IO/System.IO.dll.sources  |     4 +-
 mcs/class/Facades/System.IO/TypeForwarders.cs      |    24 +-
 .../System.Linq.Expressions/AssemblyInfo.cs        |    23 +-
 mcs/class/Facades/System.Linq.Expressions/Makefile |    13 +-
 .../System.Linq.Expressions.dll.sources            |     4 +-
 .../System.Linq.Expressions/TypeForwarders.cs      |    62 +-
 .../Facades/System.Linq.Parallel/AssemblyInfo.cs   |    23 +-
 mcs/class/Facades/System.Linq.Parallel/Makefile    |    13 +-
 .../System.Linq.Parallel.dll.sources               |     4 +-
 .../Facades/System.Linq.Parallel/TypeForwarders.cs |    18 +-
 .../Facades/System.Linq.Queryable/AssemblyInfo.cs  |    23 +-
 mcs/class/Facades/System.Linq.Queryable/Makefile   |    13 +-
 .../System.Linq.Queryable.dll.sources              |     4 +-
 .../System.Linq.Queryable/TypeForwarders.cs        |    14 +-
 mcs/class/Facades/System.Linq/AssemblyInfo.cs      |    23 +-
 mcs/class/Facades/System.Linq/Makefile             |    13 +-
 .../Facades/System.Linq/System.Linq.dll.sources    |     4 +-
 mcs/class/Facades/System.Linq/TypeForwarders.cs    |    14 +-
 .../System.Net.NetworkInformation/AssemblyInfo.cs  |    23 +-
 .../Facades/System.Net.NetworkInformation/Makefile |    13 +-
 .../System.Net.NetworkInformation.dll.sources      |     4 +-
 .../TypeForwarders.cs                              |    14 +-
 .../Facades/System.Net.Primitives/AssemblyInfo.cs  |    23 +-
 mcs/class/Facades/System.Net.Primitives/Makefile   |    13 +-
 .../System.Net.Primitives.dll.sources              |     4 +-
 .../System.Net.Primitives/TypeForwarders.cs        |    22 +-
 .../Facades/System.Net.Requests/AssemblyInfo.cs    |    23 +-
 mcs/class/Facades/System.Net.Requests/Makefile     |    13 +-
 .../System.Net.Requests.dll.sources                |     4 +-
 .../Facades/System.Net.Requests/TypeForwarders.cs  |    18 +-
 .../Facades/System.ObjectModel/AssemblyInfo.cs     |    23 +-
 mcs/class/Facades/System.ObjectModel/Makefile      |    13 +-
 .../System.ObjectModel.dll.sources                 |     4 +-
 .../Facades/System.ObjectModel/TypeForwarders.cs   |    27 +-
 .../AssemblyInfo.cs                                |    41 +
 .../System.Reflection.Emit.ILGeneration/Makefile   |    22 +
 ...System.Reflection.Emit.ILGeneration.dll.sources |     3 +
 .../TypeForwarders.cs                              |    29 +
 .../AssemblyInfo.cs                                |    41 +
 .../System.Reflection.Emit.Lightweight/Makefile    |    22 +
 .../System.Reflection.Emit.Lightweight.dll.sources |     3 +
 .../TypeForwarders.cs                              |    24 +
 .../Facades/System.Reflection.Emit/AssemblyInfo.cs |    41 +
 mcs/class/Facades/System.Reflection.Emit/Makefile  |    22 +
 .../System.Reflection.Emit.dll.sources             |     3 +
 .../System.Reflection.Emit/TypeForwarders.cs       |    34 +
 .../System.Reflection.Extensions/AssemblyInfo.cs   |    23 +-
 .../Facades/System.Reflection.Extensions/Makefile  |    13 +-
 .../System.Reflection.Extensions.dll.sources       |     4 +-
 .../System.Reflection.Extensions/TypeForwarders.cs |    14 +-
 .../System.Reflection.Primitives/AssemblyInfo.cs   |    23 +-
 .../Facades/System.Reflection.Primitives/Makefile  |    13 +-
 .../System.Reflection.Primitives.dll.sources       |     4 +-
 .../System.Reflection.Primitives/TypeForwarders.cs |    25 +-
 .../Facades/System.Reflection/AssemblyInfo.cs      |    23 +-
 mcs/class/Facades/System.Reflection/Makefile       |    13 +-
 .../System.Reflection.dll.sources                  |     4 +-
 .../Facades/System.Reflection/TypeForwarders.cs    |    38 +-
 .../AssemblyInfo.cs                                |    23 +-
 .../System.Resources.ResourceManager/Makefile      |    13 +-
 .../System.Resources.ResourceManager.dll.sources   |     4 +-
 .../TypeForwarders.cs                              |    14 +-
 .../System.Runtime.Extensions/AssemblyInfo.cs      |    23 +-
 .../Facades/System.Runtime.Extensions/Makefile     |    13 +-
 .../System.Runtime.Extensions.dll.sources          |     4 +-
 .../System.Runtime.Extensions/TypeForwarders.cs    |    26 +-
 .../AssemblyInfo.cs                                |    41 +
 .../Makefile                                       |    22 +
 ...time.InteropServices.WindowsRuntime.dll.sources |     3 +
 .../TypeForwarders.cs                              |    30 +
 .../System.Runtime.InteropServices/AssemblyInfo.cs |    23 +-
 .../System.Runtime.InteropServices/Makefile        |    13 +-
 .../System.Runtime.InteropServices.dll.sources     |     4 +-
 .../TypeForwarders.cs                              |    29 +-
 .../System.Runtime.Numerics/AssemblyInfo.cs        |    23 +-
 mcs/class/Facades/System.Runtime.Numerics/Makefile |    13 +-
 .../System.Runtime.Numerics.dll.sources            |     4 +-
 .../System.Runtime.Numerics/TypeForwarders.cs      |    14 +-
 .../AssemblyInfo.cs                                |    23 +-
 .../System.Runtime.Serialization.Json/Makefile     |    13 +-
 .../System.Runtime.Serialization.Json.dll.sources  |     4 +-
 .../TypeForwarders.cs                              |    16 +-
 .../AssemblyInfo.cs                                |    23 +-
 .../Makefile                                       |    13 +-
 ...em.Runtime.Serialization.Primitives.dll.sources |     4 +-
 .../TypeForwarders.cs                              |    14 +-
 .../AssemblyInfo.cs                                |    23 +-
 .../System.Runtime.Serialization.Xml/Makefile      |    13 +-
 .../System.Runtime.Serialization.Xml.dll.sources   |     4 +-
 .../TypeForwarders.cs                              |    24 +-
 mcs/class/Facades/System.Runtime/AssemblyInfo.cs   |    23 +-
 mcs/class/Facades/System.Runtime/Makefile          |    13 +-
 .../System.Runtime/System.Runtime.dll.sources      |     4 +-
 mcs/class/Facades/System.Runtime/TypeForwarders.cs |   312 +-
 .../System.Security.Principal/AssemblyInfo.cs      |    23 +-
 .../Facades/System.Security.Principal/Makefile     |    13 +-
 .../System.Security.Principal.dll.sources          |     4 +-
 .../System.Security.Principal/TypeForwarders.cs    |    14 +-
 .../System.ServiceModel.Http/AssemblyInfo.cs       |    23 +-
 .../Facades/System.ServiceModel.Http/Makefile      |    13 +-
 .../System.ServiceModel.Http.dll.sources           |     4 +-
 .../System.ServiceModel.Http/TypeForwarders.cs     |    21 +-
 .../System.ServiceModel.Primitives/AssemblyInfo.cs |    23 +-
 .../System.ServiceModel.Primitives/Makefile        |    13 +-
 .../System.ServiceModel.Primitives.dll.sources     |     4 +-
 .../TypeForwarders.cs                              |   172 +-
 .../AssemblyInfo.cs                                |    23 +-
 .../System.Text.Encoding.Extensions/Makefile       |    13 +-
 .../System.Text.Encoding.Extensions.dll.sources    |     4 +-
 .../TypeForwarders.cs                              |    14 +-
 .../Facades/System.Text.Encoding/AssemblyInfo.cs   |    23 +-
 mcs/class/Facades/System.Text.Encoding/Makefile    |    13 +-
 .../System.Text.Encoding.dll.sources               |     4 +-
 .../Facades/System.Text.Encoding/TypeForwarders.cs |    14 +-
 .../System.Text.RegularExpressions/AssemblyInfo.cs |    23 +-
 .../System.Text.RegularExpressions/Makefile        |    13 +-
 .../System.Text.RegularExpressions.dll.sources     |     4 +-
 .../TypeForwarders.cs                              |    16 +-
 .../AssemblyInfo.cs                                |    23 +-
 .../System.Threading.Tasks.Parallel/Makefile       |    13 +-
 .../System.Threading.Tasks.Parallel.dll.sources    |     4 +-
 .../TypeForwarders.cs                              |    14 +-
 .../Facades/System.Threading.Tasks/AssemblyInfo.cs |    23 +-
 mcs/class/Facades/System.Threading.Tasks/Makefile  |    13 +-
 .../System.Threading.Tasks.dll.sources             |     4 +-
 .../System.Threading.Tasks/TypeForwarders.cs       |    40 +-
 mcs/class/Facades/System.Threading/AssemblyInfo.cs |    23 +-
 mcs/class/Facades/System.Threading/Makefile        |    13 +-
 .../System.Threading/System.Threading.dll.sources  |     4 +-
 .../Facades/System.Threading/TypeForwarders.cs     |    38 +-
 .../System.Xml.ReaderWriter/AssemblyInfo.cs        |    23 +-
 mcs/class/Facades/System.Xml.ReaderWriter/Makefile |    13 +-
 .../System.Xml.ReaderWriter.dll.sources            |     4 +-
 .../System.Xml.ReaderWriter/TypeForwarders.cs      |    20 +-
 .../Facades/System.Xml.XDocument/AssemblyInfo.cs   |    23 +-
 mcs/class/Facades/System.Xml.XDocument/Makefile    |    13 +-
 .../System.Xml.XDocument.dll.sources               |     4 +-
 .../Facades/System.Xml.XDocument/TypeForwarders.cs |    20 +-
 .../System.Xml.XmlSerializer/AssemblyInfo.cs       |    23 +-
 .../Facades/System.Xml.XmlSerializer/Makefile      |    13 +-
 .../System.Xml.XmlSerializer.dll.sources           |     4 +-
 .../System.Xml.XmlSerializer/TypeForwarders.cs     |    34 +-
 mcs/class/I18N/CJK/ISO2022JP.cs                    |     4 +-
 mcs/class/I18N/CJK/Test/I18N.CJK.Test.cs           |     8 +
 mcs/class/Makefile                                 |    49 +-
 .../System.Windows.Forms/Hwnd.cs                   |     2 +
 .../System.Windows.Forms/MenuStrip.cs              |     2 +
 .../System.Windows.Forms/ToolStrip.cs              |    13 +-
 .../System.Windows.Forms/ToolStripMenuItem.cs      |     5 +-
 .../System.Windows.Forms/XplatUIX11.cs             |    42 +-
 .../Assembly/AssemblyInfo.cs                       |     8 +-
 mcs/class/Microsoft.Build.Engine/Makefile          |    60 +-
 .../Microsoft.Build.BuildEngine/BuildItem.cs       |    14 +-
 .../Microsoft.Build.BuildEngine/BuildProperty.cs   |     9 +
 .../BuildPropertyGroup.cs                          |    20 +-
 .../BuildTaskPropertyGroup.cs                      |     7 +-
 .../Microsoft.Build.BuildEngine/ColorResetter.cs   |     7 +-
 .../Microsoft.Build.BuildEngine/ColorSetter.cs     |     7 +-
 .../ConditionFactorExpresion.cs                    |     5 +
 .../Microsoft.Build.BuildEngine/ConsoleLogger.cs   |  1140 +-
 .../DirectoryScanner.cs                            |     5 +-
 .../Microsoft.Build.BuildEngine/Engine.cs          |     3 +
 .../Microsoft.Build.BuildEngine/FileLogger.cs      |     7 +-
 .../Microsoft.Build.BuildEngine/Import.cs          |    19 +-
 .../Microsoft.Build.BuildEngine/Project.cs         |    45 +-
 .../Microsoft.Build.BuildEngine/Target.cs          |    23 +-
 .../Microsoft.Build.BuildEngine/Toolset.cs         |     2 +-
 .../Microsoft.Build.BuildEngine/WriteHandler.cs    |     7 +-
 .../Microsoft.Build.Engine.dll.sources             |     1 +
 .../Microsoft.Build.BuildEngine/BuildItemTest.cs   |    34 +
 .../Test/Microsoft.Build.BuildEngine/Consts.cs     |    44 +-
 .../Test/Microsoft.Build.BuildEngine/TargetTest.cs |    84 +-
 .../Test/resources/TestReturns.csproj              |    13 +
 .../Test/test-config-file-net-3.5                  |    15 -
 .../Test/test-config-file-net-4.0                  |    15 -
 .../Assembly/AssemblyInfo.cs                       |     8 +-
 mcs/class/Microsoft.Build.Framework/Makefile       |    19 +-
 .../Microsoft.Build.Framework.dll.sources          |    13 +
 .../Microsoft.Build.Framework/BuildEngineResult.cs |    25 +
 .../Microsoft.Build.Framework/BuildEventArgs.cs    |    23 +-
 .../Microsoft.Build.Framework/BuildEventContext.cs |    94 +
 .../BuildFinishedEventArgs.cs                      |    22 +-
 .../BuildStartedEventArgs.cs                       |    27 +-
 .../BuildStatusEventArgs.cs                        |    21 +-
 .../Microsoft.Build.Framework/IBuildEngine3.cs     |    22 +
 .../Microsoft.Build.Framework/IBuildEngine4.cs     |    15 +
 .../Microsoft.Build.Framework/IEventRedirector.cs  |    10 +
 .../Microsoft.Build.Framework/IForwardingLogger.cs |    15 +
 .../Microsoft.Build.Framework/ITaskFactory.cs      |    16 +
 .../Microsoft.Build.Framework/ITaskFactory2.cs     |    12 +
 .../LazyFormattedBuildEventArgs.cs                 |    55 +
 .../RegisteredTaskObjectLifetime.cs                |    11 +
 .../Microsoft.Build.Framework/TaskPropertyInfo.cs  |    23 +
 .../Microsoft.Build.Framework_test.dll.sources     |     1 +
 .../BuildEventContextTest.cs                       |    29 +
 .../Microsoft.Build.Tasks/Assembly/AssemblyInfo.cs |     8 +-
 mcs/class/Microsoft.Build.Tasks/Makefile           |    64 +-
 .../Microsoft.Build.Tasks.dll.sources              |     3 +-
 .../Microsoft.Build.Tasks/GenerateResource.cs      |     2 +-
 .../Microsoft.Build.Tasks/LibraryPcFileCache.cs    |   321 -
 .../Microsoft.Build.Tasks/PcFileCache.cs           |   646 -
 .../ResolveAssemblyReference.cs                    |     2 +-
 .../Test/Microsoft.Build.Tasks/TaskBatchingTest.cs |     6 +-
 .../Microsoft.Build.Tasks/TestMessageLogger.cs     |    12 +
 .../Assembly/AssemblyInfo.cs                       |     8 +-
 mcs/class/Microsoft.Build.Utilities/Makefile       |    23 +-
 .../Microsoft.Build.Utilities.dll.sources          |     1 +
 .../Microsoft.Build.Utilities/ProcessService.cs    |     1 +
 .../TargetDotNetFrameworkVersion.cs                |    14 +-
 .../Microsoft.Build.Utilities/TaskItem.cs          |    12 +-
 .../ToolLocationHelper.cs                          |    61 +-
 .../Microsoft.Build.Utilities/ToolTask.cs          |    19 +-
 .../Microsoft.Build.Utilities_test.dll.sources     |     1 +
 .../Mono.XBuild.Utilities/ReservedNameUtils.cs     |     3 +-
 .../Test/Microsoft.Build.Utilities/TaskItemTest.cs |    59 +
 .../Test/Microsoft.Build.Utilities/ToolTaskTest.cs |   141 +
 mcs/class/Microsoft.Build/Assembly/AssemblyInfo.cs |     8 +-
 mcs/class/Microsoft.Build/Makefile                 |    28 +-
 .../ElementLocation.cs                             |    25 +-
 .../ProjectChooseElement.cs                        |     4 +-
 .../ProjectCommentElement.cs                       |     1 +
 .../Microsoft.Build.Construction/ProjectElement.cs |    53 +-
 .../ProjectElementContainer.cs                     |    19 +-
 .../ProjectExtensionsElement.cs                    |     1 +
 .../ProjectImportElement.cs                        |    10 +
 .../ProjectImportGroupElement.cs                   |     3 +-
 .../ProjectItemDefinitionElement.cs                |     5 +-
 .../ProjectItemDefinitionGroupElement.cs           |     5 +-
 .../ProjectItemElement.cs                          |    49 +-
 .../ProjectItemGroupElement.cs                     |     7 +-
 .../ProjectOnErrorElement.cs                       |     5 +
 .../ProjectOtherwiseElement.cs                     |     7 +-
 .../ProjectOutputElement.cs                        |     7 +
 .../ProjectPropertyGroupElement.cs                 |    10 +-
 .../ProjectRootElement.cs                          |    24 +-
 .../ProjectTargetElement.cs                        |    29 +-
 .../ProjectTaskElement.cs                          |    27 +-
 .../ProjectUsingTaskBodyElement.cs                 |     1 -
 .../ProjectUsingTaskElement.cs                     |     7 +-
 .../ProjectWhenElement.cs                          |     7 +-
 .../UsingTaskParameterGroupElement.cs              |     5 +-
 .../Microsoft.Build.Evaluation/Project.cs          |  1012 +-
 .../ProjectChangedEventArgs.cs                     |    42 +
 .../ProjectCollection.cs                           |   514 +-
 .../ProjectCollectionChangedEventArgs.cs           |    16 +
 .../ProjectCollectionChangedState.cs               |    19 +
 .../Microsoft.Build.Evaluation/ProjectItem.cs      |   201 +-
 .../ProjectItemDefinition.cs                       |    47 +-
 .../Microsoft.Build.Evaluation/ProjectMetadata.cs  |    80 +-
 .../Microsoft.Build.Evaluation/ProjectProperty.cs  |   254 +-
 .../ProjectXmlChangedEventArgs.cs                  |    45 +
 .../Microsoft.Build.Evaluation/ResolvedImport.cs   |    37 +-
 .../Microsoft.Build.Evaluation/SubToolset.cs       |    22 +
 .../Microsoft.Build.Evaluation/Toolset.cs          |    76 +-
 .../BuildAbortedException.cs                       |    43 +
 .../InternalLoggerException.cs                     |    57 +
 .../InvalidProjectFileException.cs                 |    32 +-
 .../InvalidToolsetDefinitionException.cs           |    42 +
 .../Microsoft.Build.Execution/BuildManager.cs      |   176 +-
 .../Microsoft.Build.Execution/BuildParameters.cs   |   239 +-
 .../Microsoft.Build.Execution/BuildRequestData.cs  |    92 +-
 .../Microsoft.Build.Execution/BuildResult.cs       |   126 +-
 .../Microsoft.Build.Execution/BuildSubmission.cs   |    96 +-
 .../BuildSubmissionCompleteCallback.cs             |     5 +
 .../Microsoft.Build.Execution/HostServices.cs      |   109 +-
 .../NodeEngineShutdownReason.cs                    |    47 +
 .../Microsoft.Build.Execution/OutOfProcNode.cs     |    48 +
 .../Microsoft.Build.Execution/ProjectInstance.cs   |   308 +-
 .../ProjectItemDefinitionInstance.cs               |    30 +-
 .../ProjectItemGroupTaskInstance.cs                |    82 +
 .../ProjectItemGroupTaskItemInstance.cs            |    95 +
 .../ProjectItemGroupTaskMetadataInstance.cs        |    58 +
 .../ProjectItemInstance.cs                         |   324 +-
 .../ProjectMetadataInstance.cs                     |    30 +-
 .../ProjectOnErrorInstance.cs                      |    82 +
 .../ProjectPropertyGroupTaskInstance.cs            |    82 +
 .../ProjectPropertyGroupTaskPropertyInstance.cs    |    61 +
 .../ProjectPropertyInstance.cs                     |    39 +-
 .../ProjectTargetInstance.cs                       |    85 +-
 .../ProjectTargetInstanceChild.cs                  |    52 +
 .../ProjectTaskInstance.cs                         |   108 +
 .../ProjectTaskInstanceChild.cs                    |    16 +
 .../ProjectTaskOutputItemInstance.cs               |    42 +
 .../ProjectTaskOutputPropertyInstance.cs           |    43 +
 .../Microsoft.Build.Execution/TargetResult.cs      |    44 +-
 .../Microsoft.Build.Internal/BuildEngine4.cs       |   634 +
 .../Microsoft.Build.Internal/BuildNodeManager.cs   |   209 +
 .../Microsoft.Build.Internal/BuildTaskDatabase.cs  |   138 +
 .../Microsoft.Build.Internal/BuildTaskFactory.cs   |    81 +
 .../ExpressionConstructs.cs                        |   197 +
 .../ExpressionEvaluator.cs                         |   521 +
 .../Microsoft.Build.Internal/ExpressionParser.jay  |   264 +
 .../ExpressionParserManual.cs                      |   271 +
 .../ExpressionTokenizer.cs                         |   309 +
 .../Microsoft.Build.Internal/ProjectTaskItem.cs    |    92 +
 .../WindowsCompatibilityExtensions.cs              |    41 +
 .../Microsoft.Build.Logging/ColorResetter.cs       |    32 -
 .../Microsoft.Build.Logging/ColorSetter.cs         |    32 -
 .../ConfigurableForwardingLogger.cs                |    43 +
 .../Microsoft.Build.Logging/ConsoleLogger.cs       |    89 -
 .../Microsoft.Build.Logging/FileLogger.cs          |    36 -
 .../Microsoft.Build.Logging/LoggerDescription.cs   |    39 +-
 .../Microsoft.Build.Logging/WriteHandler.cs        |    32 -
 .../Microsoft.Build/Microsoft.Build.dll.sources    |    51 +-
 .../Microsoft.Build_test.dll.sources               |    19 +
 .../ProjectItemElementTest.cs                      |    42 +
 .../ProjectRootElementTest.cs                      |   222 +
 .../ProjectCollectionTest.cs                       |   150 +
 .../ProjectItemDefinitionTest.cs                   |   104 +
 .../Microsoft.Build.Evaluation/ProjectItemTest.cs  |   212 +
 .../ProjectPropertyTest.cs                         |   130 +
 .../Test/Microsoft.Build.Evaluation/ProjectTest.cs |   253 +
 .../ResolvedImportTest.cs                          |   181 +
 .../Test/Microsoft.Build.Evaluation/ToolsetTest.cs |    53 +
 .../Microsoft.Build.Execution/BuildManagerTest.cs  |   201 +
 .../BuildParametersTest.cs                         |    66 +
 .../BuildSubmissionTest.cs                         |   115 +
 .../ProjectInstanceTest.cs                         |   103 +
 .../ProjectMetadataInstanceTest.cs                 |    78 +
 .../ProjectTargetInstanceTest.cs                   |   172 +
 .../ExpressionParserTest.cs                        |   287 +
 .../Microsoft.Build.Logging/ConsoleLoggerTest.cs   |   102 +
 .../LoggerDescriptionTest.cs                       |    49 +
 .../Mono.CSharp/Test/Evaluator/ExpressionsTest.cs  |    16 +
 .../Mono.Data.Sqlite/Assembly/AssemblyInfo.cs      |     5 +
 .../Mono.Debugger.Soft/Connection.cs               |    39 +-
 .../Mono.Debugger.Soft/ExceptionEventRequest.cs    |    17 +-
 .../Mono.Debugger.Soft/ObjectMirror.cs             |    20 +
 .../Mono.Debugger.Soft/StepEventRequest.cs         |     4 +
 .../Mono.Debugger.Soft/StructMirror.cs             |    14 +
 .../Mono.Debugger.Soft/TypeMirror.cs               |    58 +-
 .../Mono.Debugger.Soft/VMDeathEvent.cs             |    13 +-
 .../Mono.Debugger.Soft/VirtualMachine.cs           |    18 +-
 .../Mono.Debugger.Soft/VirtualMachineManager.cs    |     3 +-
 mcs/class/Mono.Debugger.Soft/Test/dtest-app.cs     |    77 +-
 mcs/class/Mono.Debugger.Soft/Test/dtest.cs         |   205 +-
 .../Assembly/AssemblyInfo.cs                       |    53 +
 mcs/class/Mono.Dynamic.Interpreter/Makefile        |    13 +
 .../Mono.Dynamic.Interpreter.dll.sources           |    89 +
 mcs/class/Mono.Options/Mono.Options/Options.cs     |     2 +-
 .../Test/Mono.Options/OptionSetTest.cs             |    20 +-
 .../KeyAttributesExtension.cs                      |    26 -
 .../Mono.XBuild.Tasks/Assembly/AssemblyInfo.cs     |    53 +
 mcs/class/Mono.XBuild.Tasks/Makefile               |    17 +
 .../Mono.XBuild.Tasks.dll.sources                  |     6 +
 .../Mono.XBuild.Tasks/LibraryPcFileCache.cs        |   321 +
 .../Mono.XBuild.Tasks/PcFileCache.cs               |   651 +
 .../Mono.XBuild.Tasks_test.dll.sources             |     1 +
 .../Test/Mono.XBuild.Tasks/PcFileCacheTest.cs      |   285 +
 mcs/class/Moonlight.Build.Tasks/ChangeLog          |     3 -
 mcs/class/Moonlight.Build.Tasks/Makefile           |    57 -
 .../Moonlight.Build.Tasks.dll.sources              |     6 -
 .../Moonlight.Build.Tasks/ChangeLog                |    23 -
 .../Moonlight.Build.Tasks/CreateTestPage.cs        |    79 -
 .../GenerateMoonlightManifest.cs                   |   179 -
 .../Moonlight.Build.Tasks/GenerateXap.cs           |   140 -
 .../GetMoonlightFrameworkPath.cs                   |    91 -
 .../Moonlight.Build.Tasks/PreviewTemplate.html     |    76 -
 .../Moonlight.Build.Tasks/Respack.cs               |   120 -
 .../Moonlight.Build.Tasks/XamlG.cs                 |   378 -
 mcs/class/PEAPI/PEAPI.cs                           |     4 +-
 .../CreditCardAttribute.cs                         |     8 +-
 .../EmailAddressAttribute.cs                       |   264 +-
 .../CreditCardAttributeTest.cs                     |     2 +
 .../EmailAddressAttributeTest.cs                   |    43 +-
 .../FilterUIHintAttributeTest.cs                   |     1 -
 .../UIHintAttributeTest.cs                         |     1 -
 .../ConfigurationManagerTest.cs                    |     6 +
 mcs/class/System.Core/Makefile                     |    23 +
 mcs/class/System.Core/System.Core/Dummy.cs         |     4 -
 .../MemoryMappedFile.cs                            |     6 +-
 .../LambdaCompiler.cs                              |    47 +
 .../DynamicExpressionVisitor.cs                    |    38 +
 .../System.Linq.Expressions/Expression.cs          |     2 +-
 mcs/class/System.Core/System.Linq.jvm/ChangeLog    |     9 -
 .../System.Core/System.Linq.jvm/Conversion.cs      |   463 -
 .../System.Linq.jvm/ExpressionInterpreter.cs       |   937 --
 mcs/class/System.Core/System.Linq.jvm/Math.cs      |   695 -
 mcs/class/System.Core/System.Linq.jvm/Runner.cs    |   227 -
 mcs/class/System.Core/System.Linq/Enumerable.cs    |    16 +-
 .../System.Core/System/TimeZoneInfo.Android.cs     |     2 +-
 mcs/class/System.Core/System/TimeZoneInfo.cs       |    12 +-
 .../ExpressionTest_Equal.cs                        |    12 +
 .../Test/System.Linq/EnumerableFixture.cs          |    36 +
 .../Test/System.Linq/EnumerableMoreTest.cs         |    22 +
 .../System.Core/Test/System/TimeZoneInfoTest.cs    |    17 +
 .../System.Core/dynamic_System.Core.dll.sources    |     7 -
 .../interpreter_System.Core.dll.sources            |    91 +
 .../System.Core/mobile_System.Core.dll.sources     |     8 +
 .../mobile_static_System.Core.dll.sources          |     7 -
 .../System.Core/monotouch_System.Core.dll.sources  |     6 +-
 .../System.Core/net_4_0_System.Core.dll.sources    |   121 +-
 .../System.Core/net_4_5_System.Core.dll.sources    |     1 +
 .../System.Core/static_System.Core.dll.sources     |    28 -
 .../System.Data.OracleClient.Oci/OciCalls.cs       |    42 +-
 .../OciStatementHandle.cs                          |     9 +-
 .../System.Data.OracleClient/OracleCommand.cs      |     6 +-
 .../System.Data.OracleClient/OracleParameter.cs    |     7 +-
 .../System.Data.SqlClient/SqlCommand.cs            |     2 +-
 .../System.Drawing/Test/System.Drawing/TestFont.cs |    12 +-
 .../System.Management/ManagementQuery.cs           |    22 +-
 .../System.Management/ObjectQuery.cs               |    10 +-
 mcs/class/System.Net.Http/Makefile                 |     2 +-
 .../AuthenticationHeaderValue.cs                   |    26 +-
 .../System.Net.Http.Headers/CollectionParser.cs    |   117 +
 .../ContentDispositionHeaderValue.cs               |     2 +-
 .../EntityTagHeaderValue.cs                        |    37 +-
 .../System.Net.Http.Headers/HeaderInfo.cs          |    45 +-
 .../System.Net.Http.Headers/HttpHeaders.cs         |    56 +-
 .../System.Net.Http.Headers/Lexer.cs               |     2 +
 .../MediaTypeHeaderValue.cs                        |    37 +-
 .../MediaTypeWithQualityHeaderValue.cs             |    37 +-
 .../NameValueHeaderValue.cs                        |    89 +-
 .../NameValueWithParametersHeaderValue.cs          |    53 +-
 .../System.Net.Http.Headers/Parser.cs              |    10 +-
 .../System.Net.Http.Headers/ProductHeaderValue.cs  |    31 +-
 .../ProductInfoHeaderValue.cs                      |    10 +-
 .../StringWithQualityHeaderValue.cs                |    23 +-
 .../TransferCodingHeaderValue.cs                   |    28 +-
 .../TransferCodingWithQualityHeaderValue.cs        |    36 +-
 .../System.Net.Http.Headers/ViaHeaderValue.cs      |    25 +-
 .../System.Net.Http.Headers/WarningHeaderValue.cs  |    25 +-
 .../System.Net.Http/System.Net.Http.dll.sources    |     1 +
 .../System.Net.Http/HttpClientHandler.cs           |     9 +-
 .../System.Net.Http/StreamContent.cs               |    16 +-
 .../System.Net.Http.Headers/HttpHeadersTest.cs     |     8 +
 .../NameValueHeaderValueTest.cs                    |     3 +
 .../Test/System.Net.Http/HttpRequestMessageTest.cs |    47 +-
 .../System.Net.Http/HttpResponseMessageTest.cs     |    50 +
 .../Test/System.Net.Http/StreamContentTest.cs      |    15 +
 ...urces => monotouch_System.Net.Http.dll.sources} |     0
 .../System.Numerics/System.Numerics/BigInteger.cs  |    16 +-
 .../System.Numerics/System.Numerics/Complex.cs     |     2 +-
 .../Test/System.Numerics/BigIntegerTest.cs         |    14 +
 .../System.Reactive.Core/Assembly/AssemblyInfo.cs  |     2 -
 .../Assembly/AssemblyInfo.cs                       |     2 -
 .../Assembly/AssemblyInfo.cs                       |     2 -
 .../Assembly/AssemblyInfo.cs                       |     2 -
 .../System.Reactive.Linq/Assembly/AssemblyInfo.cs  |     2 -
 .../Assembly/AssemblyInfo.cs                       |     0
 .../System.Reactive.Observable.Aliases/Makefile    |    62 +
 .../System.Reactive.Observable.Aliases.dll.sources |     3 +
 .../more_build_args                                |     3 +
 .../Assembly/AssemblyInfo.cs                       |     2 -
 .../Assembly/AssemblyInfo.cs                       |     2 -
 .../Assembly/AssemblyInfo.cs                       |     2 -
 .../Assembly/AssemblyInfo.cs                       |     2 -
 .../Assembly/AssemblyInfo.cs                       |     2 -
 .../JsonSerializationReader.cs                     |     2 +-
 .../OutgoingWebRequestContext.cs                   |     1 +
 .../DataContractJsonSerializerTest.cs              |    19 +
 .../WebOperationContextTest.cs                     |     3 +
 .../HttpRequestChannel.cs                          |    47 +-
 .../System.Transactions/Enlistment.cs              |     6 +
 .../System.Transactions/PreparingEnlistment.cs     |     5 +
 .../MessageCollection.cs                           |     7 +-
 mcs/class/System.Web/Assembly/AssemblyInfo.cs      |     9 +-
 .../HttpCapabilitiesBase.cs                        |    12 +-
 .../System.Web/System.Web/HttpHeaderCollection.cs  |     4 +
 mcs/class/System.Web/System.Web/HttpResponse.cs    |     8 +-
 .../System.Web/Test/System.Web/AppBrowsersTest.cs  |     4 +-
 .../Assembly/AssemblyInfo.cs                       |     2 +-
 .../Chart.cs                                       |     2 +-
 .../Mono.Xml.Schema/XmlSchemaValidatingReader.cs   |     2 +-
 .../System.Xml.Schema/XmlSchemaValidatorTests.cs   |    10 +
 .../XmlSerializationWriterTests.cs                 |     5 +-
 .../System.Xml.Linq/System.Xml.Linq/XContainer.cs  |    12 +-
 .../System.Xml.Linq/System.Xml.Linq/XElement.cs    |     3 +-
 mcs/class/System.Xml.Linq/System.Xml.Linq/XName.cs |     2 +-
 .../System.Xml.Linq/System.Xml.Linq/XObject.cs     |    16 +-
 .../System.Xml.Schema/Extensions.cs                |     4 -
 .../Documentation/en/System.Net/IPAddress.xml      |    15 +
 .../System/Microsoft.CSharp/CSharpCodeCompiler.cs  |    17 +-
 .../System.CodeDom.Compiler/TempFileCollection.cs  |    45 +-
 .../BlockingCollection.cs                          |    44 +-
 .../System.Collections.Concurrent/ConcurrentBag.cs |    10 +-
 .../System/System.ComponentModel/BindingList.cs    |     2 +-
 .../System/System.ComponentModel/Component.cs      |     2 +-
 .../System.Configuration/SettingValueElement.cs    |    75 +-
 mcs/class/System/System.Diagnostics/Process.cs     |    39 +-
 .../System.IO.Compression/CompressionLevel.cs      |     2 +-
 .../System.Net.NetworkInformation/NetworkChange.cs |   319 +-
 .../System/System.Net.Sockets/NetworkStream.cs     |     8 +-
 .../System.Net.WebSockets/ClientWebSocket.cs       |   330 +-
 .../ClientWebSocketOptions.cs                      |    45 +-
 .../System.Net.WebSockets/WebSocketException.cs    |    38 +-
 .../System.Net.WebSockets/WebSocketMessageType.cs  |     6 +-
 .../WebSocketReceiveResult.cs                      |    10 +-
 mcs/class/System/System.Net/HttpWebRequest.cs      |    41 +-
 mcs/class/System/System.Net/HttpWebResponse.cs     |     3 +-
 mcs/class/System/System.Net/IPAddress.cs           |    10 +
 mcs/class/System/System.Net/MacProxy.cs            |    86 +-
 mcs/class/System/System.Net/ServicePointManager.cs |     5 +-
 mcs/class/System/System.Net/TransportContext.cs    |     2 +-
 mcs/class/System/System.Net/WebConnection.cs       |    27 +-
 .../X509Certificate2.cs                            |    67 +-
 mcs/class/System/System.Timers/Timer.cs            |     8 +-
 mcs/class/System/System.Windows.Input/ICommand.cs  |     8 +-
 mcs/class/System/System_test.dll.sources           |     1 +
 .../Microsoft.CSharp/CSharpCodeProviderTest.cs     |    43 +
 .../BlockingCollectionTests.cs                     |    55 +
 .../ConcurrentBagTests.cs                          |    44 +
 .../Test/System.ComponentModel/BindingListTest.cs  |    10 +
 .../System/Test/System.Net.Sockets/SocketTest.cs   |    48 +
 .../Test/System.Net.Sockets/UdpClientTest.cs       |    23 +-
 .../System.Net.WebSockets/ClientWebSocketTest.cs   |   242 +
 mcs/class/System/Test/System.Net/IPAddressTest.cs  |     9 +
 mcs/class/System/mobile_System.dll.sources         |    98 +-
 .../System.ComponentModel/GroupDescription.cs      |     9 +-
 .../SortDescriptionCollection.cs                   |    23 +-
 .../WindowsBase/System.IO.Packaging/PackagePart.cs |     4 +-
 .../WindowsBase/System.Windows/PointConverter.cs   |     2 +-
 .../System.ComponentModel/GroupDescriptionTest.cs  |    68 +
 .../SortDescriptionCollectionTest.cs               |    46 +
 mcs/class/WindowsBase/WindowsBase_test.dll.sources |     1 +
 .../EnumerablePartitionerOptions.xml               |    50 +
 .../IReadOnlyCollection`1.xml                      |    43 +
 .../IReadOnlyDictionary`2.xml                      |   122 +
 .../System.Collections.Generic/IReadOnlyList`1.xml |    50 +
 .../ReadOnlyDictionary`2+KeyCollection.xml         |   255 +
 .../ReadOnlyDictionary`2+ValueCollection.xml       |   255 +
 .../ReadOnlyDictionary`2.xml                       |   694 +
 .../ContractAbbreviatorAttribute.xml               |    39 +
 .../ContractArgumentValidatorAttribute.xml         |    39 +
 .../ContractOptionAttribute.xml                    |   130 +
 .../en/System.Globalization/CultureInfo.xml        |    14 +-
 .../en/System.Reflection/AssemblyContentType.xml   |    50 +
 .../AssemblyMetadataAttribute.xml                  |    73 +
 .../AssemblySignatureKeyAttribute.xml              |    73 +
 .../CustomAttributeExtensions.xml                  |   894 ++
 .../en/System.Reflection/IReflectableType.xml      |    32 +
 .../System.Reflection/IntrospectionExtensions.xml  |    38 +
 .../en/System.Reflection/ReflectionContext.xml     |    91 +
 .../RuntimeReflectionExtensions.xml                |   250 +
 .../en/System.Reflection/TypeInfo.xml              |   340 +
 .../en/System.Resources/IResourceReader.xml        |    47 +-
 .../en/System.Resources/IResourceWriter.xml        |    68 +-
 .../MissingManifestResourceException.xml           |    49 +-
 .../MissingSatelliteAssemblyException.xml          |    67 +-
 .../NeutralResourcesLanguageAttribute.xml          |    41 +-
 .../en/System.Resources/ResourceManager.xml        |   276 +-
 .../en/System.Resources/ResourceReader.xml         |    74 +-
 .../en/System.Resources/ResourceSet.xml            |   185 +-
 .../en/System.Resources/ResourceWriter.xml         |   140 +-
 .../SatelliteContractVersionAttribute.xml          |    21 +-
 .../UltimateResourceFallbackLocation.xml           |    23 +-
 .../AsyncStateMachineAttribute.xml                 |    39 +
 .../AsyncTaskMethodBuilder.xml                     |   202 +
 .../AsyncTaskMethodBuilder`1.xml                   |   209 +
 .../AsyncVoidMethodBuilder.xml                     |   186 +
 .../CallerFilePathAttribute.xml                    |    36 +
 .../CallerLineNumberAttribute.xml                  |    36 +
 .../CallerMemberNameAttribute.xml                  |    36 +
 ...nfiguredTaskAwaitable+ConfiguredTaskAwaiter.xml |    92 +
 .../ConfiguredTaskAwaitable.xml                    |    35 +
 ...iguredTaskAwaitable`1+ConfiguredTaskAwaiter.xml |    96 +
 .../ConfiguredTaskAwaitable`1.xml                  |    39 +
 .../ContractHelper.xml                             |    87 +
 .../ExtensionAttribute.xml                         |    39 +
 .../IAsyncStateMachine.xml                         |    50 +
 .../ICriticalNotifyCompletion.xml                  |    38 +
 .../INotifyCompletion.xml                          |    34 +
 .../IteratorStateMachineAttribute.xml              |    39 +
 .../StateMachineAttribute.xml                      |    55 +
 .../TaskAwaiter.xml                                |    92 +
 .../TaskAwaiter`1.xml                              |    97 +
 .../YieldAwaitable+YieldAwaiter.xml                |    92 +
 .../YieldAwaitable.xml                             |    35 +
 .../ExceptionDispatchInfo.xml                      |    70 +
 .../FirstChanceExceptionEventArgs.xml              |    50 +
 ...dleProcessCorruptedStateExceptionsAttribute.xml |    36 +
 .../DefaultInterfaceAttribute.xml                  |    55 +
 .../DesignerNamespaceResolveEventArgs.xml          |    71 +
 .../EventRegistrationToken.xml                     |    99 +
 .../EventRegistrationTokenTable`1.xml              |   133 +
 .../IActivationFactory.xml                         |    37 +
 .../InterfaceImplementedInVersionAttribute.xml     |   127 +
 .../NamespaceResolveEventArgs.xml                  |    89 +
 .../ReadOnlyArrayAttribute.xml                     |    36 +
 .../ReturnValueNameAttribute.xml                   |    55 +
 .../WindowsRuntimeMarshal.xml                      |   168 +
 .../WindowsRuntimeMetadata.xml                     |    94 +
 .../WriteOnlyArrayAttribute.xml                    |    36 +
 .../TypeIdentifierAttribute.xml                    |    86 +
 .../ComponentGuaranteesAttribute.xml               |    55 +
 .../ComponentGuaranteesOptions.xml                 |    78 +
 .../System.Security.AccessControl/AccessRule`1.xml |   132 +
 .../System.Security.AccessControl/AuditRule`1.xml  |   132 +
 ...NativeObjectSecurity+ExceptionFromErrorCode.xml |    29 +
 .../en/System.Security.Policy/EvidenceBase.xml     |    48 +
 .../ConcurrentExclusiveSchedulerPair.xml           |   157 +
 .../Documentation/en/System.Threading/Volatile.xml |   768 +
 .../corlib/Documentation/en/System/Action.xml      |    24 +
 .../corlib/Documentation/en/System/Action`1.xml    |    30 +
 .../corlib/Documentation/en/System/Action`2.xml    |    43 +
 .../corlib/Documentation/en/System/Action`3.xml    |    51 +
 .../corlib/Documentation/en/System/Action`4.xml    |    59 +
 .../corlib/Documentation/en/System/Func`1.xml      |    33 +
 .../corlib/Documentation/en/System/Func`2.xml      |    42 +
 .../corlib/Documentation/en/System/Func`3.xml      |    50 +
 .../corlib/Documentation/en/System/Func`4.xml      |    58 +
 .../corlib/Documentation/en/System/Func`5.xml      |    66 +
 .../corlib/Documentation/en/System/IProgress`1.xml |    42 +
 .../en/System/InvalidTimeZoneException.xml         |    88 +
 .../corlib/Documentation/en/System/Progress`1.xml  |   108 +
 .../en/System/TimeZoneInfo+AdjustmentRule.xml      |   218 +
 .../en/System/TimeZoneInfo+TransitionTime.xml      |   320 +
 .../Documentation/en/System/TimeZoneInfo.xml       |   870 +
 .../en/System/TimeZoneNotFoundException.xml        |    88 +
 .../Documentation/en/System/WeakReference`1.xml    |   140 +
 .../en/ns-System.Runtime.ExceptionServices.xml     |     6 +
 ...stem.Runtime.InteropServices.WindowsRuntime.xml |     6 +
 mcs/class/corlib/Makefile                          |     8 +-
 .../ConcurrentDictionary.cs                        |     1 +
 .../corlib/System.Collections.Generic/List.cs      |    87 +-
 .../corlib/System.Collections/CollectionBase.cs    |     2 +
 .../DebuggerTypeProxyAttribute.cs                  |    11 +-
 .../corlib/System.Globalization/CultureInfo.cs     |    98 +-
 .../corlib/System.Globalization/RegionInfo.cs      |    34 +-
 mcs/class/corlib/System.Globalization/TextInfo.cs  |    41 +-
 mcs/class/corlib/System.IO/Path.cs                 |     3 +-
 mcs/class/corlib/System.IO/Stream.cs               |     2 +-
 .../corlib/System.Reflection/MonoParameterInfo.cs  |    15 +
 mcs/class/corlib/System.Reflection/MonoProperty.cs |     2 +-
 .../corlib/System.Reflection/ParameterInfo.cs      |     3 +-
 .../AsyncTaskMethodBuilder.cs                      |    11 +-
 .../AsyncTaskMethodBuilder_T.cs                    |    11 +-
 .../ConfiguredTaskAwaitable.cs                     |     4 +
 .../ConfiguredTaskAwaitable_T.cs                   |     4 +
 .../System.Runtime.CompilerServices/TaskAwaiter.cs |    37 +-
 .../TaskAwaiter_T.cs                               |     2 +-
 .../YieldAwaitable.cs                              |     4 +-
 .../DefaultInterfaceAttribute.cs                   |    46 +
 .../DesignerNamespaceResolveEventArgs.cs           |    53 +
 .../EventRegistrationToken.cs                      |    59 +
 .../EventRegistrationTokenTable.cs                 |    68 +
 .../IActivationFactory.cs                          |    38 +
 .../InterfaceImplementedInVersionAttribute.cs      |    71 +
 .../NamespaceResolveEventArgs.cs                   |    60 +
 .../ReadOnlyArrayAttribute.cs                      |    37 +
 .../ReturnValueNameAttribute.cs                    |    44 +
 .../WindowsRuntimeMarshal.cs                       |    72 +
 .../WindowsRuntimeMetadata.cs                      |    53 +
 .../WriteOnlyArrayAttribute.cs                     |    37 +
 .../System.Runtime.InteropServices/Marshal.cs      |   102 +
 .../CallContext.cs                                 |    64 +-
 .../System.Runtime.Remoting.Proxies/RealProxy.cs   |     2 +-
 .../System.Runtime.Remoting/RemotingServices.cs    |     2 +-
 .../X509Certificate.cs                             |    12 +-
 .../X509Certificate20.cs                           |    45 +-
 .../System.Security.Principal/WindowsIdentity.cs   |     2 +-
 mcs/class/corlib/System.Text/UTF8Encoding.cs       |    18 +-
 mcs/class/corlib/System.Threading.Tasks/Task.cs    |    92 +-
 .../System.Threading.Tasks/TaskActionInvoker.cs    |    13 +-
 .../System.Threading.Tasks/TaskCompletionSource.cs |     2 +-
 .../System.Threading.Tasks/TaskContinuation.cs     |    57 +-
 .../corlib/System.Threading.Tasks/TaskFactory.cs   |    11 +-
 .../corlib/System.Threading.Tasks/TaskScheduler.cs |     6 +
 .../corlib/System.Threading.Tasks/TpScheduler.cs   |     2 +-
 .../System.Threading/CancellationTokenSource.cs    |     2 +-
 mcs/class/corlib/System.Threading/Monitor.cs       |     6 +-
 mcs/class/corlib/System.Threading/NamedDataSlot.cs |     1 +
 mcs/class/corlib/System.Threading/SemaphoreSlim.cs |     8 +-
 mcs/class/corlib/System.Threading/Thread.cs        |    19 +-
 mcs/class/corlib/System.Threading/ThreadPool.cs    |    15 +-
 mcs/class/corlib/System.Threading/Timer.cs         |     2 +-
 mcs/class/corlib/System/AggregateException.cs      |     2 +-
 mcs/class/corlib/System/Array.cs                   |    74 +-
 mcs/class/corlib/System/ArraySegment.cs            |     4 +-
 mcs/class/corlib/System/Attribute.cs               |     2 +-
 mcs/class/corlib/System/ConsoleKeyInfo.cs          |    59 +-
 mcs/class/corlib/System/Convert.cs                 |    86 +-
 mcs/class/corlib/System/Delegate.cs                |     2 +-
 mcs/class/corlib/System/Enum.cs                    |     5 +-
 mcs/class/corlib/System/Environment.cs             |     2 +-
 mcs/class/corlib/System/MulticastDelegate.cs       |     9 +-
 mcs/class/corlib/System/NumberFormatter.cs         |    11 +-
 mcs/class/corlib/System/Random.cs                  |   145 +-
 mcs/class/corlib/System/String.cs                  |    14 +-
 mcs/class/corlib/System/TimeZone.cs                |    12 +-
 mcs/class/corlib/System/Tuples.cs                  |   274 +-
 .../corlib/Test/Microsoft.Win32/RegistryKeyTest.cs |     2 +
 .../Test/System.Collections.Generic/ListTest.cs    |   110 +-
 .../DebuggerDisplayAttributeTest.cs                |     6 +-
 .../DebuggerTypeProxyAttribute.cs                  |    56 +
 .../Test/System.Diagnostics/StackFrameTest.cs      |    10 +-
 .../Test/System.Globalization/CultureInfoTest.cs   |   117 +
 .../System.Globalization/DateTimeFormatInfoTest.cs |     6 +-
 .../System.Globalization/NumberFormatInfoTest.cs   |    57 +
 .../Test/System.Globalization/TextInfoTest.cs      |     9 +-
 mcs/class/corlib/Test/System.IO/FileTest.cs        |    48 +
 .../Test/System.Reflection.Emit/TypeBuilderTest.cs |    48 +
 .../Test/System.Reflection/AssemblyNameTest.cs     |     4 +-
 .../Test/System.Reflection/ParameterInfoTest.cs    |    31 +-
 .../TaskAwaiterTest.cs                             |    99 +
 .../WindowsIdentityTest.cs                         |     3 -
 .../corlib/Test/System.Text/UTF8EncodingTest.cs    |    36 +-
 .../Test/System.Threading.Tasks/TaskFactoryTest.cs |    24 +-
 .../System.Threading.Tasks/TaskFactoryTest_T.cs    |    26 +
 .../corlib/Test/System.Threading.Tasks/TaskTest.cs |    48 +
 .../Test/System.Threading/AutoResetEventTest.cs    |     2 +
 .../CancellationTokenSourceTest.cs                 |    36 +-
 .../Test/System.Threading/ExecutionContextTest.cs  |    68 +
 .../corlib/Test/System.Threading/ThreadPoolTest.cs |    33 +-
 .../corlib/Test/System.Threading/ThreadTest.cs     |     7 +
 .../corlib/Test/System.Threading/TimerTest.cs      |     7 +-
 .../corlib/Test/System/AggregateExceptionTests.cs  |    11 +
 mcs/class/corlib/Test/System/AppDomainTest.cs      |   101 +-
 mcs/class/corlib/Test/System/ArraySegmentTest.cs   |    18 +
 mcs/class/corlib/Test/System/ArrayTest.cs          |   120 +
 mcs/class/corlib/Test/System/AttributeTest.cs      |    15 +
 mcs/class/corlib/Test/System/DateTimeOffsetTest.cs |     2 +-
 mcs/class/corlib/Test/System/DateTimeTest.cs       |     4 +-
 mcs/class/corlib/Test/System/EnumTest.cs           |     7 +-
 .../corlib/Test/System/IntegerFormatterTest.cs     |    10 +-
 mcs/class/corlib/Test/System/RandomTest.cs         |   170 +-
 mcs/class/corlib/Test/System/TimeZoneTest.cs       |    68 +
 mcs/class/corlib/Test/System/TupleTest.cs          |    63 +
 mcs/class/corlib/Test/System/TypeTest.cs           |    19 +
 mcs/class/corlib/corlib.dll.sources                |    12 +
 mcs/class/corlib/corlib_test.dll.sources           |     3 +
 .../dlr/Runtime/Microsoft.Dynamic/DebugOptions.cs  |    76 +
 .../MultiRuntimeAwareAttribute.cs                  |    34 +
 .../dlr/Runtime/Microsoft.Dynamic/PerfTrack.cs     |   185 +
 .../Ast/LambdaExpression.cs                        |    10 +-
 .../Microsoft.Scripting.Core/Ast/NewExpression.cs  |     4 +-
 .../Compiler/DebugInfoGenerator.cs                 |     4 +
 .../Compiler/DelegateHelpers.cs                    |     2 +
 .../Utils/TypeExtensions.cs                        |    11 +-
 mcs/class/lib/monolite/Mono.Security.dll           |   Bin 295936 -> 302080 bytes
 mcs/class/lib/monolite/System.Core.dll             |   Bin 283136 -> 290816 bytes
 mcs/class/lib/monolite/System.Xml.dll              |   Bin 1284608 -> 1310208 bytes
 mcs/class/lib/monolite/System.dll                  |   Bin 1491968 -> 1527808 bytes
 mcs/class/lib/monolite/basic.exe                   |   Bin 1707520 -> 1757184 bytes
 mcs/class/lib/monolite/mscorlib.dll                |   Bin 2627072 -> 2684416 bytes
 .../monodoc/Monodoc/generators/html/Man2Html.cs    |     2 +-
 mcs/class/monodoc/Monodoc/providers/EcmaDoc.cs     |    21 +-
 mcs/class/monodoc/Resources/ecmaspec.css           |     1 -
 mcs/errors/CS0246-29-lib.il                        |    25 +
 mcs/errors/CS0731-1-lib.il                         |    21 +
 mcs/errors/CS0731-2-lib.il                         |    21 +
 mcs/errors/CS1070-lib.il                           |     2 +-
 mcs/errors/Makefile                                |     4 +-
 mcs/errors/cs0029-35.cs                            |    12 +
 mcs/errors/cs0035-2.cs                             |    33 +
 mcs/errors/cs0037-8.cs                             |    11 -
 mcs/errors/cs0103-12.cs                            |    11 +
 mcs/errors/cs0104-3.cs                             |    33 +
 mcs/errors/cs0104-4.cs                             |    25 +
 mcs/errors/cs0126-2.cs                             |    18 +
 mcs/errors/cs0161-4.cs                             |    15 -
 mcs/errors/cs0162-17.cs                            |    12 -
 mcs/errors/cs0162-18.cs                            |    21 +
 mcs/errors/cs0162-20.cs                            |    21 +
 mcs/errors/cs0162-7.cs                             |     3 -
 mcs/errors/cs0163-2.cs                             |    20 +
 mcs/errors/cs0163.cs                               |     5 +-
 mcs/errors/cs0165-21.cs                            |    19 +
 mcs/errors/cs0165-22.cs                            |    34 +
 mcs/errors/cs0165-23.cs                            |    23 +
 mcs/errors/cs0165-24.cs                            |    18 +
 mcs/errors/cs0165-25.cs                            |    24 +
 mcs/errors/cs0165-26.cs                            |    15 +
 mcs/errors/cs0165-27.cs                            |    15 +
 mcs/errors/cs0165-28.cs                            |    15 +
 mcs/errors/cs0165-29.cs                            |    12 +
 mcs/errors/cs0165-30.cs                            |    11 +
 mcs/errors/cs0165-31.cs                            |    11 +
 mcs/errors/cs0165-32.cs                            |    16 +
 mcs/errors/cs0165-33.cs                            |    20 +
 mcs/errors/cs0165-34.cs                            |    17 +
 mcs/errors/cs0165-35.cs                            |    19 +
 mcs/errors/cs0165-36.cs                            |    17 +
 mcs/errors/cs0165-37.cs                            |    16 +
 mcs/errors/cs0165-38.cs                            |    18 +
 mcs/errors/cs0165-39.cs                            |    18 +
 mcs/errors/cs0165-40.cs                            |    17 +
 mcs/errors/cs0165-41.cs                            |    15 +
 mcs/errors/cs0165-42.cs                            |    16 +
 mcs/errors/cs0165-43.cs                            |    18 +
 mcs/errors/cs0171-6.cs                             |    18 +
 mcs/errors/cs0177-14.cs                            |    22 +
 mcs/errors/cs0193.cs                               |     4 +-
 mcs/errors/cs0201-10.cs                            |    11 +
 mcs/errors/cs0201-11.cs                            |    12 +
 mcs/errors/cs0220-4.cs                             |    12 +
 mcs/errors/cs0246-29.cs                            |    10 +
 mcs/errors/cs0246-30.cs                            |    22 +
 mcs/errors/cs0411-15.cs                            |    20 -
 mcs/errors/cs0411-6.cs                             |    25 -
 mcs/errors/cs0411-7.cs                             |    22 -
 mcs/errors/cs0429-3.cs                             |    11 +
 mcs/errors/cs0429-4.cs                             |    14 +
 mcs/errors/cs0458-17.cs                            |    12 +
 mcs/errors/cs0534-11.cs                            |    17 +
 mcs/errors/cs0540-3.cs                             |    27 +
 mcs/errors/cs0731.cs                               |    11 +
 mcs/errors/cs1061-14.cs                            |    25 +
 mcs/errors/cs1070-2.cs                             |    12 +
 mcs/errors/cs1503-14.cs                            |    25 +
 mcs/errors/cs1503-15.cs                            |    20 +
 mcs/errors/cs1503-16.cs                            |    22 +
 mcs/errors/cs1632-2.cs                             |    16 +
 mcs/errors/cs1632-3.cs                             |    20 +
 mcs/errors/cs1632-4.cs                             |    22 +
 mcs/errors/cs1648-2.cs                             |    23 +
 mcs/errors/cs1648-3.cs                             |    26 +
 mcs/errors/cs1650-2.cs                             |    18 +
 mcs/errors/cs1654-3.cs                             |    25 +
 mcs/errors/cs1654-4.cs                             |    25 +
 mcs/errors/cs1739-4.cs                             |    14 +
 mcs/errors/known-issues-net_4_5                    |     6 +-
 mcs/ilasm/codegen/ExternTable.cs                   |    20 +-
 mcs/ilasm/parser/ILParser.jay                      |     2 +-
 mcs/jay/jay.vcxproj                                |     6 +-
 mcs/mcs/anonymous.cs                               |   122 +-
 mcs/mcs/argument.cs                                |    64 +-
 mcs/mcs/assembly.cs                                |    20 +-
 mcs/mcs/assign.cs                                  |    72 +-
 mcs/mcs/async.cs                                   |    88 +-
 mcs/mcs/attribute.cs                               |    74 +-
 mcs/mcs/cfold.cs                                   |     2 +-
 mcs/mcs/class.cs                                   |    55 +-
 mcs/mcs/codegen.cs                                 |     4 -
 mcs/mcs/complete.cs                                |    40 +-
 mcs/mcs/constant.cs                                |     2 +-
 mcs/mcs/context.cs                                 |   244 +-
 mcs/mcs/convert.cs                                 |     2 +-
 mcs/mcs/cs-parser.jay                              |    14 +-
 mcs/mcs/cs-tokenizer.cs                            |    13 +-
 mcs/mcs/decl.cs                                    |     8 +-
 mcs/mcs/delegate.cs                                |    35 +-
 mcs/mcs/doc.cs                                     |    25 +-
 mcs/mcs/driver.cs                                  |     5 +-
 mcs/mcs/dynamic.cs                                 |    28 +-
 mcs/mcs/ecore.cs                                   |   419 +-
 mcs/mcs/enum.cs                                    |     2 +-
 mcs/mcs/eval.cs                                    |    24 +-
 mcs/mcs/expression.cs                              |   738 +-
 mcs/mcs/field.cs                                   |     4 +-
 mcs/mcs/flowanalysis.cs                            |  1495 +-
 mcs/mcs/generic.cs                                 |   183 +-
 mcs/mcs/ikvm.cs                                    |    29 +-
 mcs/mcs/import.cs                                  |    54 +-
 mcs/mcs/iterators.cs                               |   167 +-
 mcs/mcs/linq.cs                                    |     3 +-
 mcs/mcs/membercache.cs                             |     6 +-
 mcs/mcs/method.cs                                  |    36 +-
 mcs/mcs/modifiers.cs                               |     1 +
 mcs/mcs/module.cs                                  |     3 -
 mcs/mcs/namespace.cs                               |    71 +-
 mcs/mcs/nullable.cs                                |    27 +-
 mcs/mcs/parameter.cs                               |     7 +-
 mcs/mcs/property.cs                                |     2 +-
 mcs/mcs/report.cs                                  |     6 +-
 mcs/mcs/settings.cs                                |    12 +-
 mcs/mcs/statement.cs                               |  2491 ++-
 mcs/mcs/typespec.cs                                |    15 +-
 mcs/tests/Makefile                                 |     1 +
 mcs/tests/dtest-059.cs                             |    22 +
 mcs/tests/dtest-error-02.cs                        |    24 +
 mcs/tests/gtest-540.cs                             |     9 +
 mcs/tests/gtest-579.cs                             |    11 +
 mcs/tests/gtest-597.cs                             |    44 +
 mcs/tests/gtest-598.cs                             |    63 +
 mcs/tests/gtest-599.cs                             |    32 +
 mcs/tests/gtest-600.cs                             |    34 +
 mcs/tests/gtest-601.cs                             |    20 +
 mcs/tests/gtest-602.cs                             |    54 +
 mcs/tests/gtest-iter-30.cs                         |    33 +
 mcs/tests/gtest-iter-31.cs                         |    31 +
 mcs/tests/{gtest-381.cs => gtest-iter-32.cs}       |     0
 mcs/tests/{gtest-217.cs => gtest-iter-33.cs}       |     0
 mcs/tests/gtest-variance-11.cs                     |    33 +
 mcs/tests/test-154.cs                              |    44 +
 mcs/tests/test-504.cs                              |    27 +-
 mcs/tests/test-519.cs                              |    23 +-
 mcs/tests/test-579.cs                              |    53 +
 mcs/tests/test-869.cs                              |    10 +
 mcs/tests/test-870.cs                              |    17 +
 mcs/tests/test-871.cs                              |    42 +
 mcs/tests/test-872.cs                              |    25 +
 mcs/tests/test-873.cs                              |    28 +
 mcs/tests/test-874.cs                              |    18 +
 mcs/tests/test-875-2-lib.il                        |    21 +
 mcs/tests/test-875-lib.cs                          |     8 +
 mcs/tests/test-875.cs                              |    11 +
 mcs/tests/test-876.cs                              |   112 +
 mcs/tests/test-877.cs                              |    18 +
 mcs/tests/test-878.cs                              |    34 +
 mcs/tests/test-879.cs                              |    28 +
 mcs/tests/test-880.cs                              |    78 +
 mcs/tests/test-881.cs                              |    26 +
 mcs/tests/test-882.cs                              |    72 +
 mcs/tests/test-883-lib.cs                          |     8 +
 mcs/tests/test-883.cs                              |    14 +
 mcs/tests/test-async-22.cs                         |     9 +
 mcs/tests/test-async-40.cs                         |     1 -
 mcs/tests/test-async-51.cs                         |    33 +
 mcs/tests/test-async-52.cs                         |    23 +
 mcs/tests/test-async-53.cs                         |    27 +
 mcs/tests/test-async-54.cs                         |    41 +
 mcs/tests/test-async-55.cs                         |    71 +
 mcs/tests/test-async-56.cs                         |    32 +
 mcs/tests/test-async-57.cs                         |    16 +
 mcs/tests/test-async-58.cs                         |    23 +
 mcs/tests/test-async-59.cs                         |    46 +
 mcs/tests/test-xml-068-ref.xml                     |    14 +
 mcs/tests/test-xml-068.cs                          |    16 +
 mcs/tests/ver-il-net_4_5.xml                       |  4953 +++---
 mcs/tools/cil-strip/Mono.Cecil.Cil/CodeReader.cs   |     6 +-
 mcs/tools/corcompare/mono-api-info.cs              |    30 +
 mcs/tools/csharp/repl.cs                           |   236 +-
 mcs/tools/linker/Descriptors/mscorlib.xml          |     2 +
 mcs/tools/linker/Mono.Linker.Steps/MarkStep.cs     |    21 +-
 mcs/tools/linker/Mono.Linker.Steps/SweepStep.cs    |    45 +-
 mcs/tools/mdbrebase/mdbrebase.cs                   |    29 +-
 mcs/tools/mdoc/Mono.Documentation/monodocer.cs     |     2 +-
 mcs/tools/mdoc/Test/DocTest-v1.cs                  |     4 +
 .../Mono.DocTest.Generic/GenericBase`1.xml         |     8 +
 .../en.expected.delete/Mono.DocTest/Widget.xml     |    20 +
 mcs/tools/mdoc/Test/en.expected.delete/index.xml   |     3 +
 .../mdoc/Test/en.expected.importecmadoc/index.xml  |     3 +
 .../Mono.DocTest.Generic/GenericBase`1.xml         |     8 +
 .../Mono.DocTest/Widget.xml                        |    25 +
 .../mdoc/Test/en.expected.importslashdoc/index.xml |     3 +
 .../Mono.DocTest.Generic/GenericBase`1.xml         |     8 +
 .../Test/en.expected.since/Mono.DocTest/Widget.xml |    24 +
 mcs/tools/mdoc/Test/en.expected.since/index.xml    |     3 +
 .../Mono.DocTest.Generic/GenericBase`1.xml         |     8 +
 .../mdoc/Test/en.expected/Mono.DocTest/Widget.xml  |    23 +
 mcs/tools/mdoc/Test/en.expected/index.xml          |     3 +
 .../Test/html.expected/Mono.DocTest/Widget.html    |    31 +
 .../mdoc/Test/msxdoc-expected.importslashdoc.xml   |    22 +
 mcs/tools/mkbundle/mkbundle.cs                     |    77 +-
 mcs/tools/mkbundle/template_z.c                    |     3 +-
 mcs/tools/monop/monop.cs                           |     2 +-
 mcs/tools/security/sn.cs                           |     2 +-
 mcs/tools/tuner/Mono.Tuner/AdjustVisibility.cs     |     3 -
 mcs/tools/xbuild/ErrorUtilities.cs                 |     4 +-
 mcs/tools/xbuild/Makefile                          |   166 +-
 mcs/tools/xbuild/SolutionParser.cs                 |    10 +-
 mcs/tools/xbuild/XBuildConsts.cs                   |    20 +
 .../xbuild/data/12.0/Microsoft.Common.targets      |   917 ++
 mcs/tools/xbuild/data/12.0/Microsoft.Common.tasks  |    35 +
 mcs/tools/xbuild/data/2.0/Microsoft.Common.targets |   771 +
 .../{xbuild => data}/2.0/Microsoft.Common.tasks    |     0
 mcs/tools/xbuild/data/3.5/Microsoft.Common.targets |   778 +
 .../{xbuild => data}/3.5/Microsoft.Common.tasks    |     0
 mcs/tools/xbuild/data/4.0/Microsoft.Common.targets |   917 ++
 .../{xbuild => data}/4.0/Microsoft.Common.tasks    |     0
 .../data/MSBuild/Microsoft.Build.CommonTypes.xsd   |  1581 ++
 .../xbuild/data/MSBuild/Microsoft.Build.Core.xsd   |   390 +
 mcs/tools/xbuild/data/Microsoft.Build.xsd          |    50 +
 mcs/tools/xbuild/data/Microsoft.CSharp.targets     |   118 +
 .../xbuild/data/Microsoft.VisualBasic.targets      |   123 +
 mcs/tools/xbuild/data/xbuild.exe.config.in         |    16 +
 mcs/tools/xbuild/{xbuild => data}/xbuild.rsp       |     0
 .../FrameworkList.xml => frameworks/net_2.0.xml}   |     0
 .../net_3.0.xml}                                   |     0
 .../FrameworkList.xml => frameworks/net_3.5.xml}   |     0
 .../FrameworkList.xml => frameworks/net_4.0.xml}   |     0
 mcs/tools/xbuild/frameworks/net_4.0_client.xml     |    53 +
 .../FrameworkList.xml => frameworks/net_4.5.xml}   |     0
 .../targets/Microsoft.Portable.CSharp_4.0.targets  |     5 +
 .../targets/Microsoft.Portable.CSharp_4.5.targets  |     5 +
 .../xbuild/targets/Microsoft.Portable.Core.props   |    14 +
 .../xbuild/targets/Microsoft.Portable.Core.targets |    27 +
 .../Microsoft.WebApplication.targets               |     0
 mcs/tools/xbuild/xbuild.exe.sources                |     1 +
 mcs/tools/xbuild/xbuild.make                       |    25 +
 .../xbuild/xbuild/2.0/Microsoft.Common.targets     |   768 -
 .../xbuild/xbuild/3.5/Microsoft.Common.targets     |   775 -
 .../xbuild/xbuild/4.0/Microsoft.Common.targets     |   910 --
 .../xbuild/4.0/Microsoft.Portable.CSharp.targets   |     3 -
 .../xbuild/4.5/Microsoft.Portable.CSharp.targets   |     3 -
 .../xbuild/MSBuild/Microsoft.Build.CommonTypes.xsd |  1581 --
 .../xbuild/xbuild/MSBuild/Microsoft.Build.Core.xsd |   390 -
 mcs/tools/xbuild/xbuild/Microsoft.Build.xsd        |    50 -
 mcs/tools/xbuild/xbuild/Microsoft.CSharp.targets   |   118 -
 .../xbuild/Microsoft.Portable.CSharp.targets       |    43 -
 .../xbuild/Microsoft.Silverlight.CSharp.targets    |     4 -
 .../xbuild/Microsoft.Silverlight.Common.targets    |   159 -
 .../Microsoft.Silverlight.VisualBasic.targets      |     4 -
 .../xbuild/xbuild/Microsoft.VisualBasic.targets    |   123 -
 mcs/tools/xbuild/xbuild_targets.make               |    22 -
 mcs/tools/xbuild/xbuild_test.make                  |    96 +
 missing                                            |    99 +-
 mono-core.spec                                     |    29 +-
 mono-core.spec.in                                  |    27 +-
 mono/Makefile.in                                   |    67 +-
 mono/arch/Makefile.in                              |    87 +-
 mono/arch/amd64/Makefile.in                        |    67 +-
 mono/arch/amd64/amd64-codegen.h                    |     4 +
 mono/arch/arm/Makefile.in                          |    67 +-
 mono/arch/ia64/Makefile.in                         |    14 +-
 mono/arch/mips/Makefile.in                         |    46 +-
 mono/arch/mips/mips-codegen.h                      |     2 +-
 mono/arch/ppc/Makefile.in                          |    46 +-
 mono/arch/s390x/Makefile.in                        |    67 +-
 mono/arch/sparc/Makefile.in                        |    67 +-
 mono/arch/x86/Makefile.in                          |    67 +-
 mono/arch/x86/x86-codegen.h                        |     2 +-
 mono/benchmark/Makefile.in                         |    14 +-
 mono/cil/Makefile.in                               |    15 +-
 mono/cil/opcode.def                                |     3 +-
 mono/dis/Makefile.in                               |    40 +-
 mono/interpreter/Makefile.in                       |    52 +-
 mono/io-layer/Makefile.in                          |    67 +-
 mono/io-layer/io.c                                 |   103 +-
 mono/io-layer/processes.c                          |    18 +-
 mono/io-layer/shared.c                             |     3 +-
 mono/io-layer/sockets.c                            |     3 +-
 mono/metadata/Makefile.am                          |    30 +-
 mono/metadata/Makefile.am.in                       |    30 +-
 mono/metadata/Makefile.in                          |   484 +-
 mono/metadata/appdomain.c                          |    69 +-
 mono/metadata/assembly.c                           |    82 +-
 mono/metadata/attach.c                             |     6 +-
 mono/metadata/boehm-gc.c                           |    40 +-
 mono/metadata/cil-coff.h                           |     7 +
 mono/metadata/class.c                              |    97 +-
 mono/metadata/class.h                              |     6 +
 mono/metadata/cominterop.c                         |     4 -
 mono/metadata/console-unix.c                       |    13 +-
 mono/metadata/culture-info-tables.h                |  2877 ++--
 mono/metadata/debug-helpers.c                      |     2 +
 mono/metadata/domain-internals.h                   |    31 +-
 mono/metadata/domain.c                             |   337 +-
 mono/metadata/exception.c                          |     2 +-
 mono/metadata/gc-internal.h                        |    13 +-
 mono/metadata/gc-memfuncs.c                        |   230 +
 mono/metadata/gc.c                                 |   172 +-
 mono/metadata/icall-def.h                          |    57 +-
 mono/metadata/icall.c                              |   240 +-
 mono/metadata/image.c                              |    45 +-
 mono/metadata/loader.c                             |    25 +-
 mono/metadata/locales.c                            |   223 +-
 mono/metadata/locales.h                            |     3 +-
 mono/metadata/lock-tracer.c                        |    18 +
 mono/metadata/lock-tracer.h                        |    12 +
 mono/metadata/marshal.c                            |    63 +-
 mono/metadata/metadata-internals.h                 |    11 +-
 mono/metadata/metadata.c                           |    21 +-
 mono/metadata/metadata.h                           |     3 +
 mono/metadata/method-builder.c                     |     3 -
 mono/metadata/monitor.c                            |     4 +-
 mono/metadata/mono-cq.c                            |     6 +-
 mono/metadata/mono-debug-debugger.c                |   212 +-
 mono/metadata/mono-debug-debugger.h                |    82 +-
 mono/metadata/mono-debug.c                         |    52 +-
 mono/metadata/mono-debug.h                         |    10 +-
 mono/metadata/mono-hash.h                          |     2 +
 mono/metadata/mono-ptr-array.h                     |     4 +-
 mono/metadata/mono-wsq.c                           |     2 +-
 mono/metadata/null-gc.c                            |     6 +
 mono/metadata/object-internals.h                   |    21 +
 mono/metadata/object.c                             |    47 +-
 mono/metadata/object.h                             |    19 +
 mono/metadata/reflection.c                         |    99 +-
 mono/metadata/sgen-alloc.c                         |    25 +-
 mono/metadata/sgen-archdep.h                       |    14 +-
 mono/metadata/sgen-bridge.c                        |   109 +-
 mono/metadata/sgen-cardtable.c                     |     6 +-
 mono/metadata/sgen-copy-object.h                   |     4 +-
 mono/metadata/sgen-debug.c                         |    18 +-
 mono/metadata/sgen-descriptor.h                    |    13 +-
 mono/metadata/sgen-gc.c                            |   207 +-
 mono/metadata/sgen-gc.h                            |    72 +-
 mono/metadata/sgen-internal.c                      |     1 +
 mono/metadata/sgen-los.c                           |     6 +-
 mono/metadata/sgen-marksweep.c                     |    65 +-
 mono/metadata/sgen-memory-governor.c               |    10 +-
 mono/metadata/sgen-nursery-allocator.c             |     4 +-
 mono/metadata/sgen-os-mach.c                       |    12 +-
 mono/metadata/sgen-os-posix.c                      |    71 +-
 mono/metadata/sgen-os-win32.c                      |    39 +-
 mono/metadata/sgen-protocol.c                      |    28 +-
 mono/metadata/sgen-qsort.c                         |    78 +
 mono/metadata/sgen-stw.c                           |    37 +-
 mono/metadata/sgen-toggleref.c                     |     2 +-
 mono/metadata/socket-io.c                          |    51 +-
 mono/metadata/test-gc-memfuncs.c                   |   104 +
 mono/metadata/test-sgen-qsort.c                    |   103 +
 mono/metadata/threads-types.h                      |    22 +-
 mono/metadata/threads.c                            |  1048 +-
 mono/metadata/tpool-epoll.c                        |     2 +-
 mono/metadata/tpool-kqueue.c                       |     2 +-
 mono/mini/Makefile.am                              |    23 +-
 mono/mini/Makefile.am.in                           |    23 +-
 mono/mini/Makefile.in                              |   354 +-
 mono/mini/abcremoval.c                             |    10 +-
 mono/mini/alias-analysis.c                         |   339 +
 mono/mini/aot-compiler.c                           |   308 +-
 mono/mini/aot-runtime.c                            |   308 +-
 mono/mini/arrays.cs                                |    15 +
 mono/mini/basic-float.cs                           |    13 +-
 mono/mini/cpu-amd64.md                             |    21 +-
 mono/mini/cpu-arm.md                               |    28 +-
 mono/mini/cpu-mips.md                              |     1 -
 mono/mini/cpu-x86.md                               |    12 +-
 mono/mini/debug-debugger.c                         |   614 -
 mono/mini/debug-debugger.h                         |   155 -
 mono/mini/debug-mini.c                             |   555 +-
 mono/mini/debug-mini.h                             |    62 -
 mono/mini/debugger-agent.c                         |   246 +-
 mono/mini/declsec.c                                |    26 +-
 mono/mini/decompose.c                              |    69 +-
 mono/mini/driver.c                                 |   264 +-
 mono/mini/dwarfwriter.c                            |    90 +-
 mono/mini/dwarfwriter.h                            |     2 +-
 mono/mini/exceptions-amd64.c                       |   134 +-
 mono/mini/exceptions-arm.c                         |    53 +-
 mono/mini/exceptions-ia64.c                        |     2 +-
 mono/mini/exceptions-mips.c                        |    14 +-
 mono/mini/exceptions-ppc.c                         |    22 +-
 mono/mini/exceptions-s390x.c                       |     6 +-
 mono/mini/exceptions-x86.c                         |   112 +-
 mono/mini/exceptions.cs                            |    22 +-
 mono/mini/graph.c                                  |    10 +-
 mono/mini/gshared.cs                               |    41 +
 mono/mini/iltests.il.in                            |    11 +-
 mono/mini/image-writer.c                           |   227 +-
 mono/mini/ir-emit.h                                |    15 +-
 mono/mini/jit-icalls.c                             |     5 +-
 mono/mini/liveness.c                               |     3 +-
 mono/mini/mdb-debug-info32-darwin.s                |    14 -
 mono/mini/mdb-debug-info32.s                       |    13 -
 mono/mini/mdb-debug-info64.s                       |    15 -
 mono/mini/method-to-ir.c                           |   547 +-
 mono/mini/mini-amd64.c                             |   545 +-
 mono/mini/mini-amd64.h                             |    32 +-
 mono/mini/mini-arm.c                               |   519 +-
 mono/mini/mini-arm.h                               |    45 +-
 mono/mini/mini-codegen.c                           |    55 +-
 mono/mini/mini-exceptions.c                        |   317 +-
 mono/mini/mini-gc.c                                |    22 +-
 mono/mini/mini-generic-sharing.c                   |     9 +-
 mono/mini/mini-ia64.c                              |     6 -
 mono/mini/mini-llvm-cpp.cpp                        |    49 +-
 mono/mini/mini-llvm.c                              |   275 +-
 mono/mini/mini-llvm.h                              |     9 +
 mono/mini/mini-mips.c                              |    28 +-
 mono/mini/mini-ops.h                               |    20 +-
 mono/mini/mini-posix.c                             |    70 +-
 mono/mini/mini-ppc.c                               |    42 +-
 mono/mini/mini-ppc.h                               |     3 +-
 mono/mini/mini-s390x.c                             |    44 +-
 mono/mini/mini-sparc.c                             |     5 -
 mono/mini/mini-trampolines.c                       |   127 +-
 mono/mini/mini-unwind.h                            |     2 +
 mono/mini/mini-x86.c                               |   824 +-
 mono/mini/mini-x86.h                               |    13 +-
 mono/mini/mini.c                                   |   401 +-
 mono/mini/mini.h                                   |   165 +-
 mono/mini/optflags-def.h                           |     1 +
 mono/mini/patch-info.h                             |     4 +-
 mono/mini/regalloc2.c                              |    81 +-
 mono/mini/ssa.c                                    |   113 +
 mono/mini/tasklets.c                               |     6 +-
 mono/mini/trace.c                                  |    10 +-
 mono/mini/tramp-amd64.c                            |    62 +-
 mono/mini/tramp-arm.c                              |    63 +-
 mono/mini/tramp-mips.c                             |    11 +-
 mono/mini/tramp-ppc.c                              |    16 +-
 mono/mini/tramp-s390x.c                            |    26 +
 mono/mini/tramp-sparc.c                            |    17 +
 mono/mini/tramp-x86.c                              |    40 +-
 mono/mini/unwind.c                                 |   226 +-
 mono/mini/version.h                                |     2 +-
 mono/mini/xdebug.c                                 |    12 +-
 mono/monograph/Makefile.am                         |     7 +
 mono/monograph/Makefile.in                         |    56 +-
 mono/profiler/Makefile.in                          |    46 +-
 mono/profiler/ptestrunner.pl                       |    20 +-
 mono/profiler/test-busy.cs                         |     1 +
 mono/tests/Makefile.am                             |    85 +-
 mono/tests/Makefile.in                             |   175 +-
 mono/tests/assemblyresolve/Makefile.in             |    14 +-
 mono/tests/cas/Makefile.in                         |    67 +-
 mono/tests/cas/assembly/Makefile.in                |    13 +-
 mono/tests/cas/demand/Makefile.in                  |    13 +-
 mono/tests/cas/inheritance/Makefile.in             |    13 +-
 mono/tests/cas/linkdemand/Makefile.in              |    13 +-
 mono/tests/cas/threads/Makefile.in                 |    13 +-
 mono/tests/finalizer-exception.cs                  |     4 +
 mono/tests/gc-descriptors/Makefile.in              |    14 +-
 mono/tests/libtest.c                               |    78 +
 mono/tests/marshal.cs                              |    23 +-
 mono/tests/marshal7.cs                             |    54 +-
 mono/tests/pinvoke2.cs                             |    55 +
 mono/tests/sgen-bridge-xref.cs                     |    52 +
 mono/tests/sgen-descriptors.cs                     |    15 +-
 mono/tests/sgen-new-threads-dont-join-stw.cs       |    95 +
 mono/tests/thread_static_gc_layout.cs              |    26 +
 mono/utils/Makefile.am                             |     4 +-
 mono/utils/Makefile.in                             |    94 +-
 mono/utils/atomic.c                                |   381 +-
 mono/utils/atomic.h                                |   514 +-
 mono/utils/dlmalloc.c                              |     2 +-
 mono/utils/mach-support-arm.c                      |     5 +
 mono/utils/mono-compiler.h                         |     1 +
 mono/utils/mono-hwcap-arm.c                        |    20 +-
 mono/utils/mono-hwcap-arm.h                        |     2 +
 mono/utils/mono-hwcap-sparc.c                      |     4 +-
 mono/utils/mono-membar.h                           |    58 -
 mono/utils/mono-proclib.c                          |     2 +-
 mono/utils/mono-semaphore.c                        |     3 +
 mono/utils/mono-signal-handler.h                   |    29 +
 mono/utils/mono-stack-unwinding.h                  |     8 +-
 mono/utils/mono-threads.c                          |   109 +-
 mono/utils/mono-threads.h                          |    67 +-
 mono/utils/mono-tls.c                              |    37 +
 mono/utils/mono-tls.h                              |    19 +
 mono/utils/monobitset.c                            |    26 +-
 msvc/Makefile.am                                   |     3 +-
 msvc/Makefile.in                                   |    16 +-
 msvc/create-windef.pl                              |    11 +-
 msvc/eglib.vcxproj                                 |    10 +-
 msvc/genmdesc.vcxproj                              |    10 +-
 msvc/libgc.vcxproj                                 |    10 +-
 msvc/libmono.vcxproj                               |    22 +-
 msvc/libmonoruntime.vcxproj                        |    10 +-
 msvc/libmonoutils.vcxproj                          |    11 +-
 msvc/libtest.vcxproj                               |    10 +-
 msvc/mono.def                                      |    69 +-
 msvc/mono.vcxproj                                  |    18 +-
 msvc/monodiet.vcxproj                              |    10 +-
 msvc/monodis.vcxproj                               |    10 +-
 msvc/monograph.vcxproj                             |    10 +-
 msvc/monoposixhelper.vcxproj                       |    10 +-
 msvc/pedump.vcxproj                                |    10 +-
 msvc/profiler-codeanalyst.vcxproj                  |    10 +-
 msvc/profiler-cov.vcxproj                          |    10 +-
 msvc/profiler-logging.vcxproj                      |    10 +-
 msvc/profiler-vtune.vcxproj                        |    10 +-
 msvc/test-invoke.vcxproj                           |    10 +-
 msvc/test-metadata.vcxproj                         |    10 +-
 msvc/test_eglib.vcxproj                            |    10 +-
 msvc/teste.vcxproj                                 |    10 +-
 po/Makefile.in                                     |    67 +-
 po/mcs/de.gmo                                      |   Bin 5546 -> 5546 bytes
 po/mcs/de.po                                       |  1093 +-
 po/mcs/es.gmo                                      |   Bin 16487 -> 16487 bytes
 po/mcs/es.po                                       |  1091 +-
 po/mcs/ja.gmo                                      |   Bin 21042 -> 21042 bytes
 po/mcs/ja.po                                       |  1091 +-
 po/mcs/mcs.pot                                     |  1093 +-
 po/mcs/pt_BR.gmo                                   |   Bin 75463 -> 74995 bytes
 po/mcs/pt_BR.po                                    |  1128 +-
 runtime/Makefile.am                                |    10 +-
 runtime/Makefile.in                                |    24 +-
 runtime/mkinstalldirs                              |   101 -
 samples/Makefile.in                                |    14 +-
 scripts/Makefile.am                                |    10 +-
 scripts/Makefile.in                                |    22 +-
 scripts/mono-test-install                          |     4 +-
 scripts/xbuild.in                                  |     2 +
 support/Makefile.am                                |     5 -
 support/Makefile.in                                |    78 +-
 support/mac-reachability.c                         |   153 -
 tools/Makefile.in                                  |    67 +-
 tools/locale-builder/CultureInfoEntry.cs           |     6 +
 tools/locale-builder/Driver.cs                     |    27 +-
 tools/locale-builder/Makefile.in                   |    13 +-
 tools/locale-builder/Patterns.cs                   |  1263 +-
 tools/sgen/Makefile.in                             |    54 +-
 tools/sgen/sgen-grep-binprot.c                     |    71 +-
 winconfig.h                                        |    31 +-
 2199 files changed, 164072 insertions(+), 221567 deletions(-)

diff --git a/LICENSE b/LICENSE
index 19ed03a..be4be30 100644
--- a/LICENSE
+++ b/LICENSE
@@ -64,13 +64,6 @@ For comments, corrections and updates, please contact mono at xamarin.com
 	the terms of the MIT X11, this means that this code can be
 	used for any purposes by anyone.
 
-** mono/metadata/sgen*: Mono's Copying Collector
-
-	This new garbage collector is licensed under the terms of
-	the MIT X11 license, in hopes that the GC could be reused
-	by third party projects, follows the same spirit than the
-	Boehm GC.
-
 ** mono/arch/*/XXX-codegen.h
 
 	This are C macros that are useful when generating native
diff --git a/Makefile.am b/Makefile.am
index c919299..a4a959d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -27,6 +27,7 @@ update_submodules:
 .PHONY: update_submodules
 
 EXTRA_DIST= \
+        README.md \
 	    LICENSE \
 	    autogen.sh \
 	    build-mingw32.sh \
@@ -155,3 +156,9 @@ package-inputs:
 	done
 	echo "</root>" >> msvc/scripts/order.xml
 
+# Update llvm version in configure.in to the output of $LLVM_DIR/bin/llvm-config --version
+update-llvm-version:
+	if test "x$$LLVM_DIR" = "x"; then echo "Set the make variable LLVM_DIR to the directory containing the LLVM installation."; exit 1; fi
+	REV=`$(LLVM_DIR)/bin/llvm-config --version` && sed -e "s,expected_llvm_version=.*,expected_llvm_version=\"$$REV\"," < configure.in > tmp && mv tmp configure.in && echo "Version set to $$REV."
+
+
diff --git a/Makefile.in b/Makefile.in
index bceef7f..3e0e8a9 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -52,12 +53,12 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
 	$(srcdir)/mono-core.spec.in $(srcdir)/mono-uninstalled.pc.in \
 	$(top_srcdir)/configure AUTHORS COPYING.LIB ChangeLog NEWS \
-	compile config.guess config.rpath config.sub install-sh \
-	ltmain.sh missing mkinstalldirs
+	compile config.guess config.rpath config.sub depcomp \
+	install-sh ltmain.sh missing mkinstalldirs
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -77,7 +78,7 @@ CONFIG_CLEAN_FILES = mono-core.spec mono-uninstalled.pc
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -100,10 +101,9 @@ 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 \
-	cscope distdir dist dist-all distcheck
+	distdir dist dist-all distcheck
 ETAGS = etags
 CTAGS = ctags
-CSCOPE = cscope
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -113,7 +113,6 @@ am__remove_distdir = \
       && rm -rf "$(distdir)" \
       || { sleep 5 && rm -rf "$(distdir)"; }; \
   else :; fi
-am__post_remove_distdir = $(am__remove_distdir)
 am__relativize = \
   dir0=`pwd`; \
   sed_first='s,^\([^/]*\)/.*$$,\1,'; \
@@ -141,7 +140,6 @@ am__relativize = \
   reldir="$$dir2"
 GZIP_ENV = --best
 DIST_ARCHIVES = $(distdir).tar.bz2
-DIST_TARGETS = dist-bzip2
 distuninstallcheck_listfiles = find . -type f -print
 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
   | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
@@ -356,6 +354,7 @@ MONOTOUCH_SUBDIRS = $(libgc_dir) eglib/src mono
 @CROSS_COMPILING_TRUE at DIST_SUBDIRS = m4 po libgc eglib mono ikvm-native data runtime scripts man samples tools msvc docs
 SUBMODULE_ERROR = 'Could not recursively update all git submodules. You may experience compilation problems if some submodules are out of date'
 EXTRA_DIST = \
+        README.md \
 	    LICENSE \
 	    autogen.sh \
 	    build-mingw32.sh \
@@ -445,11 +444,11 @@ distclean-libtool:
 	-rm -f libtool config.lt
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
 $(RECURSIVE_TARGETS):
 	@fail= failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
@@ -513,10 +512,6 @@ ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
-cscopelist-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
-	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -580,32 +575,8 @@ GTAGS:
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
 
-cscope: cscope.files
-	test ! -s cscope.files \
-	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
-
-clean-cscope:
-	-rm -f cscope.files
-
-cscope.files: clean-cscope cscopelist-recursive cscopelist
-
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS) $(LISP)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
 
 distdir: $(DISTFILES)
 	$(am__remove_distdir)
@@ -676,35 +647,39 @@ distdir: $(DISTFILES)
 	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
 	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 dist-bzip2: distdir
 	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
 dist-lzip: distdir
 	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
 
 dist-xz: distdir
 	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
 dist-tarZ: distdir
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
 dist-shar: distdir
 	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
 dist-zip: distdir
 	-rm -f $(distdir).zip
 	zip -rq $(distdir).zip $(distdir)
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
-dist dist-all:
-	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
-	$(am__post_remove_distdir)
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(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
@@ -715,6 +690,8 @@ distcheck: dist
 	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
 	*.tar.lz*) \
 	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
 	*.tar.xz*) \
@@ -726,7 +703,7 @@ distcheck: dist
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
 	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	chmod -R a-w $(distdir); chmod u+w $(distdir)
 	mkdir $(distdir)/_build
 	mkdir $(distdir)/_inst
 	chmod a-w $(distdir)
@@ -760,7 +737,7 @@ distcheck: dist
 	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
 	  && cd "$$am__cwd" \
 	  || exit 1
-	$(am__post_remove_distdir)
+	$(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'
@@ -897,14 +874,12 @@ ps-am:
 uninstall-am:
 
 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
-	cscopelist-recursive ctags-recursive install-am install-strip \
-	tags-recursive
+	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-cscope \
-	clean-generic clean-libtool cscope cscopelist \
-	cscopelist-recursive ctags ctags-recursive dist dist-all \
-	dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar dist-tarZ \
+	all all-am am--refresh check check-am clean clean-generic \
+	clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
+	dist-gzip dist-hook dist-lzip dist-lzma dist-shar dist-tarZ \
 	dist-xz dist-zip distcheck distclean distclean-generic \
 	distclean-hdr distclean-libtool distclean-tags distcleancheck \
 	distdir distuninstallcheck dvi dvi-am html html-am info \
@@ -1027,6 +1002,11 @@ package-inputs:
 	done
 	echo "</root>" >> msvc/scripts/order.xml
 
+# Update llvm version in configure.in to the output of $LLVM_DIR/bin/llvm-config --version
+update-llvm-version:
+	if test "x$$LLVM_DIR" = "x"; then echo "Set the make variable LLVM_DIR to the directory containing the LLVM installation."; exit 1; fi
+	REV=`$(LLVM_DIR)/bin/llvm-config --version` && sed -e "s,expected_llvm_version=.*,expected_llvm_version=\"$$REV\"," < configure.in > tmp && mv tmp configure.in && echo "Version set to $$REV."
+
 # 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/README b/README
deleted file mode 100644
index 43efac4..0000000
--- a/README
+++ /dev/null
@@ -1,592 +0,0 @@
-This is Mono.
-
-	1. Installation
-	2. Using Mono
-	3. Directory Roadmap
-	4. git submodules maintenance
-
-1. Compilation and Installation
-===============================
-
-   a. Build Requirements
-   ---------------------
-
-	On Itanium, you must obtain libunwind:
-
-		http://www.hpl.hp.com/research/linux/libunwind/download.php4
-
-	On Solaris, make sure that you used GNU tar to unpack this package, as
-	Solaris tar will not unpack this correctly, and you will get strange errors.
-
-	On Solaris, make sure that you use the GNU toolchain to build the software.
-
-	Optional dependencies:
-
-		* libgdiplus
-
-		  If you want to get support for System.Drawing, you will need to get
-		  Libgdiplus.    This library in turn requires glib and pkg-config:
-
-			* pkg-config
-
-		    	  Available from: http://www.freedesktop.org/Software/pkgconfig
-
-		  	* glib 2.4
-
-		    	  Available from: http://www.gtk.org/
-
-		* libzlib
-
-		  This library and the development headers are required for compression
-		  file support in the 2.0 profile.
-
-    b. Building the Software
-    ------------------------
-  	
-	If you obtained this package as an officially released tarball,
-	this is very simple, use configure and make:
-
-		./configure --prefix=/usr/local
-		make
-		make install
-
-	Mono supports a JIT engine on x86, SPARC, SPARCv9, S/390,
-	S/390x, AMD64, ARM and PowerPC systems.   
-
-	If you obtained this as a snapshot, you will need an existing
-	Mono installation.  To upgrade your installation, unpack both
-	mono and mcs:
-
-		tar xzf mcs-XXXX.tar.gz
-		tar xzf mono-XXXX.tar.gz
-		mv mono-XXX mono
-		mv mcs-XXX mcs
-		cd mono
-		./autogen.sh --prefix=/usr/local
-		make
-
-	The Mono build system is silent for most compilation commands.
-	To enable a more verbose compile (for example, to pinpoint
-	problems in your makefiles or your system) pass the V=1 flag to make, like this:
-
-		 make V=1
-
-
-    c. Building the software from GIT
-    ---------------------------------
-
-	If you are building the software from GIT, make sure that you
-	have up-to-date mcs and mono sources:
-
-	   If you are an anonymous user:
-		git clone git://github.com/mono/mono.git
-
-           If you are a Mono contributors with read/write privileges:
-	        git clone git at github.com:mono/mono.git
-
-
-	Then, go into the mono directory, and configure:
-
-		cd mono
-		./autogen.sh --prefix=/usr/local
-		make
-
-	For people with non-standard installations of the auto* utils and of
-	pkg-config (common on misconfigured OSX and windows boxes), you could get
-	an error like this:
-
-	./configure: line 19176: syntax error near unexpected token `PKG_CHECK_MODULES(BASE_DEPENDENCIES,' ...
-
-	This means that you need to set the ACLOCAL_FLAGS environment var
-	when invoking autogen.sh, like this:
-
-		ACLOCAL_FLAGS="-I $acprefix/share/aclocal" ./autogen.sh --prefix=/usr/loca
-	
-	where $acprefix is the prefix where aclocal has been installed.
-
-	This will automatically go into the mcs/ tree and build the
-	binaries there.
-
-	This assumes that you have a working mono installation, and that
-	there's a C# compiler named 'mcs', and a corresponding IL
-	runtime called 'mono'.  You can use two make variables
-	EXTERNAL_MCS and EXTERNAL_RUNTIME to override these.  e.g., you
-	can say
-
-	  make EXTERNAL_MCS=/foo/bar/mcs EXTERNAL_RUNTIME=/somewhere/else/mono
-	
-	If you don't have a working Mono installation
-	---------------------------------------------
-
-	If you don't have a working Mono installation, an obvious choice
-	is to install the latest released packages of 'mono' for your
-	distribution and running autogen.sh; make; make install in the
-	mono module directory.
-
-	You can also try a slightly more risky approach: this may not work,
-	so start from the released tarball as detailed above.
-
-	This works by first getting the latest version of the 'monolite'
-	distribution, which contains just enough to run the 'mcs'
-	compiler.  You do this with:
-
-		# Run the following line after ./autogen.sh
-		make get-monolite-latest
-
-	This will download and automatically gunzip and untar the
-	tarball, and place the files appropriately so that you can then
-	just run:
-
-		make EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/gmcs.exe
-
-	And that will use the files downloaded by 'make get-monolite-latest.
-
-	Testing and Installation
-	------------------------
-
-	You can run (part of) the mono and mcs testsuites with the command:
-
-		make check
-
-	All tests should pass.  
-
-	If you want more extensive tests, including those that test the
-	class libraries, you need to re-run 'configure' with the
-	'--enable-nunit-tests' flag, and try
-
-		make -k check
-
-	Expect to find a few testsuite failures.  As a sanity check, you
-	can compare the failures you got with
-
-		https://wrench.mono-project.com/Wrench/
-
-	You can now install mono with:
-
-		make install
-
-	You can verify your installation by using the mono-test-install
-	script, it can diagnose some common problems with Mono's install.
-
-	Failure to follow these steps may result in a broken installation. 
-
-    d. Configuration Options
-    ------------------------
-
-	The following are the configuration options that someone
-	building Mono might want to use:
-	
-	--with-sgen=yes,no
-
-		Generational GC support: Used to enable or disable the
-		compilation of a Mono runtime with the SGen garbage collector.
-
-		On platforms that support it, after building Mono, you
-		will have both a mono binary and a mono-sgen binary.
-		Mono uses Boehm, while mono-sgen uses the Simple
-		Generational GC.
-
-	--with-gc=[boehm, included, sgen, none]
-
-		Selects the default Boehm garbage collector engine to
-	  	use, the default is the "included" value.
-	
-		included: 
-			This is the default value, and its
-	  		the most feature complete, it will allow Mono
-		  	to use typed allocations and support the
-		  	debugger.
-
-			It is essentially a slightly modified Boehm GC
-
-		boehm:
-			This is used to use a system-install Boehm GC,
-			it is useful to test new features available in
-			Boehm GC, but we do not recommend that people
-			use this, as it disables a few features.
-
-		none:
-			Disables the inclusion of a garbage
-		  	collector.  
-
-	--with-tls=__thread,pthread
-
-		Controls how Mono should access thread local storage,
-	  	pthread forces Mono to use the pthread APIs, while
-	  	__thread uses compiler-optimized access to it.
-
-	  	Although __thread is faster, it requires support from
-	  	the compiler, kernel and libc.   Old Linux systems do
-	  	not support with __thread.
-
-		This value is typically pre-configured and there is no
-	  	need to set it, unless you are trying to debug a
-	  	problem.
-
-	--with-sigaltstack=yes,no
-
-		Experimental: Use at your own risk, it is known to
-		cause problems with garbage collection and is hard to
-	 	reproduce those bugs.
-
-		This controls whether Mono will install a special
-	  	signal handler to handle stack overflows.   If set to
-	  	"yes", it will turn stack overflows into the
-	  	StackOverflowException.  Otherwise when a stack
-	  	overflow happens, your program will receive a
-	  	segmentation fault.
-
-		The configure script will try to detect if your
-	  	operating system supports this.   Some older Linux
-	  	systems do not support this feature, or you might want
-	  	to override the auto-detection.
-
-	--with-static_mono=yes,no
-
-		This controls whether `mono' should link against a
-	  	static library (libmono.a) or a shared library
-	  	(libmono.so). 
-
-		This defaults to yes, and will improve the performance
-	  	of the `mono' program. 
-
-		This only affects the `mono' binary, the shared
-	  	library libmono.so will always be produced for
-	  	developers that want to embed the runtime in their
-	  	application.
-
-	--with-xen-opt=yes,no
-
-		The default value for this is `yes', and it makes Mono
-	  	generate code which might be slightly slower on
-	  	average systems, but the resulting executable will run
-	  	faster under the Xen virtualization system.
-
-	--with-large-heap=yes,no
-
-		Enable support for GC heaps larger than 3GB.
-
-		This value is set to `no' by default.
-
-	--enable-small-config=yes,no
-
-		Enable some tweaks to reduce memory usage and disk footprint at
-		the expense of some capabilities. Typically this means that the
-		number of threads that can be created is limited (256), that the
-		maxmimum heap size is also reduced (256 MB) and other such limitations
-		that still make mono useful, but more suitable to embedded devices
-		(like mobile phones).
-
-		This value is set to `no' by default.
-
-	--with-ikvm-native=yes,no
-
-		Controls whether the IKVM JNI interface library is
-	  	built or not.  This is used if you are planning on
-	  	using the IKVM Java Virtual machine with Mono.
-
-		This defaults to `yes'.
-
-	--with-profile4=yes,no
-
-		Whether you want to build the 4.x profile libraries
-		and runtime.
-
-	  	It defaults to `yes'.
-
-	--with-moonlight=yes,no
-
-		Whether you want to generate the Silverlight/Moonlight
-		libraries and toolchain in addition to the default
-		(1.1 and 2.0 APIs).
-
-		This will produce the `smcs' compiler which will reference
-		the Silverlight modified assemblies (mscorlib.dll,
-		System.dll, System.Code.dll and System.Xml.Core.dll) and turn
-	  	on the LINQ extensions for the compiler.
-
-	--with-moon-gc=boehm,sgen
-
-		Select the GC to use for Moonlight.
-
-		boehm:
-			Selects the Boehm Garbage Collector, with the same flags
-			as the regular Mono build. This is the default.
-
-		sgen:
-			Selects the new SGen Garbage Collector, which provides
-			Generational GC support, using the same flags as the
-			mono-sgen build.
-
-		This defaults to `boehm'.
-
-	--with-libgdiplus=installed,sibling,<path>
-
-		This is used to configure where should Mono look for
-	  	libgdiplus when running the System.Drawing tests.
-
-		It defaults to `installed', which means that the
-	  	library is available to Mono through the regular
-	  	system setup.
-
-		`sibling' can be used to specify that a libgdiplus
-	  	that resides as a sibling of this directory (mono)
-	  	should be used.
-
-		Or you can specify a path to a libgdiplus.
-
-	--disable-shared-memory 
-
-		Use this option to disable the use of shared memory in
-		Mono (this is equivalent to setting the MONO_DISABLE_SHM
-		environment variable, although this removes the feature
-		completely).
-
-		Disabling the shared memory support will disable certain
-		features like cross-process named mutexes.
-
-	--enable-minimal=LIST
-
-		Use this feature to specify optional runtime
-	  	components that you might not want to include.  This
-	  	is only useful for developers embedding Mono that
-	  	require a subset of Mono functionality.
-
-		The list is a comma-separated list of components that
-	  	should be removed, these are:
-
-		aot:
-			Disables support for the Ahead of Time
-	  		compilation.
-
-		attach:
-			Support for the Mono.Management assembly and the
-			VMAttach API (allowing code to be injected into
-			a target VM)
-
-		com:
-			Disables COM support.
-
-		debug:
-			Drop debugging support.
-
-	 	decimal:
-			Disables support for System.Decimal.
-
-		full_messages:
-			By default Mono comes with a full table
-			of messages for error codes.   This feature
-			turns off uncommon error messages and reduces
-			the runtime size.
-
-		generics:
-			Generics support.  Disabling this will not
-			allow Mono to run any 2.0 libraries or
-			code that contains generics.
-
-		jit:
-			Removes the JIT engine from the build, this reduces
-			the executable size, and requires that all code
-			executed by the virtual machine be compiled with
-			Full AOT before execution.
-
-		large_code:
-			Disables support for large assemblies.
-
-		logging:
-	  		Disables support for debug logging.
-
-		pinvoke:
-			Support for Platform Invocation services,
-			disabling this will drop support for any
-			libraries using DllImport.
-
-		portability:
-			Removes support for MONO_IOMAP, the environment
-			variables for simplifying porting applications that 
-			are case-insensitive and that mix the Unix and Windows path separators.
-
-		profiler:
-			Disables support for the default profiler.
-
-		reflection_emit:
-			Drop System.Reflection.Emit support
-
-		reflection_emit_save:
-			Drop support for saving dynamically created
-			assemblies (AssemblyBuilderAccess.Save) in
-			System.Reflection.Emit.
-
-		shadow_copy:
-			Disables support for AppDomain's shadow copies
-			(you can disable this if you do not plan on 
-			using appdomains).
-
-		simd:
-			Disables support for the Mono.SIMD intrinsics
-			library.
-
-		ssa:
-			Disables compilation for the SSA optimization
-			framework, and the various SSA-based
-		  	optimizations.
-
-	--enable-llvm
-	--enable-loadedllvm
-
-		This enables the use of LLVM as a code generation engine
-		for Mono.  The LLVM code generator and optimizer will be 
-		used instead of Mono's built-in code generator for both
-		Just in Time and Ahead of Time compilations.
-
-		See the http://www.mono-project.com/Mono_LLVM for the 
-		full details and up-to-date information on this feature.
-
-		You will need to have an LLVM built that Mono can link
-		against,
-
-		The --enable-loadedllvm variant will make the llvm backend
-		into a runtime-loadable module instead of linking it directly
-		into the main mono binary.
-
-	--enable-big-arrays
-
-		This enables the use arrays whose indexes are larger
-		than Int32.MaxValue.   
-
-		By default Mono has the same limitation as .NET on
-		Win32 and Win64 and limits array indexes to 32-bit
-		values (even on 64-bit systems).
-
-		In certain scenarios where large arrays are required,
-		you can pass this flag and Mono will be built to
-		support 64-bit arrays.
-
-		This is not the default as it breaks the C embedding
-		ABI that we have exposed through the Mono development
-		cycle.
-
-	--enable-parallel-mark
-
-		Use this option to enable the garbage collector to use
-		multiple CPUs to do its work.  This helps performance
-		on multi-CPU machines as the work is divided across CPUS.
-
-		This option is not currently the default as we have
-		not done much testing with Mono.
-
-	--enable-dtrace
-
-		On Solaris and MacOS X builds a version of the Mono
-		runtime that contains DTrace probes and can
-		participate in the system profiling using DTrace.
-
-
-	--disable-dev-random
-
-		Mono uses /dev/random to obtain good random data for
-	  	any source that requires random numbers.   If your
-	  	system does not support this, you might want to
-	  	disable it.
-
-		There are a number of runtime options to control this
-	  	also, see the man page.
-
-	--enable-nacl
-
-		This configures the Mono compiler to generate code
-		suitable to be used by Google's Native Client:
-
-			 http://code.google.com/p/nativeclient/
-
-		Currently this is used with Mono's AOT engine as
-		Native Client does not support JIT engines yet.
-
-2. Using Mono
-=============
-
-	Once you have installed the software, you can run a few programs:
-
-	* runtime engine
-
-		mono program.exe
-
-	* C# compiler
-
-		mcs program.cs
-
-	* CIL Disassembler
-
-		monodis program.exe
-
-	See the man pages for mono(1), mint(1), monodis(1) and mcs(2)
-	for further details.
-
-3. Directory Roadmap
-====================
-
-	docs/
-		Technical documents about the Mono runtime.
-
-	data/
-		Configuration files installed as part of the Mono runtime.
-
-	mono/
-		The core of the Mono Runtime.
-
-		metadata/
-			The object system and metadata reader.
-
-		mini/
-			The Just in Time Compiler.
-
-		dis/
-			CIL executable Disassembler
-
-		cli/
-			Common code for the JIT and the interpreter.
-
-		io-layer/
-			The I/O layer and system abstraction for 
-			emulating the .NET IO model.
-
-		cil/
-			Common Intermediate Representation, XML
-			definition of the CIL bytecodes.
-
-		interp/
-			Interpreter for CLI executables (obsolete).
-
-		arch/
-			Architecture specific portions.
-
-	man/
-
-		Manual pages for the various Mono commands and programs.
-
-	samples/
-
-		Some simple sample programs on uses of the Mono
-		runtime as an embedded library.   
-
-	scripts/
-
-		Scripts used to invoke Mono and the corresponding program.
-
-	runtime/
-
-		A directory that contains the Makefiles that link the
-		mono/ and mcs/ build systems.
-
-	../olive/
-
-		If the directory ../olive is present (as an
-		independent checkout) from the Mono module, that
-		directory is automatically configured to share the
-		same prefix than this module gets.
-
-
-4. Git submodules maintenance
-=============================
-
-Read documentation at http://mono-project.com/Git_Submodule_Maintenance
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5ffe56a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,539 @@
+Mono is a software platform designed to allow developers to easily create cross platform applications.
+Mono is an open source implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
+
+1. [Installation](#compilation-and-installation)
+2. [Using Mono](#using-mono)
+3. [Directory Roadmap](#directory-roadmap)
+4. [Git submodules maintenance](#git-submodules-maintenance)
+5. [Reporting bugs](#reporting-bugs)
+
+Compilation and Installation
+============================
+
+a. Build Requirements
+---------------------
+
+* On Itanium, you must obtain libunwind: http://www.hpl.hp.com/research/linux/libunwind/download.php4
+
+* On Solaris
+
+ 1. Make sure that you used GNU tar to unpack this package, as
+ Solaris tar will not unpack this correctly, and you will get strange errors.
+
+ 2. Make sure that you use the GNU toolchain to build the software.
+
+ 3. Optional dependencies
+
+  * libgdiplus - Required for System.Drawing. This library in turn requires glib and pkg-config
+
+  * pkg-config - Available at: http://www.freedesktop.org/Software/pkgconfig
+
+  * glib 2.4 - Available at: http://www.gtk.org/
+
+  * libzlib - This library and the development headers are required for compression
+file support in the 2.0 profile.
+
+b. Building the Software
+------------------------
+
+If you obtained this package as an officially released tarball,
+this is very simple, use configure and make:
+
+`./configure --prefix=/usr/local ; make ; make install`
+
+Mono supports a JIT engine on x86, SPARC, SPARCv9, S/390,
+S/390x, AMD64, ARM and PowerPC systems.   
+
+If you obtained this as a snapshot, you will need an existing
+Mono installation.  To upgrade your installation, unpack both
+mono and mcs:
+
+	tar xzf mcs-XXXX.tar.gz
+	tar xzf mono-XXXX.tar.gz
+	mv mono-XXX mono
+	mv mcs-XXX mcs
+	cd mono
+	./autogen.sh --prefix=/usr/local
+	make
+
+The Mono build system is silent for most compilation commands.
+To enable a more verbose compile (for example, to pinpoint
+problems in your makefiles or your system) pass the V=1 flag to make, like this:
+
+` make V=1`
+
+
+c. Building the software from GIT
+---------------------------------
+
+If you are building the software from GIT, make sure that you
+have up-to-date mcs and mono sources:
+
+ * If you are an anonymous user: `git clone git://github.com/mono/mono.git`
+
+ * If you are a Mono contributor with read/write privileges: `git clone git at github.com:mono/mono.git`
+
+Then, go into the mono directory, and configure:
+
+	cd mono
+	./autogen.sh --prefix=/usr/local
+	make
+
+For people with non-standard installations of the auto* utils and of
+pkg-config (common on misconfigured OSX and windows boxes), you could get
+an error like this:
+
+`./configure: line 19176: syntax error near unexpected token 'PKG_CHECK_MODULES(BASE_DEPENDENCIES,' ...`
+
+This means that you need to set the ACLOCAL_FLAGS environment variable
+when invoking autogen.sh, like this: `ACLOCAL_FLAGS="-I $acprefix/share/aclocal" ./autogen.sh --prefix=/usr/local`
+where $acprefix is the prefix where aclocal has been installed.
+This will automatically go into the mcs/ tree and build the
+binaries there.
+
+This assumes that you have a working mono installation, and that
+there's a C# compiler named 'mcs', and a corresponding IL
+runtime called 'mono'.  You can use two make variables
+EXTERNAL_MCS and EXTERNAL_RUNTIME to override these.  e.g., you
+can say:
+
+`make EXTERNAL_MCS=/foo/bar/mcs EXTERNAL_RUNTIME=/somewhere/else/mono`
+
+If you don't have a working Mono installation
+---------------------------------------------
+
+If you don't have a working Mono installation, an obvious choice
+is to install the latest released packages of 'mono' for your
+distribution and running `autogen.sh; make; make install` in the
+mono module directory.
+
+You can also try a slightly more risky approach: this may not work,
+so start from the released tarball as detailed above.
+
+This works by first getting the latest version of the 'monolite'
+distribution, which contains just enough to run the 'mcs'
+compiler. You do this with:
+
+	# Run the following line after ./autogen.sh
+	make get-monolite-latest
+
+This will download and automatically gunzip and untar the
+tarball, and place the files appropriately so that you can then
+just run: `make EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/gmcs.exe`
+
+That will use the files downloaded by 'make get-monolite-latest.
+
+Testing and Installation
+------------------------
+
+You can run *(part of)* the mono and mcs test suites with the command: `make check`.
+All tests should pass.  
+
+If you want more *extensive* tests, including those that test the
+class libraries, you need to re-run 'configure' with the
+'--enable-nunit-tests' flag, and try: `make -k check`
+
+Expect to find a few test suite failures. As a sanity check, you
+can compare the failures you got with
+
+`https://wrench.mono-project.com/Wrench/`
+
+You can now install mono with: `make install`
+
+You can verify your installation by using the mono-test-install
+script, it can diagnose some common problems with Mono's install.
+Failure to follow these steps may result in a broken installation. 
+
+d. Configuration Options
+------------------------
+
+The following are the configuration options that someone
+building Mono might want to use:
+
+* `--with-sgen=yes,no` - Generational GC support: Used to enable or disable the
+compilation of a Mono runtime with the SGen garbage collector.
+
+  * On platforms that support it, after building Mono, you
+will have both a mono binary and a mono-sgen binary.
+Mono uses Boehm, while mono-sgen uses the Simple
+Generational GC.
+
+* `--with-gc=[boehm, included, sgen, none]` - Selects the default Boehm garbage
+collector engine to use.
+
+  * *included*: (*slighty modified Boehm GC*)
+This is the default value, and its
+the most feature complete, it will allow Mono
+to use typed allocations and support the
+debugger.
+
+  * *boehm*:
+This is used to use a system-install Boehm GC,
+it is useful to test new features available in
+Boehm GC, but we do not recommend that people
+use this, as it disables a few features.
+
+  * *none*:
+Disables the inclusion of a garbage collector.
+
+  * This defaults to `included`.
+
+* `--with-tls=__thread,pthread`
+
+  * Controls how Mono should access thread local storage,
+pthread forces Mono to use the pthread APIs, while
+__thread uses compiler-optimized access to it.
+
+  * Although __thread is faster, it requires support from
+the compiler, kernel and libc. Old Linux systems do
+not support with __thread.
+
+  * This value is typically pre-configured and there is no
+need to set it, unless you are trying to debug a problem.
+
+* `--with-sigaltstack=yes,no`
+
+  * **Experimental**: Use at your own risk, it is known to
+cause problems with garbage collection and is hard to
+reproduce those bugs.
+
+  * This controls whether Mono will install a special
+signal handler to handle stack overflows. If set to
+`yes`, it will turn stack overflows into the
+StackOverflowException. Otherwise when a stack
+overflow happens, your program will receive a
+segmentation fault.
+
+  * The configure script will try to detect if your
+operating system supports this. Some older Linux
+systems do not support this feature, or you might want
+to override the auto-detection.
+
+* `--with-static_mono=yes,no`
+
+  * This controls whether `mono` should link against a
+static library (libmono.a) or a shared library
+(libmono.so). 
+
+  * This defaults to `yes`, and will improve the performance
+of the `mono` program. 
+
+  * This only affects the `mono' binary, the shared
+library libmono.so will always be produced for
+developers that want to embed the runtime in their
+application.
+
+* `--with-xen-opt=yes,no` - Optimize code for Xen virtualization.
+
+  * It makes Mono generate code which might be slightly
+slower on average systems, but the resulting executable will run
+faster under the Xen virtualization system.
+
+  * This defaults to `yes`.
+
+* `--with-large-heap=yes,no` - Enable support for GC heaps larger than 3GB.
+
+  * This defaults to `no`.
+
+* `--enable-small-config=yes,no` - Enable some tweaks to reduce memory usage
+and disk footprint at the expense of some capabilities.
+
+  * Typically this means that the number of threads that can be created
+is limited (256), that the maximum heap size is also reduced (256 MB)
+and other such limitations that still make mono useful, but more suitable
+to embedded devices (like mobile phones).
+
+  * This defaults to `no`.
+
+* `--with-ikvm-native=yes,no` - Controls whether the IKVM JNI interface library is
+built or not.
+
+  * This is used if you are planning on
+using the IKVM Java Virtual machine with Mono.
+
+  * This defaults to `yes`.
+
+* `--with-profile4=yes,no` - Whether you want to build the 4.x profile libraries
+and runtime.
+
+  * This defaults to `yes`.
+
+* `--with-moonlight=yes,no`
+
+  * Whether you want to generate the Silverlight/Moonlight
+libraries and toolchain in addition to the default
+(1.1 and 2.0 APIs).
+
+  * This will produce the `smcs` compiler which will reference
+the Silverlight modified assemblies (mscorlib.dll,
+System.dll, System.Code.dll and System.Xml.Core.dll) and turn
+on the LINQ extensions for the compiler.
+
+* `--with-moon-gc=boehm,sgen` - Select the GC to use for Moonlight.
+
+  * *boehm*:
+Selects the Boehm Garbage Collector, with the same flags
+as the regular Mono build. This is the default.
+
+  * *sgen*:
+Selects the new SGen Garbage Collector, which provides
+Generational GC support, using the same flags as the
+mono-sgen build.
+
+  * This defaults to `boehm`.
+
+* `--with-libgdiplus=installed,sibling,<path>` - Configure where Mono
+searches for libgdiplus when running System.Drawing tests.
+
+  * It defaults to `installed`, which means that the
+library is available to Mono through the regular
+system setup.
+
+  * `sibling' can be used to specify that a libgdiplus
+that resides as a sibling of this directory (mono)
+should be used.
+
+ * Or you can specify a path to a libgdiplus.
+
+* `--disable-shared-memory`
+
+  * Use this option to disable the use of shared memory in
+Mono (this is equivalent to setting the MONO_DISABLE_SHM
+environment variable, although this removes the feature
+completely).
+
+  * Disabling the shared memory support will disable certain
+features like cross-process named mutexes.
+
+* `--enable-minimal=LIST`
+
+  * Use this feature to specify optional runtime
+components that you might not want to include.  This
+is only useful for developers embedding Mono that
+require a subset of Mono functionality.
+  * The list is a comma-separated list of components that
+should be removed, these are:
+
+    * `aot`:
+Disables support for the Ahead of Time compilation.
+
+    * `attach`:
+Support for the Mono.Management assembly and the
+VMAttach API (allowing code to be injected into
+a target VM)
+
+    * `com`:
+Disables COM support.
+
+    * `debug`:
+Drop debugging support.
+
+    * `decimal`:
+Disables support for System.Decimal.
+
+    * `full_messages`:
+By default Mono comes with a full table
+of messages for error codes. This feature
+turns off uncommon error messages and reduces
+the runtime size.
+
+    * `generics`:
+Generics support.  Disabling this will not
+allow Mono to run any 2.0 libraries or
+code that contains generics.
+
+    * `jit`:
+Removes the JIT engine from the build, this reduces
+the executable size, and requires that all code
+executed by the virtual machine be compiled with
+Full AOT before execution.
+
+    * `large_code`:
+Disables support for large assemblies.
+
+    * `logging`:
+Disables support for debug logging.
+
+    * `pinvoke`:
+Support for Platform Invocation services,
+disabling this will drop support for any
+libraries using DllImport.
+
+    * `portability`:
+Removes support for MONO_IOMAP, the environment
+variables for simplifying porting applications that 
+are case-insensitive and that mix the Unix and Windows path separators.
+
+    * `profiler`:
+Disables support for the default profiler.
+
+    * `reflection_emit`:
+Drop System.Reflection.Emit support
+
+    * `reflection_emit_save`:
+Drop support for saving dynamically created
+assemblies (AssemblyBuilderAccess.Save) in
+System.Reflection.Emit.
+
+    * `shadow_copy`:
+Disables support for AppDomain's shadow copies
+(you can disable this if you do not plan on 
+using appdomains).
+
+    * `simd`:
+Disables support for the Mono.SIMD intrinsics
+library.
+
+    * `ssa`:
+Disables compilation for the SSA optimization
+framework, and the various SSA-based optimizations.
+
+* `--enable-llvm`
+* `--enable-loadedllvm`
+
+  * This enables the use of LLVM as a code generation engine
+for Mono.  The LLVM code generator and optimizer will be 
+used instead of Mono's built-in code generator for both
+Just in Time and Ahead of Time compilations.
+
+  * See the http://www.mono-project.com/Mono_LLVM for the 
+full details and up-to-date information on this feature.
+
+  * You will need to have an LLVM built that Mono can link
+against.
+
+  * The --enable-loadedllvm variant will make the LLVM backend
+into a runtime-loadable module instead of linking it directly
+into the main mono binary.
+
+* `--enable-big-arrays` - Enable use of arrays with indexes larger
+than Int32.MaxValue.
+
+  * By default Mono has the same limitation as .NET on
+Win32 and Win64 and limits array indexes to 32-bit
+values (even on 64-bit systems).
+
+  * In certain scenarios where large arrays are required,
+you can pass this flag and Mono will be built to
+support 64-bit arrays.
+
+  * This is not the default as it breaks the C embedding
+ABI that we have exposed through the Mono development
+cycle.
+
+* `--enable-parallel-mark`
+
+  * Use this option to enable the garbage collector to use
+multiple CPUs to do its work.  This helps performance
+on multi-CPU machines as the work is divided across CPUS.
+
+  * This option is not currently the default as we have
+not done much testing with Mono.
+
+* `--enable-dtrace`
+
+  * On Solaris and MacOS X builds a version of the Mono
+runtime that contains DTrace probes and can
+participate in the system profiling using DTrace.
+
+
+* `--disable-dev-random`
+
+  * Mono uses /dev/random to obtain good random data for
+any source that requires random numbers.   If your
+system does not support this, you might want to
+disable it.
+
+  * There are a number of runtime options to control this
+also, see the man page.
+
+* `--enable-nacl`
+
+  * This configures the Mono compiler to generate code
+suitable to be used by Google's Native Client:
+http://code.google.com/p/nativeclient/
+
+  * Currently this is used with Mono's AOT engine as
+Native Client does not support JIT engines yet.
+
+Using Mono
+==========
+
+Once you have installed the software, you can run a few programs:
+
+* `mono program.exe` runtime engine
+
+* `mcs program.cs` C# compiler 
+
+* `monodis program.exe` CIL Disassembler
+
+See the man pages for mono(1), mint(1), monodis(1) and mcs(2)
+for further details.
+
+Directory Roadmap
+=================
+
+* `docs/` - Technical documents about the Mono runtime.
+
+* `data/` - Configuration files installed as part of the Mono runtime.
+
+* `mono/` - The core of the Mono Runtime.
+
+  * `metadata/` - The object system and metadata reader.
+
+  * `mini/` - The Just in Time Compiler.
+
+  * `dis/` - CIL executable Disassembler
+
+  * `cli/` - Common code for the JIT and the interpreter.
+
+  * `io-layer/` - The I/O layer and system abstraction for 
+emulating the .NET IO model.
+
+  * `cil/` - Common Intermediate Representation, XML
+definition of the CIL bytecodes.
+
+ * `interp/` - Interpreter for CLI executables (obsolete).
+
+ * `arch/` - Architecture specific portions.
+
+* `man/` - Manual pages for the various Mono commands and programs.
+
+* `samples/` -Some simple sample programs on uses of the Mono
+runtime as an embedded library.   
+
+* `scripts/` - Scripts used to invoke Mono and the corresponding program.
+
+* `runtime/` - A directory that contains the Makefiles that link the
+mono/ and mcs/ build systems.
+
+* `../olive/`
+
+  * If the directory ../olive is present (as an
+independent checkout) from the Mono module, that
+directory is automatically configured to share the
+same prefix than this module gets.
+
+
+Git submodules maintenance
+==========================
+
+Read documentation at http://mono-project.com/Git_Submodule_Maintenance
+
+Maintainer
+==========
+
+Mono is maintained by miguel at xamarin.com
+
+Reporting bugs
+==============
+
+To submit bug reports, please use Xamarin's Bugzilla:
+
+https://bugzilla.xamarin.com/
+
+Please use the search facility to ensure the same bug hasn't already
+been submitted and follow our guidelines on how to make a good bug
+report:
+
+http://mono-project.com/Bugs#How_to_make_a_good_bug_report
diff --git a/aclocal.m4 b/aclocal.m4
index 8a6a5bb..63f8f49 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,7 +1,8 @@
-# generated automatically by aclocal 1.12.1 -*- Autoconf -*-
-
-# Copyright (C) 1996-2012 Free Software Foundation, Inc.
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
 
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
 # This file 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,15 +18,16 @@ m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
 [m4_warning([this file was generated for autoconf 2.69.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
 
-# Copyright (C) 2002-2012 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
 #
 # This file 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.
 
-# serial 8
+# serial 1
 
 # AM_AUTOMAKE_VERSION(VERSION)
 # ----------------------------
@@ -33,10 +35,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.12'
+[am__api_version='1.11'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.12.1], [],
+m4_if([$1], [1.11.6], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -52,14 +54,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.12.1])dnl
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # Figure out how to run the assembler.                      -*- Autoconf -*-
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -81,17 +83,17 @@ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 2
+# serial 1
 
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
-# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
 #
 # Of course, Automake must honor this variable whenever it calls a
 # tool from the auxiliary directory.  The problem is that $srcdir (and
@@ -110,7 +112,7 @@ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
 #
 # The reason of the latter failure is that $top_srcdir and $ac_aux_dir
 # are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is '.', but things will broke when you
+# harmless because $srcdir is `.', but things will broke when you
 # start a VPATH build or use an absolute $srcdir.
 #
 # So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
@@ -136,21 +138,22 @@ am_aux_dir=`cd $ac_aux_dir && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2012 Free Software Foundation, Inc.
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 10
+# serial 9
 
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
 # Define a conditional.
 AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ([2.52])dnl
- m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
 AC_SUBST([$1_TRUE])dnl
 AC_SUBST([$1_FALSE])dnl
 _AM_SUBST_NOTMAKE([$1_TRUE])dnl
@@ -169,15 +172,16 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2012 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 17
+# serial 12
 
-# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
 # will think it sees a *use*, and therefore will trigger all it's
 # C support machinery.  Also note that it means that autoscan, seeing
@@ -187,7 +191,7 @@ fi])])
 # _AM_DEPENDENCIES(NAME)
 # ----------------------
 # See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
 # We try a few techniques and use that to set a single cache variable.
 #
 # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
@@ -200,13 +204,12 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
 AC_REQUIRE([AM_MAKE_INCLUDE])dnl
 AC_REQUIRE([AM_DEP_TRACK])dnl
 
-m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
-      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
-      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
-      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
-      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                    [depcc="$$1"   am_compiler_list=])
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
 
 AC_CACHE_CHECK([dependency style of $depcc],
                [am_cv_$1_dependencies_compiler_type],
@@ -214,8 +217,8 @@ AC_CACHE_CHECK([dependency style of $depcc],
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named 'D' -- because '-MD' means "put the output
-  # in D".
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
   rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
@@ -255,16 +258,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
-      # Solaris 10 /bin/sh.
-      echo '/* dummy */' > sub/conftst$i.h
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle '-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs.
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -273,8 +276,8 @@ AC_CACHE_CHECK([dependency style of $depcc],
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # After this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested.
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
       if test "x$enable_dependency_tracking" = xyes; then
 	continue
       else
@@ -282,7 +285,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
       fi
       ;;
     msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok '-c -o', but also, the minuso test has
+      # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -330,7 +333,7 @@ AM_CONDITIONAL([am__fastdep$1], [
 # AM_SET_DEPDIR
 # -------------
 # Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
 AC_DEFUN([AM_SET_DEPDIR],
 [AC_REQUIRE([AM_SET_LEADING_DOT])dnl
 AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
@@ -340,13 +343,9 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
 # AM_DEP_TRACK
 # ------------
 AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE([dependency-tracking], [dnl
-AS_HELP_STRING(
-  [--enable-dependency-tracking],
-  [do not reject slow dependency extractors])
-AS_HELP_STRING(
-  [--disable-dependency-tracking],
-  [speeds up one-time build])])
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
@@ -361,13 +360,14 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2012 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 6
+#serial 5
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
@@ -386,7 +386,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named 'Makefile.in', but
+    # We used to match only the files named `Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -398,19 +398,21 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running 'make'.
+    # from the Makefile without running `make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
     test -z "am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`AS_DIRNAME(["$file"])`
@@ -428,7 +430,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 # This macro should only be invoked once -- use via AC_REQUIRE.
 #
 # This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each '.P' file that we will
+# is enabled.  FIXME.  This creates each `.P' file that we will
 # need in order to bootstrap the dependency handling code.
 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 [AC_CONFIG_COMMANDS([depfiles],
@@ -438,13 +440,14 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2012 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 19
+# serial 16
 
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
@@ -490,37 +493,31 @@ AC_SUBST([CYGPATH_W])
 # Define the identity of the package.
 dnl Distinguish between old-style and new-style calls.
 m4_ifval([$2],
-[AC_DIAGNOSE([obsolete],
-[$0: two- and three-arguments forms are deprecated.  For more info, see:
-http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation])
-m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
  AC_SUBST([PACKAGE], [$1])dnl
  AC_SUBST([VERSION], [$2])],
 [_AM_SET_OPTIONS([$1])dnl
 dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(
-  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
-  [ok:ok],,
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
   [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
  AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
 
 _AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
- AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
 
 # Some tools Automake needs.
 AC_REQUIRE([AM_SANITY_CHECK])dnl
 AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
-AM_MISSING_PROG([AUTOCONF], [autoconf])
-AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
-AM_MISSING_PROG([AUTOHEADER], [autoheader])
-AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
 AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
 AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
@@ -531,35 +528,28 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
 			     [_AM_PROG_TAR([v7])])])
 _AM_IF_OPTION([no-dependencies],,
 [AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES([CC])],
-		  [m4_define([AC_PROG_CC],
-			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES([CXX])],
-		  [m4_define([AC_PROG_CXX],
-			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES([OBJC])],
-		  [m4_define([AC_PROG_OBJC],
-			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
-dnl Support for Objective C++ was only introduced in Autoconf 2.65,
-dnl but we still cater to Autoconf 2.62.
-m4_ifdef([AC_PROG_OBJCXX],
-[AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
-		  [_AM_DEPENDENCIES([OBJCXX])],
-		  [m4_define([AC_PROG_OBJCXX],
-			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
 ])
 _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the
-dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
 dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
 AC_CONFIG_COMMANDS_PRE(dnl
 [m4_provide_if([_AM_COMPILER_EXEEXT],
   [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
 ])
 
-dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
 dnl mangled by Autoconf and run in a shell conditional statement.
 m4_define([_AC_COMPILER_EXEEXT],
@@ -587,13 +577,14 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
 #
 # This file 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.
 
-# serial 8
+# serial 1
 
 # AM_PROG_INSTALL_SH
 # ------------------
@@ -608,9 +599,9 @@ if test x"${install_sh}" != xset; then
     install_sh="\${SHELL} $am_aux_dir/install-sh"
   esac
 fi
-AC_SUBST([install_sh])])
+AC_SUBST(install_sh)])
 
-# Copyright (C) 2003-2012 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -634,19 +625,20 @@ AC_SUBST([am__leading_dot])])
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996-2012 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 7
+# serial 5
 
 # AM_MAINTAINER_MODE([DEFAULT-MODE])
 # ----------------------------------
 # Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless 'enable' is passed literally.
-# For symmetry, 'disable' may be passed as well.  Anyway, the user
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
 # can override the default with the --enable/--disable switch.
 AC_DEFUN([AM_MAINTAINER_MODE],
 [m4_case(m4_default([$1], [disable]),
@@ -657,11 +649,10 @@ AC_DEFUN([AM_MAINTAINER_MODE],
 AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
   dnl maintainer-mode's default is 'disable' unless 'enable' is passed
   AC_ARG_ENABLE([maintainer-mode],
-    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
-      am_maintainer_other[ make rules and dependencies not useful
-      (and sometimes confusing) to the casual installer])],
-    [USE_MAINTAINER_MODE=$enableval],
-    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
   AC_MSG_RESULT([$USE_MAINTAINER_MODE])
   AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
   MAINT=$MAINTAINER_MODE_TRUE
@@ -673,13 +664,13 @@ AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 5
+# serial 4
 
 # AM_MAKE_INCLUDE()
 # -----------------
@@ -698,7 +689,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
+# Ignore all kinds of additional output from `make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -723,7 +714,8 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
-# Copyright (C) 1999-2012 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -759,13 +751,14 @@ m4_define([AC_PROG_CC],
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2012 Free Software Foundation, Inc.
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 7
+# serial 6
 
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
@@ -795,19 +788,49 @@ if eval "$MISSING --run true"; then
   am_missing_run="$MISSING --run "
 else
   am_missing_run=
-  AC_MSG_WARN(['missing' script is too old or missing])
+  AC_MSG_WARN([`missing' script is too old or missing])
 fi
 ])
 
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
+#
+# This file 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.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
 #
 # This file 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.
 
-# serial 6
+# serial 5
 
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
@@ -818,7 +841,7 @@ AC_DEFUN([_AM_MANGLE_OPTION],
 # --------------------
 # Set option NAME.  Presently that only means defining a flag for this option.
 AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
 
 # _AM_SET_OPTIONS(OPTIONS)
 # ------------------------
@@ -832,7 +855,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -853,18 +876,22 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2012 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 9
+# serial 5
 
 # AM_SANITY_CHECK
 # ---------------
 AC_DEFUN([AM_SANITY_CHECK],
 [AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -875,40 +902,32 @@ case `pwd` in
 esac
 case $srcdir in
   *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
 esac
 
-# Do 'set' in a subshell so we don't clobber the current shell's
+# Do `set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   am_has_slept=no
-   for am_try in 1 2; do
-     echo "timestamp, slept: $am_has_slept" > conftest.file
-     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-     if test "$[*]" = "X"; then
-	# -L didn't work.
-	set X `ls -t "$srcdir/configure" conftest.file`
-     fi
-     if test "$[*]" != "X $srcdir/configure conftest.file" \
-	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-	# If neither matched, then we have a broken ls.  This can happen
-	# if, for instance, CONFIG_SHELL is bash and it inherits a
-	# broken ls alias from the environment.  This has actually
-	# happened.  Such a system could not be considered "sane".
-	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-  alias in your environment])
-     fi
-     if test "$[2]" = conftest.file || test $am_try -eq 2; then
-       break
-     fi
-     # Just in case.
-     sleep 1
-     am_has_slept=yes
-   done
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
    test "$[2]" = conftest.file
    )
 then
@@ -918,52 +937,31 @@ else
    AC_MSG_ERROR([newly created file is older than distributed files!
 Check your system clock])
 fi
-AC_MSG_RESULT([yes])
-# If we didn't sleep, we still need to ensure time stamps of config.status and
-# generated files are strictly newer.
-am_sleep_pid=
-if grep 'slept: no' conftest.file >/dev/null 2>&1; then
-  ( sleep 1 ) &
-  am_sleep_pid=$!
-fi
-AC_CONFIG_COMMANDS_PRE(
-  [AC_MSG_CHECKING([that generated files are newer than configure])
-   if test -n "$am_sleep_pid"; then
-     # Hide warnings about reused PIDs.
-     wait $am_sleep_pid 2>/dev/null
-   fi
-   AC_MSG_RESULT([done])])
-rm -f conftest.file
-])
+AC_MSG_RESULT(yes)])
 
-# Copyright (C) 2009-2012 Free Software Foundation, Inc.
+# Copyright (C) 2009, 2011  Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 3
+# serial 2
 
 # AM_SILENT_RULES([DEFAULT])
 # --------------------------
 # Enable less verbose build rules; with the default set to DEFAULT
-# ("yes" being less verbose, "no" or empty being verbose).
+# (`yes' being less verbose, `no' or empty being verbose).
 AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules], [dnl
-AS_HELP_STRING(
-  [--enable-silent-rules],
-  [less verbose build output (undo: "make V=1")])
-AS_HELP_STRING(
-  [--disable-silent-rules],
-  [verbose build output (undo: "make V=0")])dnl
-])
-case $enable_silent_rules in @%:@ (((
-  yes) AM_DEFAULT_VERBOSITY=0;;
-   no) AM_DEFAULT_VERBOSITY=1;;
-    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+[AC_ARG_ENABLE([silent-rules],
+[  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')])
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
 esac
 dnl
-dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl A few `make' implementations (e.g., NonStop OS and NextStep)
 dnl do not support nested variable expansions.
 dnl See automake bug#9928 and bug#10237.
 am_make=${MAKE-make}
@@ -981,7 +979,7 @@ else
   am_cv_make_support_nested_variables=no
 fi])
 if test $am_cv_make_support_nested_variables = yes; then
-  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  dnl Using `$V' instead of `$(V)' breaks IRIX make.
   AM_V='$(V)'
   AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
 else
@@ -998,37 +996,37 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 2
+# serial 1
 
 # AM_PROG_INSTALL_STRIP
 # ---------------------
-# One issue with vendor 'install' (even GNU) is that you can't
+# One issue with vendor `install' (even GNU) is that you can't
 # specify the program used to strip binaries.  This is especially
 # annoying in cross-compiling environments, where the build's strip
 # is unlikely to handle the host's binaries.
 # Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in "make install-strip", and initialize
+# always use install-sh in `make install-strip', and initialize
 # STRIPPROG with the value of the STRIP variable (set by the user).
 AC_DEFUN([AM_PROG_INSTALL_STRIP],
 [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using 'strip' when the user
-# run "make install-strip".  However 'strip' might not be the right
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the 'STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
 if test "$cross_compiling" != no; then
   AC_CHECK_TOOL([STRIP], [strip], :)
 fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2012 Free Software Foundation, Inc.
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1049,18 +1047,18 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2012 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 3
+# serial 2
 
 # _AM_PROG_TAR(FORMAT)
 # --------------------
 # Check how to create a tarball in format FORMAT.
-# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+# FORMAT should be one of `v7', `ustar', or `pax'.
 #
 # Substitute a variable $(am__tar) that is a command
 # writing to stdout a FORMAT-tarball containing the directory
@@ -1083,7 +1081,7 @@ AC_MSG_CHECKING([how to create a $1 tar archive])
 _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
 _am_tools=${am_cv_prog_tar_$1-$_am_tools}
 # Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of '-'.
+# Solaris sh will not grok spaces in the rhs of `-'.
 for _am_tool in $_am_tools
 do
   case $_am_tool in
diff --git a/autogen.sh b/autogen.sh
index 8fc51d2..a576ed6 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -107,15 +107,19 @@ fi
 # Plug in the extension module
 #
 has_ext_mod=false
+ext_mod_args=''
 for PARAM; do
-    if test "$PARAM" = "--enable-extension-module" ; then
-		has_ext_mod=true
-	fi
+    if [[ $PARAM =~ "--enable-extension-module" ]] ; then
+        has_ext_mod=true
+        if [[ $PARAM =~ "=" ]] ; then
+            ext_mod_args=`echo $PARAM | cut -d= -f2`
+        fi
+    fi
 done
 
 if test x$has_ext_mod = xtrue; then
 	pushd ../mono-extensions/scripts
-	sh ./prepare-repo.sh || exit 1
+	sh ./prepare-repo.sh $ext_mod_args || exit 1
 	popd
 else
 	cat mono/mini/Makefile.am.in > mono/mini/Makefile.am
diff --git a/compile b/compile
index 7b4a9a7..862a14e 100755
--- a/compile
+++ b/compile
@@ -3,7 +3,8 @@
 
 scriptversion=2012-03-05.13; # UTC
 
-# Copyright (C) 1999-2012 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
+# Software Foundation, Inc.
 # Written by Tom Tromey <tromey at cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
diff --git a/config.guess b/config.guess
index de8e6dd..d622a44 100755
--- a/config.guess
+++ b/config.guess
@@ -138,16 +138,6 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
-case "${UNAME_MACHINE}" in
-  i?86)
-     test -z "$VENDOR" && VENDOR=pc
-     ;;
-  *)
-     test -z "$VENDOR" && VENDOR=unknown
-     ;;
-esac
-test -f /etc/SuSE-release -o -f /.buildenv && VENDOR=suse
-
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
@@ -212,19 +202,19 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	exit ;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-${VENDOR}-openbsd${UNAME_RELEASE}
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 	exit ;;
     *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-ekkobsd${UNAME_RELEASE}
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
     *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-solidbsd${UNAME_RELEASE}
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
 	exit ;;
     macppc:MirBSD:*:*)
-	echo powerpc-${VENDOR}-mirbsd${UNAME_RELEASE}
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
     *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-mirbsd${UNAME_RELEASE}
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
@@ -292,13 +282,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	echo alpha-dec-winnt3.5
 	exit ;;
     Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-${VENDOR}-sysv4
+	echo m68k-unknown-sysv4
 	exit ;;
     *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-amigaos
+	echo ${UNAME_MACHINE}-unknown-amigaos
 	exit ;;
     *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-morphos
+	echo ${UNAME_MACHINE}-unknown-morphos
 	exit ;;
     *:OS/390:*:*)
 	echo i370-ibm-openedition
@@ -313,7 +303,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	echo arm-acorn-riscix${UNAME_RELEASE}
 	exit ;;
     arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-${VENDOR}-riscos
+	echo arm-unknown-riscos
 	exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
 	echo hppa1.1-hitachi-hiuxmpp
@@ -421,7 +411,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	echo m68k-hades-mint${UNAME_RELEASE}
 	exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-	echo m68k-${VENDOR}-mint${UNAME_RELEASE}
+	echo m68k-unknown-mint${UNAME_RELEASE}
 	exit ;;
     m68k:machten:*:*)
 	echo m68k-apple-machten${UNAME_RELEASE}
@@ -732,9 +722,9 @@ EOF
 	exit ;;
     i*86:OSF1:*:*)
 	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-${VENDOR}-osf1mk
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
 	else
-	    echo ${UNAME_MACHINE}-${VENDOR}-osf1
+	    echo ${UNAME_MACHINE}-unknown-osf1
 	fi
 	exit ;;
     parisc*:Lites*:*:*)
@@ -794,18 +784,18 @@ EOF
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
 	exit ;;
     sparc*:BSD/OS:*:*)
-	echo sparc-${VENDOR}-bsdi${UNAME_RELEASE}
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
 	exit ;;
     *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-bsdi${UNAME_RELEASE}
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
 	exit ;;
     *:FreeBSD:*:*)
 	UNAME_PROCESSOR=`/usr/bin/uname -p`
 	case ${UNAME_PROCESSOR} in
 	    amd64)
-		echo x86_64-${VENDOR}-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	    *)
-		echo ${UNAME_PROCESSOR}-${VENDOR}-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	esac
 	exit ;;
     i*:CYGWIN*:*)
@@ -830,10 +820,10 @@ EOF
 		echo i586-pc-interix${UNAME_RELEASE}
 		exit ;;
 	    authenticamd | genuineintel | EM64T)
-		echo x86_64-${VENDOR}-interix${UNAME_RELEASE}
+		echo x86_64-unknown-interix${UNAME_RELEASE}
 		exit ;;
 	    IA64)
-		echo ia64-${VENDOR}-interix${UNAME_RELEASE}
+		echo ia64-unknown-interix${UNAME_RELEASE}
 		exit ;;
 	esac ;;
     [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
@@ -852,31 +842,31 @@ EOF
 	echo ${UNAME_MACHINE}-pc-uwin
 	exit ;;
     amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-${VENDOR}-cygwin
+	echo x86_64-unknown-cygwin
 	exit ;;
     p*:CYGWIN*:*)
-	echo powerpcle-${VENDOR}-cygwin
+	echo powerpcle-unknown-cygwin
 	exit ;;
     prep*:SunOS:5.*:*)
-	echo powerpcle-${VENDOR}-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
     *:GNU:*:*)
 	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-${VENDOR}-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-${VENDOR}-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
     aarch64:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     aarch64_be:Linux:*:*)
 	UNAME_MACHINE=aarch64_be
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
@@ -890,26 +880,26 @@ EOF
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
 	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu${LIBC}
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
 	exit ;;
     arm*:Linux:*:*)
 	eval $set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
 	else
 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
 		| grep -q __ARM_PCS_VFP
 	    then
-		echo ${UNAME_MACHINE}-${VENDOR}-linux-gnueabi
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
 	    else
-		echo ${UNAME_MACHINE}-${VENDOR}-linux-gnueabihf
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
 	    fi
 	fi
 	exit ;;
     avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     cris:Linux:*:*)
 	echo ${UNAME_MACHINE}-axis-linux-gnu
@@ -918,10 +908,10 @@ EOF
 	echo ${UNAME_MACHINE}-axis-linux-gnu
 	exit ;;
     frv:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     hexagon:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     i*86:Linux:*:*)
 	LIBC=gnu
@@ -935,13 +925,13 @@ EOF
 	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
 	exit ;;
     ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     mips:Linux:*:* | mips64:Linux:*:*)
 	eval $set_cc_for_build
@@ -960,54 +950,54 @@ EOF
 	#endif
 EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-${VENDOR}-linux-gnu"; exit; }
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 	;;
     or32:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     padre:Linux:*:*)
-	echo sparc-${VENDOR}-linux-gnu
+	echo sparc-unknown-linux-gnu
 	exit ;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-${VENDOR}-linux-gnu
+	echo hppa64-unknown-linux-gnu
 	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-${VENDOR}-linux-gnu ;;
-	  PA8*) echo hppa2.0-${VENDOR}-linux-gnu ;;
-	  *)    echo hppa-${VENDOR}-linux-gnu ;;
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
 	esac
 	exit ;;
     ppc64:Linux:*:*)
-	echo powerpc64-${VENDOR}-linux-gnu
+	echo powerpc64-unknown-linux-gnu
 	exit ;;
     ppc:Linux:*:*)
-	echo powerpc-${VENDOR}-linux-gnu
+	echo powerpc-unknown-linux-gnu
 	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
 	echo ${UNAME_MACHINE}-ibm-linux
 	exit ;;
     sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     vax:Linux:*:*)
 	echo ${UNAME_MACHINE}-dec-linux-gnu
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -1029,16 +1019,16 @@ EOF
 	echo ${UNAME_MACHINE}-pc-os2-emx
 	exit ;;
     i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-${VENDOR}-stop
+	echo ${UNAME_MACHINE}-unknown-stop
 	exit ;;
     i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-atheos
+	echo ${UNAME_MACHINE}-unknown-atheos
 	exit ;;
     i*86:syllable:*:*)
 	echo ${UNAME_MACHINE}-pc-syllable
 	exit ;;
     i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-${VENODR}-lynxos${UNAME_RELEASE}
+	echo i386-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
     i*86:*DOS:*:*)
 	echo ${UNAME_MACHINE}-pc-msdosdjgpp
@@ -1058,7 +1048,7 @@ EOF
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
 	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
 	esac
-	echo ${UNAME_MACHINE}-${VENDOR}-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
 	exit ;;
     i*86:*:3.2:*)
 	if test -f /usr/options/cb.name; then
@@ -1097,7 +1087,7 @@ EOF
 	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
 	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
 	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-${VENODR}-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
 	fi
 	exit ;;
     mini*:CTIX:SYS*5:*)
@@ -1134,19 +1124,19 @@ EOF
 	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
 	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-${VENDOR}-lynxos${UNAME_RELEASE}
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
     mc68030:UNIX_System_V:4.*:*)
 	echo m68k-atari-sysv4
 	exit ;;
     TSUNAMI:LynxOS:2.*:*)
-	echo sparc-${VENDOR}-lynxos${UNAME_RELEASE}
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
     rs6000:LynxOS:2.*:*)
-	echo rs6000-${VENDOR}-lynxos${UNAME_RELEASE}
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
     PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-${VENDOR}-lynxos${UNAME_RELEASE}
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
     SM[BE]S:UNIX_SV:*:*)
 	echo mips-dde-sysv${UNAME_RELEASE}
@@ -1196,7 +1186,7 @@ EOF
 	if [ -d /usr/nec ]; then
 		echo mips-nec-sysv${UNAME_RELEASE}
 	else
-		echo mips-${VENDOR}-sysv${UNAME_RELEASE}
+		echo mips-unknown-sysv${UNAME_RELEASE}
 	fi
 	exit ;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
@@ -1290,13 +1280,13 @@ EOF
 	else
 	    UNAME_MACHINE="$cputype"
 	fi
-	echo ${UNAME_MACHINE}-${VENDOR}-plan9
+	echo ${UNAME_MACHINE}-unknown-plan9
 	exit ;;
     *:TOPS-10:*:*)
-	echo pdp10-${VENDOR}-tops10
+	echo pdp10-unknown-tops10
 	exit ;;
     *:TENEX:*:*)
-	echo pdp10-${VENDOR}-tenex
+	echo pdp10-unknown-tenex
 	exit ;;
     KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
 	echo pdp10-dec-tops20
@@ -1305,16 +1295,16 @@ EOF
 	echo pdp10-xkl-tops20
 	exit ;;
     *:TOPS-20:*:*)
-	echo pdp10-${VENDOR}-tops20
+	echo pdp10-unknown-tops20
 	exit ;;
     *:ITS:*:*)
-	echo pdp10-${VENDOR}-its
+	echo pdp10-unknown-its
 	exit ;;
     SEI:*:*:SEIUX)
 	echo mips-sei-seiux${UNAME_RELEASE}
 	exit ;;
     *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit ;;
     *:*VMS:*:*)
 	UNAME_MACHINE=`(uname -p) 2>/dev/null`
@@ -1336,7 +1326,7 @@ EOF
 	echo ${UNAME_MACHINE}-pc-aros
 	exit ;;
     x86_64:VMkernel:*:*)
-	echo ${UNAME_MACHINE}-${VENDOR}-esx
+	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
 esac
 
diff --git a/config.h.in b/config.h.in
index 6394084..b839fd0 100644
--- a/config.h.in
+++ b/config.h.in
@@ -181,6 +181,34 @@
 /* Define to 1 if you have the <curses.h> header file. */
 #undef HAVE_CURSES_H
 
+/* Define to 1 if you have the declaration of `InterlockedAdd', and to 0 if
+   you don't. */
+#undef HAVE_DECL_INTERLOCKEDADD
+
+/* Define to 1 if you have the declaration of `InterlockedAdd64', and to 0 if
+   you don't. */
+#undef HAVE_DECL_INTERLOCKEDADD64
+
+/* Define to 1 if you have the declaration of `InterlockedCompareExchange64',
+   and to 0 if you don't. */
+#undef HAVE_DECL_INTERLOCKEDCOMPAREEXCHANGE64
+
+/* Define to 1 if you have the declaration of `InterlockedDecrement64', and to
+   0 if you don't. */
+#undef HAVE_DECL_INTERLOCKEDDECREMENT64
+
+/* Define to 1 if you have the declaration of `InterlockedExchange64', and to
+   0 if you don't. */
+#undef HAVE_DECL_INTERLOCKEDEXCHANGE64
+
+/* Define to 1 if you have the declaration of `InterlockedIncrement64', and to
+   0 if you don't. */
+#undef HAVE_DECL_INTERLOCKEDINCREMENT64
+
+/* Define to 1 if you have the declaration of `__readfsdword', and to 0 if you
+   don't. */
+#undef HAVE_DECL___READFSDWORD
+
 /* Support for the deprecated attribute */
 #undef HAVE_DEPRECATED
 
@@ -547,6 +575,9 @@
 /* Define to 1 if you have the `sethostname' function. */
 #undef HAVE_SETHOSTNAME
 
+/* Define to 1 if you have the `setpgid' function. */
+#undef HAVE_SETPGID
+
 /* Define to 1 if you have the `setpriority' function. */
 #undef HAVE_SETPRIORITY
 
@@ -691,6 +722,9 @@
 /* Define to 1 if you have the <sys/epoll.h> header file. */
 #undef HAVE_SYS_EPOLL_H
 
+/* Define to 1 if you have the <sys/event.h> header file. */
+#undef HAVE_SYS_EVENT_H
+
 /* Define to 1 if you have the <sys/extattr.h> header file. */
 #undef HAVE_SYS_EXTATTR_H
 
diff --git a/config.sub b/config.sub
index 59bb593..6205f84 100755
--- a/config.sub
+++ b/config.sub
@@ -1543,6 +1543,9 @@ case $basic_machine in
 	c4x-* | tic4x-*)
 		os=-coff
 		;;
+	hexagon-*)
+		os=-elf
+		;;
 	tic54x-*)
 		os=-coff
 		;;
diff --git a/configure b/configure
index 1e26a05..3215ec7 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for mono 3.2.3.
+# Generated by GNU Autoconf 2.69 for mono 3.2.8.
 #
 # Report bugs to <http://bugzilla.xamarin.com/enter_bug.cgi?classification=Mono>.
 #
@@ -591,12 +591,12 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='mono'
 PACKAGE_TARNAME='mono'
-PACKAGE_VERSION='3.2.3'
-PACKAGE_STRING='mono 3.2.3'
+PACKAGE_VERSION='3.2.8'
+PACKAGE_STRING='mono 3.2.8'
 PACKAGE_BUGREPORT='http://bugzilla.xamarin.com/enter_bug.cgi?classification=Mono'
 PACKAGE_URL=''
 
-ac_unique_file="README"
+ac_unique_file="README.md"
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
@@ -705,8 +705,6 @@ BUILD_MCS_FALSE
 BUILD_MCS_TRUE
 docs_dir
 LIBMONO_LA
-MONO_DEBUGGER_SUPPORTED_FALSE
-MONO_DEBUGGER_SUPPORTED_TRUE
 libsuffix
 XMKMF
 USE_JIT_FALSE
@@ -999,9 +997,10 @@ enable_nacl_codegen
 enable_nacl_gc
 enable_llvm
 enable_loadedllvm
+enable_llvm_version_check
+with_llvm
 with_sgen
 with_x
-enable_mono_debugger
 enable_icall_symbol_map
 enable_icall_export
 enable_icall_tables
@@ -1573,7 +1572,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures mono 3.2.3 to adapt to many kinds of systems.
+\`configure' configures mono 3.2.8 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1648,7 +1647,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mono 3.2.3:";;
+     short | recursive ) echo "Configuration of mono 3.2.8:";;
    esac
   cat <<\_ACEOF
 
@@ -1656,15 +1655,12 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-maintainer-mode
-                          enable make rules and dependencies not useful (and
-                          sometimes confusing) to the casual installer
-  --enable-silent-rules   less verbose build output (undo: "make V=1")
-  --disable-silent-rules  verbose build output (undo: "make V=0")
-  --enable-dependency-tracking
-                          do not reject slow dependency extractors
-  --disable-dependency-tracking
-                          speeds up one-time build
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer
+  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
   --enable-shared[=PKGS]  build shared libraries [default=yes]
   --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
@@ -1682,7 +1678,7 @@ Optional Features:
      reflection_emit, reflection_emit_save, large_code, logging, com, ssa, generics, attach, jit, simd, soft_debug, perfcounters, normalization, assembly_remapping, shared_perfcounters, remoting,
 	 security, sgen_remset, sgen_marksweep_par, sgen_marksweep_fixed, sgen_marksweep_fixed_par, sgen_copying.
   --disable-executables disable the build of the runtime executables
-  --enable-extension-module enables usage of the extension module
+  --enable-extension-module=LIST enable the core-extensions from LIST
   --enable-parallel-mark     Enables GC Parallel Marking
   --disable-boehm            Disable the Boehm GC.
   --disable-dev-random    disable the use of the random device (enabled by default)
@@ -1695,7 +1691,7 @@ Optional Features:
   --enable-nacl-gc           Enable Native Client garbage collection
   --enable-llvm	Enable the LLVM back-end
   --enable-loadedllvm	Load the LLVM back-end dynamically
-  --disable-mono-debugger disable support for the mdb debugger
+  --enable-llvm-version-check Check that the LLVM matches the version expected by mono
   --enable-icall-symbol-map Generate tables which map icall functions to their C symbols
   --enable-icall-export Export icall functions
   --disable-icall-tables Disable the runtime lookup of icalls
@@ -1723,6 +1719,7 @@ Optional Packages:
   --with-xen_opt=yes,no          Enable Xen-specific behaviour (defaults to yes)
   --with-large-heap=yes,no       Enable support for GC heaps larger than 3GB (defaults to no)
   --with-ikvm-native=yes,no      build the IKVM JNI interface library (defaults to yes)
+  --with-llvm=<llvm prefix>    Enable the LLVM back-end
   --with-sgen=yes,no             Extra Generational GC, default=yes
   --with-x                use the X Window System
   --with-profile2=yes,no          If you want to install the 2.0/3.5 FX (defaults to yes)
@@ -1818,7 +1815,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mono configure 3.2.3
+mono configure 3.2.8
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2598,11 +2595,57 @@ $as_echo "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_member
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by mono $as_me 3.2.3, which was
+It was created by mono $as_me 3.2.8, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3099,7 +3142,7 @@ test -n "$target_alias" &&
 # The extra brackets are to foil regex-based scans.
 
 
-am__api_version='1.12'
+am__api_version='1.11'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -3196,6 +3239,9 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
 $as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -3206,40 +3252,32 @@ case `pwd` in
 esac
 case $srcdir in
   *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
 esac
 
-# Do 'set' in a subshell so we don't clobber the current shell's
+# Do `set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   am_has_slept=no
-   for am_try in 1 2; do
-     echo "timestamp, slept: $am_has_slept" > conftest.file
-     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-     if test "$*" = "X"; then
-	# -L didn't work.
-	set X `ls -t "$srcdir/configure" conftest.file`
-     fi
-     if test "$*" != "X $srcdir/configure conftest.file" \
-	&& test "$*" != "X conftest.file $srcdir/configure"; then
-
-	# If neither matched, then we have a broken ls.  This can happen
-	# if, for instance, CONFIG_SHELL is bash and it inherits a
-	# broken ls alias from the environment.  This has actually
-	# happened.  Such a system could not be considered "sane".
-	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-  alias in your environment" "$LINENO" 5
-     fi
-     if test "$2" = conftest.file || test $am_try -eq 2; then
-       break
-     fi
-     # Just in case.
-     sleep 1
-     am_has_slept=yes
-   done
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
    test "$2" = conftest.file
    )
 then
@@ -3251,16 +3289,6 @@ Check your system clock" "$LINENO" 5
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-# If we didn't sleep, we still need to ensure time stamps of config.status and
-# generated files are strictly newer.
-am_sleep_pid=
-if grep 'slept: no' conftest.file >/dev/null 2>&1; then
-  ( sleep 1 ) &
-  am_sleep_pid=$!
-fi
-
-rm -f conftest.file
-
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
@@ -3287,8 +3315,8 @@ if eval "$MISSING --run true"; then
   am_missing_run="$MISSING --run "
 else
   am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
 fi
 
 if test x"${install_sh}" != xset; then
@@ -3300,10 +3328,10 @@ if test x"${install_sh}" != xset; then
   esac
 fi
 
-# Installed binaries are usually stripped using 'strip' when the user
-# run "make install-strip".  However 'strip' might not be the right
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the 'STRIP' environment variable to overrule this program.
+# will honor the `STRIP' environment variable to overrule this program.
 if test "$cross_compiling" != no; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
@@ -3442,6 +3470,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
 $as_echo "$MKDIR_P" >&6; }
 
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -3546,7 +3580,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='mono'
- VERSION='3.2.3'
+ VERSION='3.2.8'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3574,7 +3608,6 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
-mkdir_p="$MKDIR_P"
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
@@ -3588,7 +3621,7 @@ $as_echo_n "checking how to create a ustar tar archive... " >&6; }
 _am_tools='gnutar plaintar pax cpio none'
 _am_tools=${am_cv_prog_tar_ustar-$_am_tools}
 # Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of '-'.
+# Solaris sh will not grok spaces in the rhs of `-'.
 for _am_tool in $_am_tools
 do
   case $_am_tool in
@@ -3714,10 +3747,10 @@ if test "${enable_silent_rules+set}" = set; then :
   enableval=$enable_silent_rules;
 fi
 
-case $enable_silent_rules in # (((
-  yes) AM_DEFAULT_VERBOSITY=0;;
-   no) AM_DEFAULT_VERBOSITY=1;;
-    *) AM_DEFAULT_VERBOSITY=0;;
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=0;;
 esac
 am_make=${MAKE-make}
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
@@ -3956,6 +3989,11 @@ $as_echo "#define TARGET_ANDROID 1" >>confdefs.h
 		CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
 		CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
 
+		# The configure check can't detect this
+
+$as_echo "#define HAVE_LARGE_FILE_SUPPORT 1" >>confdefs.h
+
+
 		# to bypass the underscore linker check, can't work when cross-compiling
 		mono_cv_uscore=yes
 		mono_cv_clang=no
@@ -4059,10 +4097,8 @@ $as_echo "#define USE_MACH_SEMA 1" >>confdefs.h
 				CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
 				CPPFLAGS_FOR_EGLIB="$CPPFLAGS_FOR_EGLIB $BROKEN_DARWIN_CPPFLAGS"
 				CFLAGS_FOR_EGLIB="$CFLAGS_FOR_EGLIB $BROKEN_DARWIN_FLAGS"
-				extra_runtime_ldflags="-stack_size,0x800000"
 				;;
 			x*64-*-darwin*)
-				extra_runtime_ldflags="-stack_size,0x800000"
 				;;
 			arm*-darwin*)
 				has_dtrace=no
@@ -5046,7 +5082,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
+# Ignore all kinds of additional output from `make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -5102,8 +5138,8 @@ else
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named 'D' -- because '-MD' means "put the output
-  # in D".
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
   rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
@@ -5138,16 +5174,16 @@ else
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
-      # Solaris 10 /bin/sh.
-      echo '/* dummy */' > sub/conftst$i.h
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle '-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs.
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -5156,8 +5192,8 @@ else
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # After this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested.
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
       if test "x$enable_dependency_tracking" = xyes; then
 	continue
       else
@@ -5165,7 +5201,7 @@ else
       fi
       ;;
     msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok '-c -o', but also, the minuso test has
+      # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -5579,8 +5615,8 @@ else
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named 'D' -- because '-MD' means "put the output
-  # in D".
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
   rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
@@ -5615,16 +5651,16 @@ else
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
-      # Solaris 10 /bin/sh.
-      echo '/* dummy */' > sub/conftst$i.h
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle '-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs.
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -5633,8 +5669,8 @@ else
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # After this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested.
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
       if test "x$enable_dependency_tracking" = xyes; then
 	continue
       else
@@ -5642,7 +5678,7 @@ else
       fi
       ;;
     msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok '-c -o', but also, the minuso test has
+      # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -5714,8 +5750,8 @@ else
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named 'D' -- because '-MD' means "put the output
-  # in D".
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
   rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
@@ -5748,16 +5784,16 @@ else
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
-      # Solaris 10 /bin/sh.
-      echo '/* dummy */' > sub/conftst$i.h
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle '-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs.
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -5766,8 +5802,8 @@ else
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # After this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested.
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
       if test "x$enable_dependency_tracking" = xyes; then
 	continue
       else
@@ -5775,7 +5811,7 @@ else
       fi
       ;;
     msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok '-c -o', but also, the minuso test has
+      # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -7802,10 +7838,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -7844,11 +7876,11 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
   else
@@ -10526,7 +10558,7 @@ lt_prog_compiler_static=
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -11004,6 +11036,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
   esac
 
   ld_shlibs=yes
@@ -11225,7 +11260,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
@@ -11402,6 +11437,7 @@ _LT_EOF
 	if test "$aix_use_runtimelinking" = yes; then
 	  shared_flag="$shared_flag "'${wl}-G'
 	fi
+	link_all_deplibs=no
       else
 	# not using gcc
 	if test "$host_cpu" = ia64; then
@@ -11855,7 +11891,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       link_all_deplibs=yes
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -12692,17 +12728,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -12819,7 +12844,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -12883,6 +12908,18 @@ fi
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -14630,9 +14667,6 @@ fi
         ld_shlibs_CXX=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
         archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
         link_all_deplibs_CXX=yes
@@ -14794,7 +14828,7 @@ fi
         inherit_rpath_CXX=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
 	    # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -15654,7 +15688,7 @@ lt_prog_compiler_static_CXX=
 	    ;;
 	esac
 	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
 	case $cc_basename in
 	  KCC*)
 	    # KAI C++ Compiler
@@ -15718,7 +15752,7 @@ lt_prog_compiler_static_CXX=
 	    ;;
 	esac
 	;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
 	;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -16089,6 +16123,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
       ;;
     esac
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
   *)
     export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
     ;;
@@ -16523,17 +16560,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -16650,7 +16676,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -16714,6 +16740,18 @@ fi
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -19813,13 +19851,22 @@ else
 fi
 
 
+has_extension_module=no
 # Check whether --enable-extension-module was given.
 if test "${enable_extension_module+set}" = set; then :
-  enableval=$enable_extension_module; has_extension_module=$enableval
-else
-  has_extension_module=no
+  enableval=$enable_extension_module;
+	for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
+		if test x$extension = xdefault ; then
+			has_extension_module=yes;
+		fi
+	done
+	if test x$enable_extension_module = xyes; then
+		has_extension_module=yes;
+	fi
+
 fi
 
+
  if test x$has_extension_module != xno; then
   HAS_EXTENSION_MODULE_TRUE=
   HAS_EXTENSION_MODULE_FALSE='#'
@@ -20157,6 +20204,11 @@ $as_echo "#define HAVE_GC_ALLOW_REGISTER_THREADS 1" >>confdefs.h
 
 		BOEHM_DEFINES="-DHAVE_BOEHM_GC -DHAVE_GC_H -DUSE_INCLUDED_LIBGC -DHAVE_GC_GCJ_MALLOC -DHAVE_GC_ENABLE"
 
+		if test x$target_win32 = xyes; then
+			BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
+			CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
+		fi
+
 		gc_msg="bundled Boehm GC with typed GC"
 		if test x$enable_parallel_mark = xyes; then
 
@@ -21832,6 +21884,9 @@ $as_echo_n "checking for working __thread... " >&6; }
 	if test "x$with_tls" != "x__thread"; then
 		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
 $as_echo "disabled" >&6; }
+	elif test "x$cross_compiling" = "xyes"; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: cross compiling" >&5
+$as_echo "cross compiling" >&6; }
 	else
 		if test "$cross_compiling" = yes; then :
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
@@ -21898,6 +21953,9 @@ $as_echo_n "checking for working sigaltstack... " >&6; }
 	if test "x$with_sigaltstack" != "xyes"; then
 		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
 $as_echo "disabled" >&6; }
+	elif test "x$cross_compiling" = "xyes"; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: cross compiling" >&5
+$as_echo "cross compiling" >&6; }
 	else
 		if test "$cross_compiling" = yes; then :
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
@@ -22433,38 +22491,32 @@ $as_echo "#define HAVE_EPOLL 1" >>confdefs.h
 	fi
 
 	havekqueue=no
-        for ac_func in kqueue
+
+	for ac_header in sys/event.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/event.h" "ac_cv_header_sys_event_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_event_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_EVENT_H 1
+_ACEOF
+
+fi
+
+done
+
+	for ac_func in kqueue
 do :
   ac_fn_c_check_func "$LINENO" "kqueue" "ac_cv_func_kqueue"
 if test "x$ac_cv_func_kqueue" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_KQUEUE 1
 _ACEOF
-
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kqueue in sys/event.h" >&5
-$as_echo_n "checking for kqueue in sys/event.h... " >&6; }
-                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/event.h>
-int
-main ()
-{
- kqueue();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  havekqueue=yes
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+ havekqueue=yes
 fi
 done
 
 
-								if test x$havekqueue = xyes; then
+								if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
 		if x$platform_darwin = xno; then
 
 $as_echo "#define USE_KQUEUE_FOR_THREADPOOL 1" >>confdefs.h
@@ -23229,6 +23281,17 @@ _ACEOF
 fi
 done
 
+	for ac_func in setpgid
+do :
+  ac_fn_c_check_func "$LINENO" "setpgid" "ac_cv_func_setpgid"
+if test "x$ac_cv_func_setpgid" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SETPGID 1
+_ACEOF
+
+fi
+done
+
 	# The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
 # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
@@ -24002,6 +24065,90 @@ _ACEOF
 fi
 done
 
+	ac_fn_c_check_decl "$LINENO" "InterlockedExchange64" "ac_cv_have_decl_InterlockedExchange64" "#include <windows.h>
+"
+if test "x$ac_cv_have_decl_InterlockedExchange64" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_INTERLOCKEDEXCHANGE64 $ac_have_decl
+_ACEOF
+
+	ac_fn_c_check_decl "$LINENO" "InterlockedCompareExchange64" "ac_cv_have_decl_InterlockedCompareExchange64" "#include <windows.h>
+"
+if test "x$ac_cv_have_decl_InterlockedCompareExchange64" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_INTERLOCKEDCOMPAREEXCHANGE64 $ac_have_decl
+_ACEOF
+
+	ac_fn_c_check_decl "$LINENO" "InterlockedDecrement64" "ac_cv_have_decl_InterlockedDecrement64" "#include <windows.h>
+"
+if test "x$ac_cv_have_decl_InterlockedDecrement64" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_INTERLOCKEDDECREMENT64 $ac_have_decl
+_ACEOF
+
+	ac_fn_c_check_decl "$LINENO" "InterlockedIncrement64" "ac_cv_have_decl_InterlockedIncrement64" "#include <windows.h>
+"
+if test "x$ac_cv_have_decl_InterlockedIncrement64" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_INTERLOCKEDINCREMENT64 $ac_have_decl
+_ACEOF
+
+	ac_fn_c_check_decl "$LINENO" "InterlockedAdd" "ac_cv_have_decl_InterlockedAdd" "#include <windows.h>
+"
+if test "x$ac_cv_have_decl_InterlockedAdd" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_INTERLOCKEDADD $ac_have_decl
+_ACEOF
+
+	ac_fn_c_check_decl "$LINENO" "InterlockedAdd64" "ac_cv_have_decl_InterlockedAdd64" "#include <windows.h>
+"
+if test "x$ac_cv_have_decl_InterlockedAdd64" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_INTERLOCKEDADD64 $ac_have_decl
+_ACEOF
+
+	ac_fn_c_check_decl "$LINENO" "__readfsdword" "ac_cv_have_decl___readfsdword" "#include <windows.h>
+"
+if test "x$ac_cv_have_decl___readfsdword" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL___READFSDWORD $ac_have_decl
+_ACEOF
+
 fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5
@@ -24553,9 +24700,29 @@ else
   enable_loadedllvm=no
 fi
 
+# Check whether --enable-llvm-version-check was given.
+if test "${enable_llvm_version_check+set}" = set; then :
+  enableval=$enable_llvm_version_check; enable_llvm_version_check=$enableval
+else
+  enable_llvm_version_check=no
+fi
+
+
+
+# Check whether --with-llvm was given.
+if test "${with_llvm+set}" = set; then :
+  withval=$with_llvm; enable_llvm=yes
+fi
+
 
 if test "x$enable_llvm" = "xyes"; then
-   # Extract the first word of "llvm-config", so it can be a program name with args.
+   if test "x$with_llvm" != "x"; then
+   	  LLVM_CONFIG=$with_llvm/bin/llvm-config
+	  if test ! -x $LLVM_CONFIG; then
+	  	 as_fn_error $? "LLVM executable $LLVM_CONFIG not found." "$LINENO" 5
+      fi
+   else
+      # Extract the first word of "llvm-config", so it can be a program name with args.
 set dummy llvm-config; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
@@ -24596,8 +24763,9 @@ $as_echo "no" >&6; }
 fi
 
 
-   if test "x$LLVM_CONFIG" = "xno"; then
-   	  as_fn_error $? "llvm-config not found." "$LINENO" 5
+      if test "x$LLVM_CONFIG" = "xno"; then
+   	     as_fn_error $? "llvm-config not found." "$LINENO" 5
+      fi
    fi
 
    llvm_codegen="x86codegen"
@@ -24621,6 +24789,8 @@ fi
    fi
    LLVM_LIBS="$LLVM_LDFLAGS $LLVM_LIBS -lstdc++"
 
+   expected_llvm_version="3.4svn-mono-mono/e656cac"
+
    # Should be something like '2.6' or '2.7svn'
    llvm_version=`$LLVM_CONFIG --version`
    major_version=`echo $llvm_version | cut -c 1`
@@ -24634,6 +24804,11 @@ $as_echo "$llvm_version" >&6; }
 $as_echo "#define LLVM_MONO_BRANCH 1" >>confdefs.h
 
 	  LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_MONO_BRANCH"
+	  if test "x$enable_llvm_version_check" == "xyes"; then
+	  	 if test "$llvm_version" != "$expected_llvm_version"; then
+	  	 	as_fn_error $? "Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version\"" "$LINENO" 5
+	  	 fi
+	  fi
    else
 	  as_fn_error $? "Compiling with stock LLVM is not supported, please use the Mono LLVM repo at https://github.com/mono/llvm, with the GIT branch which matches this version of mono, i.e. 'mono-2-10' for Mono 2.10." "$LINENO" 5
    fi
@@ -24706,10 +24881,6 @@ jit_wanted=true
 interp_wanted=false
 sgen_supported=false
 case "$host" in
-#	mips-sgi-irix5.* | mips-sgi-irix6.*)
-#		TARGET=MIPS;
-#		ACCESS_UNALIGNED="no"
-#		;;
 	mips*)
 		TARGET=MIPS;
 		arch_target=mips;
@@ -25142,7 +25313,7 @@ esac
 
 if test x$GCC = "xyes"; then
 	case $TARGET in
-	X86 | AMD64 | ARM | POWERPC | POWERPC64 | MIPS)
+	X86 | AMD64 | ARM | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
 
 $as_echo "#define USE_GCC_ATOMIC_OPS 1" >>confdefs.h
 
@@ -25565,54 +25736,6 @@ $as_echo "$as_me: WARNING: Disabling usage of __thread." >&2;};
 	fi
 fi
 
-mono_debugger_supported=no
-# Check whether --enable-mono-debugger was given.
-if test "${enable_mono_debugger+set}" = set; then :
-  enableval=$enable_mono_debugger; try_mono_debugger=$enableval
-else
-  try_mono_debugger=yes
-fi
-
-if test "x$try_mono_debugger" = "xyes"; then
-	if test "x$TARGET" = "xAMD64" -o "x$TARGET" = "xX86" -o "x$TARGET" = "xS390x"; then
-		if test x$use_included_gc = xyes; then
-			case "$host" in
-			*-*-*linux*)
-				mono_debugger_supported=yes
-				;;
-			*86-apple-darwin*)
-				mono_debugger_supported=yes
-				;;
-			esac
-		fi
-	fi
-fi
-
-# disable the debugger entirely when building with moonlight
-if test "x$with_moonlight" != "xno"; then
-	mono_debugger_supported=no
-fi
-
-# mdb support for sgen is broken, disable it until further notice.
-mono_debugger_supported=no
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the Mono Debugger is supported on this platform" >&5
-$as_echo_n "checking if the Mono Debugger is supported on this platform... " >&6; }
-if test "x$mono_debugger_supported" = "xyes"; then
-	BOEHM_DEFINES="$BOEHM_DEFINES -DMONO_DEBUGGER_SUPPORTED"
-	CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DMONO_DEBUGGER_SUPPORTED"
-fi
- if test x$mono_debugger_supported = xyes; then
-  MONO_DEBUGGER_SUPPORTED_TRUE=
-  MONO_DEBUGGER_SUPPORTED_FALSE='#'
-else
-  MONO_DEBUGGER_SUPPORTED_TRUE='#'
-  MONO_DEBUGGER_SUPPORTED_FALSE=
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mono_debugger_supported" >&5
-$as_echo "$mono_debugger_supported" >&6; }
-
 # Check whether --enable-icall-symbol-map was given.
 if test "${enable_icall_symbol_map+set}" = set; then :
   enableval=$enable_icall_symbol_map; icall_symbol_map=$enableval
@@ -25805,6 +25928,8 @@ if ac_fn_c_try_compile "$LINENO"; then :
 
 		arm_v5=yes
 
+		arm_ver=ARMv5
+
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
@@ -25829,6 +25954,8 @@ if ac_fn_c_try_compile "$LINENO"; then :
 		arm_v5=yes
 		arm_v6=yes
 
+		arm_ver=ARMv6
+
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
@@ -25854,9 +25981,14 @@ if ac_fn_c_try_compile "$LINENO"; then :
 		arm_v6=yes
 		arm_v7=yes
 
+		arm_ver=ARMv7
+
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $arm_ver" >&5
+$as_echo "$arm_ver" >&6; }
+
 	if test x$arm_v5 = xyes; then
 
 $as_echo "#define HAVE_ARMV5 1" >>confdefs.h
@@ -26376,6 +26508,12 @@ ac_config_commands="$ac_config_commands runtime/etc/mono/browscap.ini"
 ac_config_commands="$ac_config_commands runtime/etc/mono/2.0/Browsers/Compat.browser"
 
 
+ac_config_commands="$ac_config_commands runtime/etc/mono/4.0/Browsers/Compat.browser"
+
+
+ac_config_commands="$ac_config_commands runtime/etc/mono/4.5/Browsers/Compat.browser"
+
+
 ac_config_commands="$ac_config_commands runtime/etc/mono/4.0/machine.config"
 
 
@@ -26391,7 +26529,7 @@ ac_config_commands="$ac_config_commands runtime/etc/mono/4.5/web.config"
 ac_config_commands="$ac_config_commands quiet-libtool"
 
 
-ac_config_files="$ac_config_files Makefile mono-core.spec mono-uninstalled.pc scripts/mono-find-provides scripts/mono-find-requires mono/Makefile mono/utils/Makefile mono/metadata/Makefile mono/dis/Makefile mono/cil/Makefile mono/arch/Makefile mono/arch/x86/Makefile mono/arch/amd64/Makefile mono/arch/ppc/Makefile mono/arch/sparc/Makefile mono/arch/s390x/Makefile mono/arch/arm/Makefile mono/arch/ia64/Makefile mono/arch/mips/Makefile mono/interpreter/Makefile mono/tests/Makefile mono/tests [...]
+ac_config_files="$ac_config_files Makefile mono-core.spec mono-uninstalled.pc scripts/mono-find-provides scripts/mono-find-requires mono/Makefile mono/utils/Makefile mono/metadata/Makefile mono/dis/Makefile mono/cil/Makefile mono/arch/Makefile mono/arch/x86/Makefile mono/arch/amd64/Makefile mono/arch/ppc/Makefile mono/arch/sparc/Makefile mono/arch/s390x/Makefile mono/arch/arm/Makefile mono/arch/ia64/Makefile mono/arch/mips/Makefile mono/interpreter/Makefile mono/tests/Makefile mono/tests [...]
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -26502,14 +26640,6 @@ LIBOBJS=$ac_libobjs
 LTLIBOBJS=$ac_ltlibobjs
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
-$as_echo_n "checking that generated files are newer than configure... " >&6; }
-   if test -n "$am_sleep_pid"; then
-     # Hide warnings about reused PIDs.
-     wait $am_sleep_pid 2>/dev/null
-   fi
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
-$as_echo "done" >&6; }
  if test -n "$EXEEXT"; then
   am__EXEEXT_TRUE=
   am__EXEEXT_FALSE='#'
@@ -26646,10 +26776,6 @@ if test -z "${USE_JIT_TRUE}" && test -z "${USE_JIT_FALSE}"; then
   as_fn_error $? "conditional \"USE_JIT\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${MONO_DEBUGGER_SUPPORTED_TRUE}" && test -z "${MONO_DEBUGGER_SUPPORTED_FALSE}"; then
-  as_fn_error $? "conditional \"MONO_DEBUGGER_SUPPORTED\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${BUILD_MCS_TRUE}" && test -z "${BUILD_MCS_FALSE}"; then
   as_fn_error $? "conditional \"BUILD_MCS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -27159,7 +27285,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mono $as_me 3.2.3, which was
+This file was extended by mono $as_me 3.2.8, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -27225,7 +27351,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mono config.status 3.2.3
+mono config.status 3.2.8
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -27738,6 +27864,8 @@ LN_S='$LN_S'
 LN_S='$LN_S'
 LN_S='$LN_S'
 LN_S='$LN_S'
+LN_S='$LN_S'
+LN_S='$LN_S'
 
 _ACEOF
 
@@ -27759,6 +27887,8 @@ do
     "runtime/etc/mono/2.0/web.config") CONFIG_COMMANDS="$CONFIG_COMMANDS runtime/etc/mono/2.0/web.config" ;;
     "runtime/etc/mono/browscap.ini") CONFIG_COMMANDS="$CONFIG_COMMANDS runtime/etc/mono/browscap.ini" ;;
     "runtime/etc/mono/2.0/Browsers/Compat.browser") CONFIG_COMMANDS="$CONFIG_COMMANDS runtime/etc/mono/2.0/Browsers/Compat.browser" ;;
+    "runtime/etc/mono/4.0/Browsers/Compat.browser") CONFIG_COMMANDS="$CONFIG_COMMANDS runtime/etc/mono/4.0/Browsers/Compat.browser" ;;
+    "runtime/etc/mono/4.5/Browsers/Compat.browser") CONFIG_COMMANDS="$CONFIG_COMMANDS runtime/etc/mono/4.5/Browsers/Compat.browser" ;;
     "runtime/etc/mono/4.0/machine.config") CONFIG_COMMANDS="$CONFIG_COMMANDS runtime/etc/mono/4.0/machine.config" ;;
     "runtime/etc/mono/4.0/web.config") CONFIG_COMMANDS="$CONFIG_COMMANDS runtime/etc/mono/4.0/web.config" ;;
     "runtime/etc/mono/4.5/machine.config") CONFIG_COMMANDS="$CONFIG_COMMANDS runtime/etc/mono/4.5/machine.config" ;;
@@ -27809,6 +27939,8 @@ do
     "data/net_4_0/Makefile") CONFIG_FILES="$CONFIG_FILES data/net_4_0/Makefile" ;;
     "data/net_4_5/Makefile") CONFIG_FILES="$CONFIG_FILES data/net_4_5/Makefile" ;;
     "data/net_2_0/Browsers/Makefile") CONFIG_FILES="$CONFIG_FILES data/net_2_0/Browsers/Makefile" ;;
+    "data/net_4_0/Browsers/Makefile") CONFIG_FILES="$CONFIG_FILES data/net_4_0/Browsers/Makefile" ;;
+    "data/net_4_5/Browsers/Makefile") CONFIG_FILES="$CONFIG_FILES data/net_4_5/Browsers/Makefile" ;;
     "data/mint.pc") CONFIG_FILES="$CONFIG_FILES data/mint.pc" ;;
     "data/mono-2.pc") CONFIG_FILES="$CONFIG_FILES data/mono-2.pc" ;;
     "data/monosgen-2.pc") CONFIG_FILES="$CONFIG_FILES data/monosgen-2.pc" ;;
@@ -28448,7 +28580,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named 'Makefile.in', but
+    # We used to match only the files named `Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -28482,19 +28614,21 @@ $as_echo X"$mf" |
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running 'make'.
+    # from the Makefile without running `make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
     test -z "am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`$as_dirname -- "$file" ||
@@ -29499,7 +29633,31 @@ _LT_EOF
     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
     cd runtime/etc/mono/2.0/Browsers
     rm -f Compat.browser
-    $LN_S $reldir/data/net_2_0/Browsers/Compat.browser Compat.browser
+    $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
+    cd $depth
+ ;;
+    "runtime/etc/mono/4.0/Browsers/Compat.browser":C)    depth=../../../../..
+    case $srcdir in
+    [\\/$]* | ?:[\\/]* ) reldir=$srcdir ;;
+    .) reldir=$depth ;;
+    *) reldir=$depth/$srcdir ;;
+    esac
+    $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
+    cd runtime/etc/mono/4.0/Browsers
+    rm -f Compat.browser
+    $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
+    cd $depth
+ ;;
+    "runtime/etc/mono/4.5/Browsers/Compat.browser":C)    depth=../../../../..
+    case $srcdir in
+    [\\/$]* | ?:[\\/]* ) reldir=$srcdir ;;
+    .) reldir=$depth ;;
+    *) reldir=$depth/$srcdir ;;
+    esac
+    $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
+    cd runtime/etc/mono/4.5/Browsers
+    rm -f Compat.browser
+    $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
     cd $depth
  ;;
     "runtime/etc/mono/4.0/machine.config":C)    depth=../../../..
diff --git a/configure.in b/configure.in
old mode 100755
new mode 100644
index 899fe44..493f671
--- a/configure.in
+++ b/configure.in
@@ -1,10 +1,10 @@
 # Process this file with autoconf to produce a configure script.
 #AC_PREREQ([2.62])
 
-AC_INIT(mono, [3.2.3],
+AC_INIT(mono, [3.2.8],
         [http://bugzilla.xamarin.com/enter_bug.cgi?classification=Mono])
 
-AC_CONFIG_SRCDIR([README])
+AC_CONFIG_SRCDIR([README.md])
 AC_CONFIG_MACRO_DIR([m4])
 AC_CANONICAL_SYSTEM
 AC_CANONICAL_HOST
@@ -215,6 +215,9 @@ case "$host" in
 		CFLAGS="$CFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
 		CXXFLAGS="$CXXFLAGS -DPAGE_SIZE=4096 -DS_IWRITE=S_IWUSR"
 
+		# The configure check can't detect this
+		AC_DEFINE(HAVE_LARGE_FILE_SUPPORT, 1, [Have large file support])
+
 		# to bypass the underscore linker check, can't work when cross-compiling
 		mono_cv_uscore=yes
 		mono_cv_clang=no
@@ -315,10 +318,8 @@ case "$host" in
 				CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC $BROKEN_DARWIN_FLAGS"
 				CPPFLAGS_FOR_EGLIB="$CPPFLAGS_FOR_EGLIB $BROKEN_DARWIN_CPPFLAGS"
 				CFLAGS_FOR_EGLIB="$CFLAGS_FOR_EGLIB $BROKEN_DARWIN_FLAGS"
-				extra_runtime_ldflags="-stack_size,0x800000"
 				;;
 			x*64-*-darwin*)
-				extra_runtime_ldflags="-stack_size,0x800000"
 				;;
 			arm*-darwin*)
 				has_dtrace=no
@@ -931,7 +932,19 @@ fi
 AC_ARG_ENABLE(executables, [  --disable-executables disable the build of the runtime executables], enable_executables=$enableval, enable_executables=yes)
 AM_CONDITIONAL(DISABLE_EXECUTABLES, test x$enable_executables = xno)
 
-AC_ARG_ENABLE(extension-module, [  --enable-extension-module enables usage of the extension module], has_extension_module=$enableval, has_extension_module=no)
+has_extension_module=no
+AC_ARG_ENABLE(extension-module, [  --enable-extension-module=LIST enable the core-extensions from LIST],
+[
+	for extension in `echo "$enable_extension_module" | sed -e "s/,/ /g"`; do
+		if test x$extension = xdefault ; then
+			has_extension_module=yes;
+		fi
+	done
+	if test x$enable_extension_module = xyes; then
+		has_extension_module=yes;
+	fi
+], [])
+
 AM_CONDITIONAL([HAS_EXTENSION_MODULE], [test x$has_extension_module != xno])
 
 if test x$has_extension_module != xno ; then
@@ -1034,6 +1047,11 @@ case "x$gc" in
 
 		BOEHM_DEFINES="-DHAVE_BOEHM_GC -DHAVE_GC_H -DUSE_INCLUDED_LIBGC -DHAVE_GC_GCJ_MALLOC -DHAVE_GC_ENABLE"
 
+		if test x$target_win32 = xyes; then
+			BOEHM_DEFINES="$BOEHM_DEFINES -DGC_NOT_DLL"
+			CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DGC_BUILD -DGC_NOT_DLL"
+		fi
+
 		gc_msg="bundled Boehm GC with typed GC"
 		if test x$enable_parallel_mark = xyes; then
 			AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "Included Boehm (with typed GC and Parallel Mark)", [GC description])
@@ -1580,6 +1598,8 @@ if test x$target_win32 = xno; then
 	AC_MSG_CHECKING(for working __thread)
 	if test "x$with_tls" != "x__thread"; then
 		AC_MSG_RESULT(disabled)
+	elif test "x$cross_compiling" = "xyes"; then
+		AC_MSG_RESULT(cross compiling, assuming yes)
 	else
 		AC_TRY_RUN([
 			#if defined(__APPLE__) && defined(__clang__)
@@ -1627,6 +1647,8 @@ if test x$target_win32 = xno; then
 	AC_MSG_CHECKING(for working sigaltstack)
 	if test "x$with_sigaltstack" != "xyes"; then
 		AC_MSG_RESULT(disabled)
+	elif test "x$cross_compiling" = "xyes"; then
+		AC_MSG_RESULT(cross compiling, assuming yes)
 	else
 		AC_TRY_RUN([
 			#include <stdio.h>
@@ -1817,9 +1839,9 @@ if test x$target_win32 = xno; then
 	fi
 
 	havekqueue=no
-        AC_CHECK_FUNCS(kqueue, , AC_MSG_CHECKING(for kqueue in sys/event.h)
-                AC_TRY_LINK([#include <sys/event.h>], 
-                [ kqueue(); ],[havekqueue=yes],[]))
+
+	AC_CHECK_HEADERS(sys/event.h)
+	AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
 
 	dnl **************************************
 	dnl * Darwin has a race that prevents us from using reliably:
@@ -1828,7 +1850,7 @@ if test x$target_win32 = xno; then
 	dnl * and very few folks run Mono on large web servers on OSX, falling
 	dnl * back 
 	dnl **************************************
-	if test x$havekqueue = xyes; then
+	if test "x$havekqueue" = "xyes" -a "x$ac_cv_header_sys_event_h" = "xyes"; then
 		if x$platform_darwin = xno; then
 			AC_DEFINE(USE_KQUEUE_FOR_THREADPOOL, 1, [Use kqueue for the threadpool])
 		fi
@@ -1987,6 +2009,7 @@ if test x$target_win32 = xno; then
 	AC_CHECK_FUNCS(futimens utimensat)
 	AC_CHECK_FUNCS(fstatat mknodat readlinkat)
 	AC_CHECK_FUNCS(readv writev preadv pwritev)
+	AC_CHECK_FUNCS(setpgid)
 	AC_CHECK_SIZEOF(size_t)
 	AC_CHECK_TYPES([blksize_t], [AC_DEFINE(HAVE_BLKSIZE_T)], , 
 		[#include <sys/types.h>
@@ -2122,6 +2145,13 @@ else
 		])
 	])
 	AC_CHECK_FUNCS(GetProcessId)
+	AC_CHECK_DECLS(InterlockedExchange64, [], [], [[#include <windows.h>]])
+	AC_CHECK_DECLS(InterlockedCompareExchange64, [], [], [[#include <windows.h>]])
+	AC_CHECK_DECLS(InterlockedDecrement64, [], [], [[#include <windows.h>]])
+	AC_CHECK_DECLS(InterlockedIncrement64, [], [], [[#include <windows.h>]])
+	AC_CHECK_DECLS(InterlockedAdd, [], [], [[#include <windows.h>]])
+	AC_CHECK_DECLS(InterlockedAdd64, [], [], [[#include <windows.h>]])
+	AC_CHECK_DECLS(__readfsdword, [], [], [[#include <windows.h>]])
 fi
 
 dnl socklen_t check
@@ -2364,11 +2394,21 @@ dnl **************
 
 AC_ARG_ENABLE(llvm,[  --enable-llvm	Enable the LLVM back-end], enable_llvm=$enableval, enable_llvm=no)
 AC_ARG_ENABLE(loadedllvm,[  --enable-loadedllvm	Load the LLVM back-end dynamically], enable_llvm=$enableval && enable_loadedllvm=$enableval, enable_loadedllvm=no)
+AC_ARG_ENABLE(llvm-version-check,[  --enable-llvm-version-check Check that the LLVM matches the version expected by mono], enable_llvm_version_check=$enableval, enable_llvm_version_check=no)
+
+AC_ARG_WITH(llvm, [  --with-llvm=<llvm prefix>    Enable the LLVM back-end], enable_llvm=yes,)
 
 if test "x$enable_llvm" = "xyes"; then
-   AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
-   if test "x$LLVM_CONFIG" = "xno"; then
-   	  AC_MSG_ERROR([llvm-config not found.])
+   if test "x$with_llvm" != "x"; then
+   	  LLVM_CONFIG=$with_llvm/bin/llvm-config
+	  if test ! -x $LLVM_CONFIG; then
+	  	 AC_MSG_ERROR([LLVM executable $LLVM_CONFIG not found.])
+      fi
+   else
+      AC_PATH_PROG(LLVM_CONFIG, llvm-config, no)
+      if test "x$LLVM_CONFIG" = "xno"; then
+   	     AC_MSG_ERROR([llvm-config not found.])
+      fi
    fi
 
    llvm_codegen="x86codegen"
@@ -2392,6 +2432,8 @@ if test "x$enable_llvm" = "xyes"; then
    fi
    LLVM_LIBS="$LLVM_LDFLAGS $LLVM_LIBS -lstdc++"
 
+   expected_llvm_version="3.4svn-mono-mono/e656cac"
+
    # Should be something like '2.6' or '2.7svn'
    llvm_version=`$LLVM_CONFIG --version`
    major_version=`echo $llvm_version | cut -c 1`
@@ -2401,6 +2443,11 @@ if test "x$enable_llvm" = "xyes"; then
    if echo $llvm_version | grep -q 'mono'; then
    	  AC_DEFINE(LLVM_MONO_BRANCH, 1, [Whenever we are using the mono branch of LLVM])
 	  LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_MONO_BRANCH"	  
+	  if test "x$enable_llvm_version_check" == "xyes"; then
+	  	 if test "$llvm_version" != "$expected_llvm_version"; then
+	  	 	AC_MSG_ERROR([Expected llvm version $expected_llvm_version, but llvm-config --version returned $llvm_version"])
+	  	 fi
+	  fi
    else
 	  AC_MSG_ERROR([Compiling with stock LLVM is not supported, please use the Mono LLVM repo at https://github.com/mono/llvm, with the GIT branch which matches this version of mono, i.e. 'mono-2-10' for Mono 2.10.])
    fi
@@ -2443,10 +2490,6 @@ jit_wanted=true
 interp_wanted=false
 sgen_supported=false
 case "$host" in
-#	mips-sgi-irix5.* | mips-sgi-irix6.*)
-#		TARGET=MIPS;
-#		ACCESS_UNALIGNED="no"
-#		;;
 	mips*)
 		TARGET=MIPS;
 		arch_target=mips;
@@ -2769,7 +2812,7 @@ esac
 dnl Use GCC atomic ops if they work on the target.
 if test x$GCC = "xyes"; then
 	case $TARGET in
-	X86 | AMD64 | ARM | POWERPC | POWERPC64 | MIPS)
+	X86 | AMD64 | ARM | POWERPC | POWERPC64 | MIPS | S390X | SPARC | SPARC64)
 		AC_DEFINE(USE_GCC_ATOMIC_OPS, 1, [...])
 		;;
 	esac
@@ -2935,39 +2978,6 @@ if test "x$TARGET" = "xAMD64" -o "x$TARGET" = "xX86"; then
 	fi
 fi
 
-mono_debugger_supported=no
-AC_ARG_ENABLE(mono-debugger, [  --disable-mono-debugger disable support for the mdb debugger], try_mono_debugger=$enableval, try_mono_debugger=yes)
-if test "x$try_mono_debugger" = "xyes"; then
-	if test "x$TARGET" = "xAMD64" -o "x$TARGET" = "xX86" -o "x$TARGET" = "xS390x"; then
-		if test x$use_included_gc = xyes; then
-			case "$host" in
-			*-*-*linux*)
-				mono_debugger_supported=yes
-				;;
-			*86-apple-darwin*)
-				mono_debugger_supported=yes
-				;;		
-			esac
-		fi
-	fi
-fi
-
-# disable the debugger entirely when building with moonlight
-if test "x$with_moonlight" != "xno"; then
-	mono_debugger_supported=no
-fi
-
-# mdb support for sgen is broken, disable it until further notice.
-mono_debugger_supported=no
-
-AC_MSG_CHECKING(if the Mono Debugger is supported on this platform)
-if test "x$mono_debugger_supported" = "xyes"; then
-	BOEHM_DEFINES="$BOEHM_DEFINES -DMONO_DEBUGGER_SUPPORTED"
-	CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DMONO_DEBUGGER_SUPPORTED"
-fi
-AM_CONDITIONAL(MONO_DEBUGGER_SUPPORTED, test x$mono_debugger_supported = xyes)
-AC_MSG_RESULT($mono_debugger_supported)
-
 AC_ARG_ENABLE(icall-symbol-map,[  --enable-icall-symbol-map Generate tables which map icall functions to their C symbols], icall_symbol_map=$enableval, icall_symbol_map=no)
 if test "x$icall_symbol_map" = "xyes"; then
    AC_DEFINE(ENABLE_ICALL_SYMBOL_MAP, 1, [Icall symbol map enabled])
@@ -3071,6 +3081,8 @@ if test ${TARGET} = ARM; then
 		return 0;
 	], [
 		arm_v5=yes
+
+		arm_ver=ARMv5
 	], [])
 
 	AC_TRY_COMPILE([], [
@@ -3081,6 +3093,8 @@ if test ${TARGET} = ARM; then
 	], [
 		arm_v5=yes
 		arm_v6=yes
+
+		arm_ver=ARMv6
 	], [])
 
 	AC_TRY_COMPILE([], [
@@ -3092,8 +3106,12 @@ if test ${TARGET} = ARM; then
 		arm_v5=yes
 		arm_v6=yes
 		arm_v7=yes
+
+		arm_ver=ARMv7
 	], [])
 
+	AC_MSG_RESULT($arm_ver)
+
 	if test x$arm_v5 = xyes; then
 		AC_DEFINE(HAVE_ARMV5, 1, [ARM v5])
 		CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DHAVE_ARMV5=1"
@@ -3379,7 +3397,35 @@ AC_CONFIG_COMMANDS([runtime/etc/mono/2.0/Browsers/Compat.browser],
     $ac_aux_dir/install-sh -d runtime/etc/mono/2.0/Browsers/
     cd runtime/etc/mono/2.0/Browsers
     rm -f Compat.browser
-    $LN_S $reldir/data/net_2_0/Browsers/Compat.browser Compat.browser
+    $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
+    cd $depth
+],[LN_S='$LN_S'])
+
+AC_CONFIG_COMMANDS([runtime/etc/mono/4.0/Browsers/Compat.browser],
+[   depth=../../../../..
+    case $srcdir in
+    [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
+    .) reldir=$depth ;;
+    *) reldir=$depth/$srcdir ;;
+    esac
+    $ac_aux_dir/install-sh -d runtime/etc/mono/4.0/Browsers/
+    cd runtime/etc/mono/4.0/Browsers
+    rm -f Compat.browser
+    $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
+    cd $depth
+],[LN_S='$LN_S'])
+
+AC_CONFIG_COMMANDS([runtime/etc/mono/4.5/Browsers/Compat.browser],
+[   depth=../../../../..
+    case $srcdir in
+    [[\\/$]]* | ?:[[\\/]]* ) reldir=$srcdir ;;
+    .) reldir=$depth ;;
+    *) reldir=$depth/$srcdir ;;
+    esac
+    $ac_aux_dir/install-sh -d runtime/etc/mono/4.5/Browsers/
+    cd runtime/etc/mono/4.5/Browsers
+    rm -f Compat.browser
+    $LN_S $reldir/data/Browsers/Compat.browser Compat.browser
     cd $depth
 ],[LN_S='$LN_S'])
 
@@ -3487,6 +3533,8 @@ data/net_2_0/Makefile
 data/net_4_0/Makefile
 data/net_4_5/Makefile
 data/net_2_0/Browsers/Makefile
+data/net_4_0/Browsers/Makefile
+data/net_4_5/Browsers/Makefile
 data/mint.pc
 data/mono-2.pc
 data/monosgen-2.pc
diff --git a/data/net_2_0/Browsers/Compat.browser b/data/Browsers/Compat.browser
similarity index 100%
rename from data/net_2_0/Browsers/Compat.browser
rename to data/Browsers/Compat.browser
diff --git a/data/Makefile.am b/data/Makefile.am
index 601b4da..30e26a9 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -12,7 +12,8 @@ EXTRA_DIST =  	\
 	mono.pc.in mono-2.pc.in monosgen-2.pc.in mint.pc.in dotnet.pc.in dotnet35.pc.in wcf.pc.in monodoc.pc.in \
 	mono-nunit.pc.in mono-cairo.pc.in mono-options.pc.in cecil.pc.in \
 	mono-lineeditor.pc.in system.web.extensions_1.0.pc.in system.web.extensions.design_1.0.pc.in\
-	dtrace-prelink.sh mono.web.pc.in system.web.mvc.pc.in system.web.mvc2.pc.in system.web.mvc3.pc.in aspnetwebstack.pc.in reactive.pc.in \
+	dtrace-prelink.sh mono.web.pc.in system.web.mvc.pc.in system.web.mvc2.pc.in system.web.mvc3.pc.in aspnetwebstack.pc.in \
+	reactive.pc.in xbuild12.pc \
 	net_1_1/machine.config \
 	gdb/mono-gdb.py \
 	gdb/gdb-python.diff
@@ -28,10 +29,10 @@ endif
 if JIT_SUPPORTED
 if INTERP_SUPPORTED
 pkgconfig_DATA= mono.pc mono-2.pc mint.pc dotnet.pc dotnet35.pc wcf.pc mono-nunit.pc mono-cairo.pc mono-options.pc cecil.pc monodoc.pc mono-lineeditor.pc system.web.extensions_1.0.pc \
-		system.web.extensions.design_1.0.pc mono.web.pc system.web.mvc.pc system.web.mvc2.pc system.web.mvc3.pc aspnetwebstack.pc reactive.pc $(SGENPCFILE)
+		system.web.extensions.design_1.0.pc mono.web.pc system.web.mvc.pc system.web.mvc2.pc system.web.mvc3.pc aspnetwebstack.pc reactive.pc xbuild12.pc $(SGENPCFILE)
 else
 pkgconfig_DATA= mono.pc mono-2.pc dotnet.pc dotnet35.pc wcf.pc mono-nunit.pc mono-cairo.pc mono-options.pc cecil.pc monodoc.pc mono-lineeditor.pc system.web.extensions_1.0.pc \
-		system.web.extensions.design_1.0.pc mono.web.pc system.web.mvc.pc system.web.mvc2.pc system.web.mvc3.pc aspnetwebstack.pc reactive.pc $(SGENPCFILE)
+		system.web.extensions.design_1.0.pc mono.web.pc system.web.mvc.pc system.web.mvc2.pc system.web.mvc3.pc aspnetwebstack.pc reactive.pc xbuild12.pc $(SGENPCFILE)
 endif
 else
 pkgconfig_DATA= mint.pc mono-nunit.pc mono-cairo.pc mono-options.pc cecil.pc monodoc.pc mono-lineeditor.pc
diff --git a/data/Makefile.in b/data/Makefile.in
index 7454d4d..7fa348a 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -65,8 +66,7 @@ DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
 	$(srcdir)/system.web.extensions.design_1.0.pc.in \
 	$(srcdir)/system.web.extensions_1.0.pc.in \
 	$(srcdir)/system.web.mvc.pc.in $(srcdir)/system.web.mvc2.pc.in \
-	$(srcdir)/system.web.mvc3.pc.in $(srcdir)/wcf.pc.in \
-	$(top_srcdir)/mkinstalldirs ChangeLog
+	$(srcdir)/system.web.mvc3.pc.in $(srcdir)/wcf.pc.in ChangeLog
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -90,7 +90,7 @@ CONFIG_CLEAN_FILES = mint.pc mono-2.pc monosgen-2.pc mono.pc \
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -379,7 +379,8 @@ EXTRA_DIST = \
 	mono.pc.in mono-2.pc.in monosgen-2.pc.in mint.pc.in dotnet.pc.in dotnet35.pc.in wcf.pc.in monodoc.pc.in \
 	mono-nunit.pc.in mono-cairo.pc.in mono-options.pc.in cecil.pc.in \
 	mono-lineeditor.pc.in system.web.extensions_1.0.pc.in system.web.extensions.design_1.0.pc.in\
-	dtrace-prelink.sh mono.web.pc.in system.web.mvc.pc.in system.web.mvc2.pc.in system.web.mvc3.pc.in aspnetwebstack.pc.in reactive.pc.in \
+	dtrace-prelink.sh mono.web.pc.in system.web.mvc.pc.in system.web.mvc2.pc.in system.web.mvc3.pc.in aspnetwebstack.pc.in \
+	reactive.pc.in xbuild12.pc \
 	net_1_1/machine.config \
 	gdb/mono-gdb.py \
 	gdb/gdb-python.diff
@@ -388,10 +389,10 @@ pkgconfigdir = $(libdir)/pkgconfig
 @SUPPORT_SGEN_FALSE at SGENPCFILE = 
 @SUPPORT_SGEN_TRUE at SGENPCFILE = monosgen-2.pc
 @INTERP_SUPPORTED_FALSE@@JIT_SUPPORTED_TRUE at pkgconfig_DATA = mono.pc mono-2.pc dotnet.pc dotnet35.pc wcf.pc mono-nunit.pc mono-cairo.pc mono-options.pc cecil.pc monodoc.pc mono-lineeditor.pc system.web.extensions_1.0.pc \
- at INTERP_SUPPORTED_FALSE@@JIT_SUPPORTED_TRUE@		system.web.extensions.design_1.0.pc mono.web.pc system.web.mvc.pc system.web.mvc2.pc system.web.mvc3.pc aspnetwebstack.pc reactive.pc $(SGENPCFILE)
+ at INTERP_SUPPORTED_FALSE@@JIT_SUPPORTED_TRUE@		system.web.extensions.design_1.0.pc mono.web.pc system.web.mvc.pc system.web.mvc2.pc system.web.mvc3.pc aspnetwebstack.pc reactive.pc xbuild12.pc $(SGENPCFILE)
 
 @INTERP_SUPPORTED_TRUE@@JIT_SUPPORTED_TRUE at pkgconfig_DATA = mono.pc mono-2.pc mint.pc dotnet.pc dotnet35.pc wcf.pc mono-nunit.pc mono-cairo.pc mono-options.pc cecil.pc monodoc.pc mono-lineeditor.pc system.web.extensions_1.0.pc \
- at INTERP_SUPPORTED_TRUE@@JIT_SUPPORTED_TRUE@		system.web.extensions.design_1.0.pc mono.web.pc system.web.mvc.pc system.web.mvc2.pc system.web.mvc3.pc aspnetwebstack.pc reactive.pc $(SGENPCFILE)
+ at INTERP_SUPPORTED_TRUE@@JIT_SUPPORTED_TRUE@		system.web.extensions.design_1.0.pc mono.web.pc system.web.mvc.pc system.web.mvc2.pc system.web.mvc3.pc aspnetwebstack.pc reactive.pc xbuild12.pc $(SGENPCFILE)
 
 @JIT_SUPPORTED_FALSE at pkgconfig_DATA = mint.pc mono-nunit.pc mono-cairo.pc mono-options.pc cecil.pc monodoc.pc mono-lineeditor.pc
 DISTCLEANFILES = mono-2.pc mono.pc mint.pc dotnet.pc dotnet35.pc wcf.pc mono-nunit.pc mono-cairo.pc mono-options.pc cecil.pc monodoc.pc mono-lineeditor.pc system.web.extensions_1.0.pc \
@@ -550,11 +551,11 @@ uninstall-pkgconfigDATA:
 	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
 $(RECURSIVE_TARGETS):
 	@fail= failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
@@ -618,10 +619,6 @@ ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
-cscopelist-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
-	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -685,20 +682,6 @@ GTAGS:
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
 
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS) $(LISP)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
@@ -864,25 +847,24 @@ ps-am:
 uninstall-am: uninstall-gdbDATA uninstall-monoDATA \
 	uninstall-pkgconfigDATA
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \
-	cscopelist-recursive ctags-recursive install-am install-strip \
-	tags-recursive
+.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 check check-am clean clean-generic clean-libtool \
-	cscopelist cscopelist-recursive ctags ctags-recursive \
-	distclean distclean-generic distclean-libtool 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-gdbDATA \
-	install-html install-html-am install-info install-info-am \
-	install-man install-monoDATA install-pdf install-pdf-am \
-	install-pkgconfigDATA install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am uninstall-gdbDATA \
-	uninstall-monoDATA uninstall-pkgconfigDATA
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool 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-gdbDATA install-html install-html-am \
+	install-info install-info-am install-man install-monoDATA \
+	install-pdf install-pdf-am install-pkgconfigDATA install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-gdbDATA uninstall-monoDATA \
+	uninstall-pkgconfigDATA
 
 
 mono-sgen-gdb.py: gdb/mono-gdb.py
diff --git a/data/aspnetwebstack.pc.in b/data/aspnetwebstack.pc.in
index 250fdb6..cbb24e4 100644
--- a/data/aspnetwebstack.pc.in
+++ b/data/aspnetwebstack.pc.in
@@ -1,4 +1,4 @@
 Name: AspNetWebStack
 Description: References Microsoft ASP.NET Web Stack
 Version: @VERSION@
-Libs: -r:System.Web.Razor.dll -r:System.Web.Http.dll -r:System.Web.WebPages -r:System.Web.WebPages.Razor -r:System.Web.WebPages.Deployment
+Libs: -r:@prefix@/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll -r:@prefix@/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll -r:@prefix@/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll -r:@prefix@/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll -r:@prefix@/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deploy [...]
diff --git a/data/config.in b/data/config.in
index 1faae01..32e075a 100644
--- a/data/config.in
+++ b/data/config.in
@@ -26,6 +26,6 @@
 		<dllentry dll="__Internal" name="MoveMemory" target="mono_win32_compat_MoveMemory"/>
 		<dllentry dll="__Internal" name="ZeroMemory" target="mono_win32_compat_ZeroMemory"/>
 	</dllmap>
-	<dllmap dll="gdiplus" target="@prefix@/lib/libgdiplus at libsuffix@" />
-	<dllmap dll="gdiplus.dll" target="@prefix@/lib/libgdiplus at libsuffix@" />
+	<dllmap dll="gdiplus" target="@prefix@/lib/libgdiplus at libsuffix@" os="!windows"/>
+	<dllmap dll="gdiplus.dll" target="@prefix@/lib/libgdiplus at libsuffix@"  os="!windows"/>
 </configuration>
diff --git a/data/net_2_0/Browsers/ChangeLog b/data/net_2_0/Browsers/ChangeLog
deleted file mode 100644
index 26785e3..0000000
--- a/data/net_2_0/Browsers/ChangeLog
+++ /dev/null
@@ -1,6 +0,0 @@
-2008-03-23  Dean Brettle  <dean at brettle.com>
-
-	* Compat.browser: added.  Provides browser definitions with
-	compatible IDs.
-
-
diff --git a/data/net_2_0/Browsers/Makefile.am b/data/net_2_0/Browsers/Makefile.am
index 4d5b8c9..ed00678 100644
--- a/data/net_2_0/Browsers/Makefile.am
+++ b/data/net_2_0/Browsers/Makefile.am
@@ -1,6 +1,6 @@
 monodir = $(sysconfdir)/mono/2.0/Browsers
 
-EXTRA_DIST =  Compat.browser
+EXTRA_DIST =  ../../Browsers/Compat.browser
 
-mono_DATA =  Compat.browser
+mono_DATA =  ../../Browsers/Compat.browser
 
diff --git a/data/net_2_0/Browsers/Makefile.in b/data/net_2_0/Browsers/Makefile.in
index e418a7a..a95cd3b 100644
--- a/data/net_2_0/Browsers/Makefile.in
+++ b/data/net_2_0/Browsers/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = data/net_2_0/Browsers
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -71,7 +71,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -312,8 +312,8 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 monodir = $(sysconfdir)/mono/2.0/Browsers
-EXTRA_DIST = Compat.browser
-mono_DATA = Compat.browser
+EXTRA_DIST = ../../Browsers/Compat.browser
+mono_DATA = ../../Browsers/Compat.browser
 all: all-am
 
 .SUFFIXES:
@@ -380,8 +380,6 @@ TAGS:
 ctags: CTAGS
 CTAGS:
 
-cscope cscopelist:
-
 
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/data/net_2_0/Makefile.in b/data/net_2_0/Makefile.in
index 085f4a0..35569b9 100644
--- a/data/net_2_0/Makefile.in
+++ b/data/net_2_0/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = data/net_2_0
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -71,7 +71,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -425,11 +425,11 @@ uninstall-monoDATA:
 	dir='$(DESTDIR)$(monodir)'; $(am__uninstall_files_from_dir)
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
 $(RECURSIVE_TARGETS):
 	@fail= failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
@@ -493,10 +493,6 @@ ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
-cscopelist-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
-	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -560,20 +556,6 @@ GTAGS:
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
 
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS) $(LISP)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
@@ -736,24 +718,22 @@ ps-am:
 
 uninstall-am: uninstall-monoDATA
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \
-	cscopelist-recursive ctags-recursive install-am install-strip \
-	tags-recursive
+.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 check check-am clean clean-generic clean-libtool \
-	cscopelist cscopelist-recursive ctags ctags-recursive \
-	distclean distclean-generic distclean-libtool 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-monoDATA 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 \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-monoDATA
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool 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-monoDATA 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 mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-monoDATA
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/data/net_4_0/Browsers/Makefile.am b/data/net_4_0/Browsers/Makefile.am
new file mode 100644
index 0000000..0940002
--- /dev/null
+++ b/data/net_4_0/Browsers/Makefile.am
@@ -0,0 +1,6 @@
+monodir = $(sysconfdir)/mono/4.0/Browsers
+
+EXTRA_DIST =  ../../Browsers/Compat.browser
+
+mono_DATA =  ../../Browsers/Compat.browser
+
diff --git a/data/net_4_0/Browsers/Makefile.in b/data/net_4_0/Browsers/Makefile.in
new file mode 100644
index 0000000..c3a6bfe
--- /dev/null
+++ b/data/net_4_0/Browsers/Makefile.in
@@ -0,0 +1,534 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@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
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = data/net_4_0/Browsers
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+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 = 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__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(monodir)"
+DATA = $(mono_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+API_VER = @API_VER@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOEHM_DEFINES = @BOEHM_DEFINES@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+BUILD_GLIB_CFLAGS = @BUILD_GLIB_CFLAGS@
+BUILD_GLIB_LIBS = @BUILD_GLIB_LIBS@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISABLE_SHARED_HANDLES = @DISABLE_SHARED_HANDLES@
+DLLTOOL = @DLLTOOL@
+DOLT_BASH = @DOLT_BASH@
+DSYMUTIL = @DSYMUTIL@
+DTRACE = @DTRACE@
+DTRACEFLAGS = @DTRACEFLAGS@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_MSGFMT = @HAVE_MSGFMT@
+HOST_CC = @HOST_CC@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTL = @INTL@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBC = @LIBC@
+LIBGC_CPPFLAGS = @LIBGC_CPPFLAGS@
+LIBGC_LIBS = @LIBGC_LIBS@
+LIBGC_STATIC_LIBS = @LIBGC_STATIC_LIBS@
+LIBICONV = @LIBICONV@
+LIBMONO_LA = @LIBMONO_LA@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LLVM_CFLAGS = @LLVM_CFLAGS@
+LLVM_CONFIG = @LLVM_CONFIG@
+LLVM_CXXFLAGS = @LLVM_CXXFLAGS@
+LLVM_LDFLAGS = @LLVM_LDFLAGS@
+LLVM_LIBS = @LLVM_LIBS@
+LN_S = @LN_S@
+LTCOMPILE = @LTCOMPILE@
+LTCXXCOMPILE = @LTCXXCOMPILE@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MONO_DL_NEED_USCORE = @MONO_DL_NEED_USCORE@
+MONO_NACL_ALIGN_MASK_OFF = @MONO_NACL_ALIGN_MASK_OFF@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPROFILE_CFLAGS = @OPROFILE_CFLAGS@
+OPROFILE_LIBS = @OPROFILE_LIBS@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SGEN_DEFINES = @SGEN_DEFINES@
+SHELL = @SHELL@
+SQLITE = @SQLITE@
+SQLITE3 = @SQLITE3@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+X11 = @X11@
+XATTR_LIB = @XATTR_LIB@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XMKMF = @XMKMF@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+arch_target = @arch_target@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+docs_dir = @docs_dir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+export_ldflags = @export_ldflags@
+extra_runtime_ldflags = @extra_runtime_ldflags@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+ikvm_native_dir = @ikvm_native_dir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+libgc_dir = @libgc_dir@
+libgdiplus_loc = @libgdiplus_loc@
+libmono_cflags = @libmono_cflags@
+libmono_ldflags = @libmono_ldflags@
+libsuffix = @libsuffix@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mcs_topdir = @mcs_topdir@
+mcs_topdir_from_srcdir = @mcs_topdir_from_srcdir@
+mkdir_p = @mkdir_p@
+mono_build_root = @mono_build_root@
+mono_cfg_dir = @mono_cfg_dir@
+mono_runtime = @mono_runtime@
+nacl_self_host = @nacl_self_host@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+reloc_libdir = @reloc_libdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+monodir = $(sysconfdir)/mono/4.0/Browsers
+EXTRA_DIST = ../../Browsers/Compat.browser
+mono_DATA = ../../Browsers/Compat.browser
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( 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 data/net_4_0/Browsers/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign data/net_4_0/Browsers/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    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)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(mono_DATA)'; test -n "$(monodir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(monodir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(monodir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(monodir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(monodir)" || exit $$?; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; test -n "$(monodir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(monodir)'; $(am__uninstall_files_from_dir)
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  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 -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+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"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+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
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool 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-monoDATA \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-monoDATA
+
+
+# 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/data/net_4_0/Makefile.am b/data/net_4_0/Makefile.am
index 9ca4996..31727c5 100644
--- a/data/net_4_0/Makefile.am
+++ b/data/net_4_0/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS =
+SUBDIRS = Browsers
 
 monodir = $(sysconfdir)/mono/4.0
 
diff --git a/data/net_4_0/Makefile.in b/data/net_4_0/Makefile.in
index 85062a9..bfff3a2 100644
--- a/data/net_4_0/Makefile.in
+++ b/data/net_4_0/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = data/net_4_0
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(top_srcdir)/mkinstalldirs ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -71,7 +71,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -351,7 +351,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = 
+SUBDIRS = Browsers
 monodir = $(sysconfdir)/mono/4.0
 EXTRA_DIST = machine.config \
 	      web.config \
@@ -425,11 +425,11 @@ uninstall-monoDATA:
 	dir='$(DESTDIR)$(monodir)'; $(am__uninstall_files_from_dir)
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
 $(RECURSIVE_TARGETS):
 	@fail= failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
@@ -493,10 +493,6 @@ ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
-cscopelist-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
-	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -560,20 +556,6 @@ GTAGS:
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
 
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS) $(LISP)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
@@ -736,24 +718,22 @@ ps-am:
 
 uninstall-am: uninstall-monoDATA
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \
-	cscopelist-recursive ctags-recursive install-am install-strip \
-	tags-recursive
+.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 check check-am clean clean-generic clean-libtool \
-	cscopelist cscopelist-recursive ctags ctags-recursive \
-	distclean distclean-generic distclean-libtool 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-monoDATA 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 \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-monoDATA
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool 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-monoDATA 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 mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-monoDATA
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/data/net_4_5/Browsers/Makefile.am b/data/net_4_5/Browsers/Makefile.am
new file mode 100644
index 0000000..a234829
--- /dev/null
+++ b/data/net_4_5/Browsers/Makefile.am
@@ -0,0 +1,6 @@
+monodir = $(sysconfdir)/mono/4.5/Browsers
+
+EXTRA_DIST =  ../../Browsers/Compat.browser
+
+mono_DATA =  ../../Browsers/Compat.browser
+
diff --git a/data/net_4_5/Browsers/Makefile.in b/data/net_4_5/Browsers/Makefile.in
new file mode 100644
index 0000000..c4d04f7
--- /dev/null
+++ b/data/net_4_5/Browsers/Makefile.in
@@ -0,0 +1,534 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@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
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = data/net_4_5/Browsers
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+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 = 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__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(monodir)"
+DATA = $(mono_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+API_VER = @API_VER@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BOEHM_DEFINES = @BOEHM_DEFINES@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+BUILD_GLIB_CFLAGS = @BUILD_GLIB_CFLAGS@
+BUILD_GLIB_LIBS = @BUILD_GLIB_LIBS@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DISABLE_SHARED_HANDLES = @DISABLE_SHARED_HANDLES@
+DLLTOOL = @DLLTOOL@
+DOLT_BASH = @DOLT_BASH@
+DSYMUTIL = @DSYMUTIL@
+DTRACE = @DTRACE@
+DTRACEFLAGS = @DTRACEFLAGS@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_MSGFMT = @HAVE_MSGFMT@
+HOST_CC = @HOST_CC@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTL = @INTL@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBC = @LIBC@
+LIBGC_CPPFLAGS = @LIBGC_CPPFLAGS@
+LIBGC_LIBS = @LIBGC_LIBS@
+LIBGC_STATIC_LIBS = @LIBGC_STATIC_LIBS@
+LIBICONV = @LIBICONV@
+LIBMONO_LA = @LIBMONO_LA@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LLVM_CFLAGS = @LLVM_CFLAGS@
+LLVM_CONFIG = @LLVM_CONFIG@
+LLVM_CXXFLAGS = @LLVM_CXXFLAGS@
+LLVM_LDFLAGS = @LLVM_LDFLAGS@
+LLVM_LIBS = @LLVM_LIBS@
+LN_S = @LN_S@
+LTCOMPILE = @LTCOMPILE@
+LTCXXCOMPILE = @LTCXXCOMPILE@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MONO_DL_NEED_USCORE = @MONO_DL_NEED_USCORE@
+MONO_NACL_ALIGN_MASK_OFF = @MONO_NACL_ALIGN_MASK_OFF@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPROFILE_CFLAGS = @OPROFILE_CFLAGS@
+OPROFILE_LIBS = @OPROFILE_LIBS@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SGEN_DEFINES = @SGEN_DEFINES@
+SHELL = @SHELL@
+SQLITE = @SQLITE@
+SQLITE3 = @SQLITE3@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+X11 = @X11@
+XATTR_LIB = @XATTR_LIB@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XMKMF = @XMKMF@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+arch_target = @arch_target@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+docs_dir = @docs_dir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+export_ldflags = @export_ldflags@
+extra_runtime_ldflags = @extra_runtime_ldflags@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+ikvm_native_dir = @ikvm_native_dir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+libgc_dir = @libgc_dir@
+libgdiplus_loc = @libgdiplus_loc@
+libmono_cflags = @libmono_cflags@
+libmono_ldflags = @libmono_ldflags@
+libsuffix = @libsuffix@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mcs_topdir = @mcs_topdir@
+mcs_topdir_from_srcdir = @mcs_topdir_from_srcdir@
+mkdir_p = @mkdir_p@
+mono_build_root = @mono_build_root@
+mono_cfg_dir = @mono_cfg_dir@
+mono_runtime = @mono_runtime@
+nacl_self_host = @nacl_self_host@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+reloc_libdir = @reloc_libdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+monodir = $(sysconfdir)/mono/4.5/Browsers
+EXTRA_DIST = ../../Browsers/Compat.browser
+mono_DATA = ../../Browsers/Compat.browser
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( 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 data/net_4_5/Browsers/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign data/net_4_5/Browsers/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    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)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-monoDATA: $(mono_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(mono_DATA)'; test -n "$(monodir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(monodir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(monodir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(monodir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(monodir)" || exit $$?; \
+	done
+
+uninstall-monoDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(mono_DATA)'; test -n "$(monodir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(monodir)'; $(am__uninstall_files_from_dir)
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  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 -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(monodir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+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"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-monoDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+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
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-monoDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool 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-monoDATA \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-monoDATA
+
+
+# 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/data/net_4_5/Makefile.am b/data/net_4_5/Makefile.am
index c45989c..bfe4ac6 100644
--- a/data/net_4_5/Makefile.am
+++ b/data/net_4_5/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS =
+SUBDIRS = Browsers
 
 monodir = $(sysconfdir)/mono/4.5
 
diff --git a/data/net_4_5/Makefile.in b/data/net_4_5/Makefile.in
index 4651595..5d74b5b 100644
--- a/data/net_4_5/Makefile.in
+++ b/data/net_4_5/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -52,8 +53,7 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = data/net_4_5
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(top_srcdir)/mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -71,7 +71,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -351,7 +351,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = 
+SUBDIRS = Browsers
 monodir = $(sysconfdir)/mono/4.5
 EXTRA_DIST = machine.config \
 	      web.config \
@@ -425,11 +425,11 @@ uninstall-monoDATA:
 	dir='$(DESTDIR)$(monodir)'; $(am__uninstall_files_from_dir)
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
 $(RECURSIVE_TARGETS):
 	@fail= failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
@@ -493,10 +493,6 @@ ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
-cscopelist-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
-	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -560,20 +556,6 @@ GTAGS:
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
 
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS) $(LISP)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
@@ -736,24 +718,22 @@ ps-am:
 
 uninstall-am: uninstall-monoDATA
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \
-	cscopelist-recursive ctags-recursive install-am install-strip \
-	tags-recursive
+.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 check check-am clean clean-generic clean-libtool \
-	cscopelist cscopelist-recursive ctags ctags-recursive \
-	distclean distclean-generic distclean-libtool 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-monoDATA 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 \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-monoDATA
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool 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-monoDATA 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 mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-monoDATA
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/data/xbuild12.pc b/data/xbuild12.pc
new file mode 100644
index 0000000..35816fd
--- /dev/null
+++ b/data/xbuild12.pc
@@ -0,0 +1,7 @@
+bindir=${pcfiledir}/../mono/xbuild/12.0/bin
+
+Name: XBuild 12.0
+Description: XBuild/MSBuild 12.0
+Version: 12.0
+Libs: -r:${bindir}/Microsoft.Build.Engine.dll -r:${bindir}/Microsoft.Build.Framework.dll -r:${bindir}/Microsoft.Build.Tasks.v12.0.dll -r:${bindir}/Microsoft.Build.Utilities.v12.0.dll -r:${bindir}/Microsoft.Build.dll
+
diff --git a/depcomp b/depcomp
index debb6ff..25a39e6 100755
--- a/depcomp
+++ b/depcomp
@@ -3,7 +3,8 @@
 
 scriptversion=2012-03-27.16; # UTC
 
-# Copyright (C) 1999-2012 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
+# 2011, 2012 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/docs/Makefile.in b/docs/Makefile.in
index 204aaff..05fd625 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -53,7 +54,7 @@ host_triplet = @host@
 target_triplet = @target@
 subdir = docs
 DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(top_srcdir)/mkinstalldirs ChangeLog TODO
+	ChangeLog TODO
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -71,7 +72,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -442,8 +443,6 @@ TAGS:
 ctags: CTAGS
 CTAGS:
 
-cscope cscopelist:
-
 
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/docs/current-api b/docs/current-api
index d0efffc..1bbddca 100644
--- a/docs/current-api
+++ b/docs/current-api
@@ -307,6 +307,7 @@ mono_gc_out_of_memory
 mono_gc_wbarrier_arrayref_copy
 mono_gc_wbarrier_generic_nostore
 mono_gc_wbarrier_generic_store
+mono_gc_wbarrier_generic_store_atomic
 mono_gc_wbarrier_object_copy
 mono_gc_wbarrier_set_arrayref
 mono_gc_wbarrier_set_field
diff --git a/docs/public-api b/docs/public-api
index 082bfd9..231ecf1 100644
--- a/docs/public-api
+++ b/docs/public-api
@@ -307,6 +307,7 @@ mono_gc_out_of_memory
 mono_gc_wbarrier_arrayref_copy
 mono_gc_wbarrier_generic_nostore
 mono_gc_wbarrier_generic_store
+mono_gc_wbarrier_generic_store_atomic
 mono_gc_wbarrier_object_copy
 mono_gc_wbarrier_set_arrayref
 mono_gc_wbarrier_set_field
diff --git a/eglib/Makefile.in b/eglib/Makefile.in
index 111f355..392e260 100644
--- a/eglib/Makefile.in
+++ b/eglib/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -51,13 +52,13 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
-	$(top_srcdir)/../config.guess $(top_srcdir)/../config.rpath \
-	$(top_srcdir)/../config.sub $(top_srcdir)/../install-sh \
-	$(top_srcdir)/../ltmain.sh $(top_srcdir)/../missing \
-	$(top_srcdir)/../mkinstalldirs $(top_srcdir)/configure AUTHORS \
-	COPYING ChangeLog NEWS TODO config.rpath
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/../config.guess \
+	$(srcdir)/../config.rpath $(srcdir)/../config.sub \
+	$(srcdir)/../install-sh $(srcdir)/../ltmain.sh \
+	$(srcdir)/../missing $(srcdir)/../mkinstalldirs \
+	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/config.h.in $(top_srcdir)/configure AUTHORS COPYING \
+	ChangeLog NEWS TODO config.rpath
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -75,7 +76,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -97,10 +98,9 @@ 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 \
-	cscope distdir dist dist-all distcheck
+	distdir dist dist-all distcheck
 ETAGS = etags
 CTAGS = ctags
-CSCOPE = cscope
 DIST_SUBDIRS = m4 src test
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
@@ -111,7 +111,6 @@ am__remove_distdir = \
       && rm -rf "$(distdir)" \
       || { sleep 5 && rm -rf "$(distdir)"; }; \
   else :; fi
-am__post_remove_distdir = $(am__remove_distdir)
 am__relativize = \
   dir0=`pwd`; \
   sed_first='s,^\([^/]*\)/.*$$,\1,'; \
@@ -139,7 +138,6 @@ am__relativize = \
   reldir="$$dir2"
 GZIP_ENV = --best
 DIST_ARCHIVES = $(distdir).tar.bz2
-DIST_TARGETS = dist-bzip2
 distuninstallcheck_listfiles = find . -type f -print
 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
   | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
@@ -360,11 +358,11 @@ distclean-libtool:
 	-rm -f libtool config.lt
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
 $(RECURSIVE_TARGETS):
 	@fail= failcom='exit 1'; \
 	for f in x $$MAKEFLAGS; do \
@@ -428,10 +426,6 @@ ctags-recursive:
 	list='$(SUBDIRS)'; for subdir in $$list; do \
 	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
 	done
-cscopelist-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \
-	done
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -495,32 +489,8 @@ GTAGS:
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
 
-cscope: cscope.files
-	test ! -s cscope.files \
-	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
-
-clean-cscope:
-	-rm -f cscope.files
-
-cscope.files: clean-cscope cscopelist-recursive cscopelist
-
-cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS) $(LISP)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
 
 distdir: $(DISTFILES)
 	$(am__remove_distdir)
@@ -588,35 +558,39 @@ distdir: $(DISTFILES)
 	|| chmod -R a+r "$(distdir)"
 dist-gzip: distdir
 	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 dist-bzip2: distdir
 	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
 dist-lzip: distdir
 	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
 
 dist-xz: distdir
 	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
 dist-tarZ: distdir
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
 dist-shar: distdir
 	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
 dist-zip: distdir
 	-rm -f $(distdir).zip
 	zip -rq $(distdir).zip $(distdir)
-	$(am__post_remove_distdir)
+	$(am__remove_distdir)
 
-dist dist-all:
-	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
-	$(am__post_remove_distdir)
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(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
@@ -627,6 +601,8 @@ distcheck: dist
 	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
 	*.tar.bz2*) \
 	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
 	*.tar.lz*) \
 	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
 	*.tar.xz*) \
@@ -638,7 +614,7 @@ distcheck: dist
 	*.zip*) \
 	  unzip $(distdir).zip ;;\
 	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	chmod -R a-w $(distdir); chmod u+w $(distdir)
 	mkdir $(distdir)/_build
 	mkdir $(distdir)/_inst
 	chmod a-w $(distdir)
@@ -672,7 +648,7 @@ distcheck: dist
 	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
 	  && cd "$$am__cwd" \
 	  || exit 1
-	$(am__post_remove_distdir)
+	$(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'
@@ -808,14 +784,12 @@ ps-am:
 uninstall-am:
 
 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
-	cscopelist-recursive ctags-recursive install-am install-strip \
-	tags-recursive
+	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-cscope \
-	clean-generic clean-libtool cscope cscopelist \
-	cscopelist-recursive ctags ctags-recursive dist dist-all \
-	dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \
+	all all-am am--refresh check check-am clean clean-generic \
+	clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
+	dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \
 	dist-zip distcheck distclean distclean-generic distclean-hdr \
 	distclean-libtool distclean-tags distcleancheck distdir \
 	distuninstallcheck dvi dvi-am html html-am info info-am \
diff --git a/eglib/aclocal.m4 b/eglib/aclocal.m4
index 390749a..06b265a 100644
--- a/eglib/aclocal.m4
+++ b/eglib/aclocal.m4
@@ -1,7 +1,8 @@
-# generated automatically by aclocal 1.12.1 -*- Autoconf -*-
-
-# Copyright (C) 1996-2012 Free Software Foundation, Inc.
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
 
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
 # This file 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,15 +18,16 @@ m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
 [m4_warning([this file was generated for autoconf 2.69.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
 
-# Copyright (C) 2002-2012 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
 #
 # This file 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.
 
-# serial 8
+# serial 1
 
 # AM_AUTOMAKE_VERSION(VERSION)
 # ----------------------------
@@ -33,10 +35,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.12'
+[am__api_version='1.11'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.12.1], [],
+m4_if([$1], [1.11.6], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -52,24 +54,24 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.12.1])dnl
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 2
+# serial 1
 
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
-# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
 #
 # Of course, Automake must honor this variable whenever it calls a
 # tool from the auxiliary directory.  The problem is that $srcdir (and
@@ -88,7 +90,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 #
 # The reason of the latter failure is that $top_srcdir and $ac_aux_dir
 # are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is '.', but things will broke when you
+# harmless because $srcdir is `.', but things will broke when you
 # start a VPATH build or use an absolute $srcdir.
 #
 # So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
@@ -114,21 +116,22 @@ am_aux_dir=`cd $ac_aux_dir && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2012 Free Software Foundation, Inc.
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 10
+# serial 9
 
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
 # Define a conditional.
 AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ([2.52])dnl
- m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
 AC_SUBST([$1_TRUE])dnl
 AC_SUBST([$1_FALSE])dnl
 _AM_SUBST_NOTMAKE([$1_TRUE])dnl
@@ -147,15 +150,16 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2012 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 17
+# serial 12
 
-# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
 # will think it sees a *use*, and therefore will trigger all it's
 # C support machinery.  Also note that it means that autoscan, seeing
@@ -165,7 +169,7 @@ fi])])
 # _AM_DEPENDENCIES(NAME)
 # ----------------------
 # See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
 # We try a few techniques and use that to set a single cache variable.
 #
 # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
@@ -178,13 +182,12 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
 AC_REQUIRE([AM_MAKE_INCLUDE])dnl
 AC_REQUIRE([AM_DEP_TRACK])dnl
 
-m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
-      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
-      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
-      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
-      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                    [depcc="$$1"   am_compiler_list=])
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
 
 AC_CACHE_CHECK([dependency style of $depcc],
                [am_cv_$1_dependencies_compiler_type],
@@ -192,8 +195,8 @@ AC_CACHE_CHECK([dependency style of $depcc],
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named 'D' -- because '-MD' means "put the output
-  # in D".
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
   rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
@@ -233,16 +236,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
-      # Solaris 10 /bin/sh.
-      echo '/* dummy */' > sub/conftst$i.h
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle '-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs.
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -251,8 +254,8 @@ AC_CACHE_CHECK([dependency style of $depcc],
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # After this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested.
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
       if test "x$enable_dependency_tracking" = xyes; then
 	continue
       else
@@ -260,7 +263,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
       fi
       ;;
     msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok '-c -o', but also, the minuso test has
+      # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -308,7 +311,7 @@ AM_CONDITIONAL([am__fastdep$1], [
 # AM_SET_DEPDIR
 # -------------
 # Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
 AC_DEFUN([AM_SET_DEPDIR],
 [AC_REQUIRE([AM_SET_LEADING_DOT])dnl
 AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
@@ -318,13 +321,9 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
 # AM_DEP_TRACK
 # ------------
 AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE([dependency-tracking], [dnl
-AS_HELP_STRING(
-  [--enable-dependency-tracking],
-  [do not reject slow dependency extractors])
-AS_HELP_STRING(
-  [--disable-dependency-tracking],
-  [speeds up one-time build])])
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
@@ -339,13 +338,14 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2012 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 6
+#serial 5
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
@@ -364,7 +364,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named 'Makefile.in', but
+    # We used to match only the files named `Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -376,19 +376,21 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running 'make'.
+    # from the Makefile without running `make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
     test -z "am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`AS_DIRNAME(["$file"])`
@@ -406,7 +408,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 # This macro should only be invoked once -- use via AC_REQUIRE.
 #
 # This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each '.P' file that we will
+# is enabled.  FIXME.  This creates each `.P' file that we will
 # need in order to bootstrap the dependency handling code.
 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 [AC_CONFIG_COMMANDS([depfiles],
@@ -416,13 +418,14 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2012 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 19
+# serial 16
 
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
@@ -468,37 +471,31 @@ AC_SUBST([CYGPATH_W])
 # Define the identity of the package.
 dnl Distinguish between old-style and new-style calls.
 m4_ifval([$2],
-[AC_DIAGNOSE([obsolete],
-[$0: two- and three-arguments forms are deprecated.  For more info, see:
-http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation])
-m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
  AC_SUBST([PACKAGE], [$1])dnl
  AC_SUBST([VERSION], [$2])],
 [_AM_SET_OPTIONS([$1])dnl
 dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(
-  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
-  [ok:ok],,
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
   [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
  AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
 
 _AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
- AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
 
 # Some tools Automake needs.
 AC_REQUIRE([AM_SANITY_CHECK])dnl
 AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
-AM_MISSING_PROG([AUTOCONF], [autoconf])
-AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
-AM_MISSING_PROG([AUTOHEADER], [autoheader])
-AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
 AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
 AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
@@ -509,35 +506,28 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
 			     [_AM_PROG_TAR([v7])])])
 _AM_IF_OPTION([no-dependencies],,
 [AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES([CC])],
-		  [m4_define([AC_PROG_CC],
-			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES([CXX])],
-		  [m4_define([AC_PROG_CXX],
-			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES([OBJC])],
-		  [m4_define([AC_PROG_OBJC],
-			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
-dnl Support for Objective C++ was only introduced in Autoconf 2.65,
-dnl but we still cater to Autoconf 2.62.
-m4_ifdef([AC_PROG_OBJCXX],
-[AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
-		  [_AM_DEPENDENCIES([OBJCXX])],
-		  [m4_define([AC_PROG_OBJCXX],
-			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
 ])
 _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the
-dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
 dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
 AC_CONFIG_COMMANDS_PRE(dnl
 [m4_provide_if([_AM_COMPILER_EXEEXT],
   [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
 ])
 
-dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
 dnl mangled by Autoconf and run in a shell conditional statement.
 m4_define([_AC_COMPILER_EXEEXT],
@@ -565,13 +555,14 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
 #
 # This file 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.
 
-# serial 8
+# serial 1
 
 # AM_PROG_INSTALL_SH
 # ------------------
@@ -586,9 +577,9 @@ if test x"${install_sh}" != xset; then
     install_sh="\${SHELL} $am_aux_dir/install-sh"
   esac
 fi
-AC_SUBST([install_sh])])
+AC_SUBST(install_sh)])
 
-# Copyright (C) 2003-2012 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -612,19 +603,20 @@ AC_SUBST([am__leading_dot])])
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996-2012 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 7
+# serial 5
 
 # AM_MAINTAINER_MODE([DEFAULT-MODE])
 # ----------------------------------
 # Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless 'enable' is passed literally.
-# For symmetry, 'disable' may be passed as well.  Anyway, the user
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
 # can override the default with the --enable/--disable switch.
 AC_DEFUN([AM_MAINTAINER_MODE],
 [m4_case(m4_default([$1], [disable]),
@@ -635,11 +627,10 @@ AC_DEFUN([AM_MAINTAINER_MODE],
 AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
   dnl maintainer-mode's default is 'disable' unless 'enable' is passed
   AC_ARG_ENABLE([maintainer-mode],
-    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
-      am_maintainer_other[ make rules and dependencies not useful
-      (and sometimes confusing) to the casual installer])],
-    [USE_MAINTAINER_MODE=$enableval],
-    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
   AC_MSG_RESULT([$USE_MAINTAINER_MODE])
   AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
   MAINT=$MAINTAINER_MODE_TRUE
@@ -651,13 +642,13 @@ AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 5
+# serial 4
 
 # AM_MAKE_INCLUDE()
 # -----------------
@@ -676,7 +667,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
+# Ignore all kinds of additional output from `make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -703,13 +694,14 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2012 Free Software Foundation, Inc.
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 7
+# serial 6
 
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
@@ -739,19 +731,49 @@ if eval "$MISSING --run true"; then
   am_missing_run="$MISSING --run "
 else
   am_missing_run=
-  AC_MSG_WARN(['missing' script is too old or missing])
+  AC_MSG_WARN([`missing' script is too old or missing])
 fi
 ])
 
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
+#
+# This file 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.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
 #
 # This file 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.
 
-# serial 6
+# serial 5
 
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
@@ -762,7 +784,7 @@ AC_DEFUN([_AM_MANGLE_OPTION],
 # --------------------
 # Set option NAME.  Presently that only means defining a flag for this option.
 AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
 
 # _AM_SET_OPTIONS(OPTIONS)
 # ------------------------
@@ -776,7 +798,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -797,18 +819,22 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2012 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 9
+# serial 5
 
 # AM_SANITY_CHECK
 # ---------------
 AC_DEFUN([AM_SANITY_CHECK],
 [AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -819,40 +845,32 @@ case `pwd` in
 esac
 case $srcdir in
   *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
 esac
 
-# Do 'set' in a subshell so we don't clobber the current shell's
+# Do `set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   am_has_slept=no
-   for am_try in 1 2; do
-     echo "timestamp, slept: $am_has_slept" > conftest.file
-     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-     if test "$[*]" = "X"; then
-	# -L didn't work.
-	set X `ls -t "$srcdir/configure" conftest.file`
-     fi
-     if test "$[*]" != "X $srcdir/configure conftest.file" \
-	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-	# If neither matched, then we have a broken ls.  This can happen
-	# if, for instance, CONFIG_SHELL is bash and it inherits a
-	# broken ls alias from the environment.  This has actually
-	# happened.  Such a system could not be considered "sane".
-	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-  alias in your environment])
-     fi
-     if test "$[2]" = conftest.file || test $am_try -eq 2; then
-       break
-     fi
-     # Just in case.
-     sleep 1
-     am_has_slept=yes
-   done
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
    test "$[2]" = conftest.file
    )
 then
@@ -862,52 +880,31 @@ else
    AC_MSG_ERROR([newly created file is older than distributed files!
 Check your system clock])
 fi
-AC_MSG_RESULT([yes])
-# If we didn't sleep, we still need to ensure time stamps of config.status and
-# generated files are strictly newer.
-am_sleep_pid=
-if grep 'slept: no' conftest.file >/dev/null 2>&1; then
-  ( sleep 1 ) &
-  am_sleep_pid=$!
-fi
-AC_CONFIG_COMMANDS_PRE(
-  [AC_MSG_CHECKING([that generated files are newer than configure])
-   if test -n "$am_sleep_pid"; then
-     # Hide warnings about reused PIDs.
-     wait $am_sleep_pid 2>/dev/null
-   fi
-   AC_MSG_RESULT([done])])
-rm -f conftest.file
-])
+AC_MSG_RESULT(yes)])
 
-# Copyright (C) 2009-2012 Free Software Foundation, Inc.
+# Copyright (C) 2009, 2011  Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 3
+# serial 2
 
 # AM_SILENT_RULES([DEFAULT])
 # --------------------------
 # Enable less verbose build rules; with the default set to DEFAULT
-# ("yes" being less verbose, "no" or empty being verbose).
+# (`yes' being less verbose, `no' or empty being verbose).
 AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules], [dnl
-AS_HELP_STRING(
-  [--enable-silent-rules],
-  [less verbose build output (undo: "make V=1")])
-AS_HELP_STRING(
-  [--disable-silent-rules],
-  [verbose build output (undo: "make V=0")])dnl
-])
-case $enable_silent_rules in @%:@ (((
-  yes) AM_DEFAULT_VERBOSITY=0;;
-   no) AM_DEFAULT_VERBOSITY=1;;
-    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+[AC_ARG_ENABLE([silent-rules],
+[  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')])
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
 esac
 dnl
-dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl A few `make' implementations (e.g., NonStop OS and NextStep)
 dnl do not support nested variable expansions.
 dnl See automake bug#9928 and bug#10237.
 am_make=${MAKE-make}
@@ -925,7 +922,7 @@ else
   am_cv_make_support_nested_variables=no
 fi])
 if test $am_cv_make_support_nested_variables = yes; then
-  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  dnl Using `$V' instead of `$(V)' breaks IRIX make.
   AM_V='$(V)'
   AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
 else
@@ -942,37 +939,37 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 2
+# serial 1
 
 # AM_PROG_INSTALL_STRIP
 # ---------------------
-# One issue with vendor 'install' (even GNU) is that you can't
+# One issue with vendor `install' (even GNU) is that you can't
 # specify the program used to strip binaries.  This is especially
 # annoying in cross-compiling environments, where the build's strip
 # is unlikely to handle the host's binaries.
 # Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in "make install-strip", and initialize
+# always use install-sh in `make install-strip', and initialize
 # STRIPPROG with the value of the STRIP variable (set by the user).
 AC_DEFUN([AM_PROG_INSTALL_STRIP],
 [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using 'strip' when the user
-# run "make install-strip".  However 'strip' might not be the right
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the 'STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
 if test "$cross_compiling" != no; then
   AC_CHECK_TOOL([STRIP], [strip], :)
 fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2012 Free Software Foundation, Inc.
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -993,18 +990,18 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2012 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
 #
 # This file 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.
 
-# serial 3
+# serial 2
 
 # _AM_PROG_TAR(FORMAT)
 # --------------------
 # Check how to create a tarball in format FORMAT.
-# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+# FORMAT should be one of `v7', `ustar', or `pax'.
 #
 # Substitute a variable $(am__tar) that is a command
 # writing to stdout a FORMAT-tarball containing the directory
@@ -1027,7 +1024,7 @@ AC_MSG_CHECKING([how to create a $1 tar archive])
 _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
 _am_tools=${am_cv_prog_tar_$1-$_am_tools}
 # Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of '-'.
+# Solaris sh will not grok spaces in the rhs of `-'.
 for _am_tool in $_am_tools
 do
   case $_am_tool in
diff --git a/eglib/configure b/eglib/configure
index 92ab952..3bbb186 100755
--- a/eglib/configure
+++ b/eglib/configure
@@ -1442,15 +1442,12 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-maintainer-mode
-                          enable make rules and dependencies not useful (and
-                          sometimes confusing) to the casual installer
-  --enable-silent-rules   less verbose build output (undo: "make V=1")
-  --disable-silent-rules  verbose build output (undo: "make V=0")
-  --enable-dependency-tracking
-                          do not reject slow dependency extractors
-  --disable-dependency-tracking
-                          speeds up one-time build
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer
+  --enable-silent-rules          less verbose build output (undo: `make V=1')
+  --disable-silent-rules         verbose build output (undo: `make V=0')
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
   --enable-shared[=PKGS]  build shared libraries [default=yes]
   --enable-static[=PKGS]  build static libraries [default=yes]
   --enable-fast-install[=PKGS]
@@ -2592,7 +2589,7 @@ test -n "$target_alias" &&
 
 
 
-am__api_version='1.12'
+am__api_version='1.11'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -2689,6 +2686,9 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
 $as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -2699,40 +2699,32 @@ case `pwd` in
 esac
 case $srcdir in
   *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
 esac
 
-# Do 'set' in a subshell so we don't clobber the current shell's
+# Do `set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   am_has_slept=no
-   for am_try in 1 2; do
-     echo "timestamp, slept: $am_has_slept" > conftest.file
-     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-     if test "$*" = "X"; then
-	# -L didn't work.
-	set X `ls -t "$srcdir/configure" conftest.file`
-     fi
-     if test "$*" != "X $srcdir/configure conftest.file" \
-	&& test "$*" != "X conftest.file $srcdir/configure"; then
-
-	# If neither matched, then we have a broken ls.  This can happen
-	# if, for instance, CONFIG_SHELL is bash and it inherits a
-	# broken ls alias from the environment.  This has actually
-	# happened.  Such a system could not be considered "sane".
-	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-  alias in your environment" "$LINENO" 5
-     fi
-     if test "$2" = conftest.file || test $am_try -eq 2; then
-       break
-     fi
-     # Just in case.
-     sleep 1
-     am_has_slept=yes
-   done
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
    test "$2" = conftest.file
    )
 then
@@ -2744,16 +2736,6 @@ Check your system clock" "$LINENO" 5
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
-# If we didn't sleep, we still need to ensure time stamps of config.status and
-# generated files are strictly newer.
-am_sleep_pid=
-if grep 'slept: no' conftest.file >/dev/null 2>&1; then
-  ( sleep 1 ) &
-  am_sleep_pid=$!
-fi
-
-rm -f conftest.file
-
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
@@ -2780,8 +2762,8 @@ if eval "$MISSING --run true"; then
   am_missing_run="$MISSING --run "
 else
   am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
 fi
 
 if test x"${install_sh}" != xset; then
@@ -2793,10 +2775,10 @@ if test x"${install_sh}" != xset; then
   esac
 fi
 
-# Installed binaries are usually stripped using 'strip' when the user
-# run "make install-strip".  However 'strip' might not be the right
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the 'STRIP' environment variable to overrule this program.
+# will honor the `STRIP' environment variable to overrule this program.
 if test "$cross_compiling" != no; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
@@ -2935,6 +2917,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
 $as_echo "$MKDIR_P" >&6; }
 
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -3067,7 +3055,6 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
-mkdir_p="$MKDIR_P"
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
@@ -3081,7 +3068,7 @@ $as_echo_n "checking how to create a ustar tar archive... " >&6; }
 _am_tools='gnutar plaintar pax cpio none'
 _am_tools=${am_cv_prog_tar_ustar-$_am_tools}
 # Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of '-'.
+# Solaris sh will not grok spaces in the rhs of `-'.
 for _am_tool in $_am_tools
 do
   case $_am_tool in
@@ -3192,10 +3179,10 @@ if test "${enable_silent_rules+set}" = set; then :
   enableval=$enable_silent_rules;
 fi
 
-case $enable_silent_rules in # (((
-  yes) AM_DEFAULT_VERBOSITY=0;;
-   no) AM_DEFAULT_VERBOSITY=1;;
-    *) AM_DEFAULT_VERBOSITY=0;;
+case $enable_silent_rules in
+yes) AM_DEFAULT_VERBOSITY=0;;
+no)  AM_DEFAULT_VERBOSITY=1;;
+*)   AM_DEFAULT_VERBOSITY=0;;
 esac
 am_make=${MAKE-make}
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
@@ -4034,7 +4021,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
+# Ignore all kinds of additional output from `make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -4090,8 +4077,8 @@ else
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named 'D' -- because '-MD' means "put the output
-  # in D".
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
   rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
@@ -4126,16 +4113,16 @@ else
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
-      # Solaris 10 /bin/sh.
-      echo '/* dummy */' > sub/conftst$i.h
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle '-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs.
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -4144,8 +4131,8 @@ else
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # After this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested.
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
       if test "x$enable_dependency_tracking" = xyes; then
 	continue
       else
@@ -4153,7 +4140,7 @@ else
       fi
       ;;
     msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok '-c -o', but also, the minuso test has
+      # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -5422,10 +5409,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -5464,11 +5447,11 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
   else
@@ -8391,7 +8374,7 @@ lt_prog_compiler_static=
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -8869,6 +8852,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
   esac
 
   ld_shlibs=yes
@@ -9090,7 +9076,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
@@ -9267,6 +9253,7 @@ _LT_EOF
 	if test "$aix_use_runtimelinking" = yes; then
 	  shared_flag="$shared_flag "'${wl}-G'
 	fi
+	link_all_deplibs=no
       else
 	# not using gcc
 	if test "$host_cpu" = ia64; then
@@ -9720,7 +9707,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       link_all_deplibs=yes
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -10557,17 +10544,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -10684,7 +10660,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -10748,6 +10724,18 @@ fi
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -13950,14 +13938,6 @@ LIBOBJS=$ac_libobjs
 LTLIBOBJS=$ac_ltlibobjs
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
-$as_echo_n "checking that generated files are newer than configure... " >&6; }
-   if test -n "$am_sleep_pid"; then
-     # Hide warnings about reused PIDs.
-     wait $am_sleep_pid 2>/dev/null
-   fi
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
-$as_echo "done" >&6; }
  if test -n "$EXEEXT"; then
   am__EXEEXT_TRUE=
   am__EXEEXT_FALSE='#'
@@ -15493,7 +15473,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named 'Makefile.in', but
+    # We used to match only the files named `Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -15527,19 +15507,21 @@ $as_echo X"$mf" |
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running 'make'.
+    # from the Makefile without running `make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
     test -z "am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`$as_dirname -- "$file" ||
diff --git a/eglib/m4/Makefile.in b/eglib/m4/Makefile.in
index 792664b..ec19572 100644
--- a/eglib/m4/Makefile.in
+++ b/eglib/m4/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -51,8 +52,7 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = m4
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(top_srcdir)/../mkinstalldirs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -68,7 +68,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -272,8 +272,6 @@ TAGS:
 ctags: CTAGS
 CTAGS:
 
-cscope cscopelist:
-
 
 distdir: $(DISTFILES)
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/eglib/m4/libtool.m4 b/eglib/m4/libtool.m4
index 44e0ecf..534d1cc 100644
--- a/eglib/m4/libtool.m4
+++ b/eglib/m4/libtool.m4
@@ -2512,17 +2512,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -2639,7 +2628,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -2684,6 +2673,18 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -3243,10 +3244,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -3285,11 +3282,11 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
   else
@@ -4037,7 +4034,7 @@ m4_if([$1], [CXX], [
 	    ;;
 	esac
 	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
 	case $cc_basename in
 	  KCC*)
 	    # KAI C++ Compiler
@@ -4101,7 +4098,7 @@ m4_if([$1], [CXX], [
 	    ;;
 	esac
 	;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
 	;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -4336,7 +4333,7 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -4578,6 +4575,9 @@ m4_if([$1], [CXX], [
       ;;
     esac
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   *)
     _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
     ;;
@@ -4640,6 +4640,9 @@ dnl Note also adjust exclude_expsyms for C++ above.
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   esac
 
   _LT_TAGVAR(ld_shlibs, $1)=yes
@@ -4861,7 +4864,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
@@ -5038,6 +5041,7 @@ _LT_EOF
 	if test "$aix_use_runtimelinking" = yes; then
 	  shared_flag="$shared_flag "'${wl}-G'
 	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
       else
 	# not using gcc
 	if test "$host_cpu" = ia64; then
@@ -5342,7 +5346,7 @@ _LT_EOF
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -6222,9 +6226,6 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
@@ -6386,7 +6387,7 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
 	    # Kuck and Associates, Inc. (KAI) C++ Compiler
diff --git a/eglib/src/Makefile.in b/eglib/src/Makefile.in
index bc5cd9b..6dbf65e 100644
--- a/eglib/src/Makefile.in
+++ b/eglib/src/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -53,8 +54,7 @@ host_triplet = @host@
 target_triplet = @target@
 subdir = src
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/eglib-config.h.in $(top_srcdir)/../depcomp \
-	$(top_srcdir)/../mkinstalldirs
+	$(srcdir)/eglib-config.h.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -163,7 +163,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 AM_V_CC = $(am__v_CC_ at AM_V@)
 am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
-am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_0 = @echo "  CC    " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -173,10 +173,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_0 = @echo "  CCLD  " $@;
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 SOURCES = $(libeglib_static_la_SOURCES) $(libeglib_la_SOURCES)
 DIST_SOURCES = $(am__libeglib_static_la_SOURCES_DIST) \
 	$(am__libeglib_la_SOURCES_DIST)
@@ -432,14 +432,12 @@ eglib-config.h: $(top_builddir)/config.status $(srcdir)/eglib-config.h.in
 
 clean-noinstLTLIBRARIES:
 	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; \
-	locs=`for p in $$list; do echo $$p; done | \
-	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
-	      sort -u`; \
-	test -z "$$locs" || { \
-	  echo rm -f $${locs}; \
-	  rm -f $${locs}; \
-	}
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
 libeglib-static.la: $(libeglib_static_la_OBJECTS) $(libeglib_static_la_DEPENDENCIES) $(EXTRA_libeglib_static_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(libeglib_static_la_LINK)  $(libeglib_static_la_OBJECTS) $(libeglib_static_la_LIBADD) $(LIBS)
 libeglib.la: $(libeglib_la_OBJECTS) $(libeglib_la_DEPENDENCIES) $(EXTRA_libeglib_la_DEPENDENCIES) 
@@ -1104,20 +1102,6 @@ GTAGS:
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
 
-cscopelist:  $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS) $(LISP)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
@@ -1260,18 +1244,17 @@ uninstall-am:
 .MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstLTLIBRARIES cscopelist ctags \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool 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 install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am
+	clean-libtool clean-noinstLTLIBRARIES ctags distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	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 \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags uninstall uninstall-am
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/eglib/src/gmisc-win32.c b/eglib/src/gmisc-win32.c
index 07dcf39..f89f37c 100644
--- a/eglib/src/gmisc-win32.c
+++ b/eglib/src/gmisc-win32.c
@@ -87,10 +87,12 @@ g_unsetenv(const gchar *variable)
 gchar*
 g_win32_getlocale(void)
 {
-	/* FIXME: Use GetThreadLocale
-	 * and convert LCID to standard 
-	 * string form, "en_US" */
-	return strdup ("en_US");
+	LCID lcid = GetThreadLocale();
+	gchar buf[19];
+	gint ccBuf = GetLocaleInfo(lcid, LOCALE_SISO639LANGNAME, buf, 9);
+	buf[ccBuf - 1] = '-';
+	ccBuf += GetLocaleInfo(lcid, LOCALE_SISO3166CTRYNAME, buf + ccBuf, 9);
+	return strdup(buf);
 }
 
 gboolean
diff --git a/eglib/test/Makefile.in b/eglib/test/Makefile.in
index c358da6..d2de081 100644
--- a/eglib/test/Makefile.in
+++ b/eglib/test/Makefile.in
@@ -1,8 +1,9 @@
-# Makefile.in generated by automake 1.12.1 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2012 Free Software Foundation, Inc.
-
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
@@ -55,8 +56,7 @@ target_triplet = @target@
 @HAVE_GLIB_TRUE at noinst_PROGRAMS = test-glib$(EXEEXT) \
 @HAVE_GLIB_TRUE@	test-eglib$(EXEEXT)
 subdir = test
-DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(top_srcdir)/../depcomp $(top_srcdir)/../mkinstalldirs
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/iconv.m4 \
 	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
@@ -126,7 +126,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 AM_V_CC = $(am__v_CC_ at AM_V@)
 am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
-am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_0 = @echo "  CC    " $@;
 AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
@@ -136,10 +136,10 @@ LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_0 = @echo "  CCLD  " $@;
 AM_V_GEN = $(am__v_GEN_ at AM_V@)
 am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_0 = @echo "  GEN   " $@;
 DIST_SOURCES = $(test_eglib_SOURCES) $(am__test_glib_SOURCES_DIST)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
@@ -1215,20 +1215,6 @@ GTAGS:
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
 
-cscopelist:  $(HEADERS) $(SOURCES) $(LISP)
-	list='$(SOURCES) $(HEADERS) $(LISP)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
 distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
@@ -1371,7 +1357,7 @@ uninstall-am:
 .MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstPROGRAMS cscopelist ctags distclean \
+	clean-libtool clean-noinstPROGRAMS ctags distclean \
 	distclean-compile distclean-generic distclean-libtool \
 	distclean-tags distdir dvi dvi-am html html-am info info-am \
 	install install-am install-data install-data-am install-dvi \
diff --git a/eglib/test/sizes.c b/eglib/test/sizes.c
index 585cc11..06ed8a5 100644
--- a/eglib/test/sizes.c
+++ b/eglib/test/sizes.c
@@ -60,22 +60,22 @@ test_ptrconv ()
 		return FAILED ("int to pointer and back conversions fail %d != %d", iv, iv2);
 
 	uv = 0;
-	ptr = GUINT_TO_POINTER (iv);
+	ptr = GUINT_TO_POINTER (uv);
 	uv2 = GPOINTER_TO_UINT (ptr);
-	if (iv != iv2)
-		return FAILED ("uint to pointer and back conversions fail %u != %d", iv, iv2);
+	if (uv != uv2)
+		return FAILED ("uint to pointer and back conversions fail %u != %d", uv, uv2);
 	
 	uv = 1;
-	ptr = GUINT_TO_POINTER (iv);
+	ptr = GUINT_TO_POINTER (uv);
 	uv2 = GPOINTER_TO_UINT (ptr);
-	if (iv != iv2)
-		return FAILED ("uint to pointer and back conversions fail %u != %d", iv, iv2);
+	if (uv != uv2)
+		return FAILED ("uint to pointer and back conversions fail %u != %d", uv, uv2);
 
 	uv = UINT32_MAX;
-	ptr = GUINT_TO_POINTER (iv);
+	ptr = GUINT_TO_POINTER (uv);
 	uv2 = GPOINTER_TO_UINT (ptr);
-	if (iv != iv2)
-		return FAILED ("uint to pointer and back conversions fail %u != %d", iv, iv2);
+	if (uv != uv2)
+		return FAILED ("uint to pointer and back conversions fail %u != %d", uv, uv2);
 
 	return NULL;
 	
diff --git a/external/cecil/.gitattributes b/external/cecil/.gitattributes
new file mode 100644
index 0000000..7d07d70
--- /dev/null
+++ b/external/cecil/.gitattributes
@@ -0,0 +1 @@
+* text=lf
diff --git a/external/cecil/Mono.Cecil.PE/Image.cs b/external/cecil/Mono.Cecil.PE/Image.cs
index e5d8075..a11cf1c 100644
--- a/external/cecil/Mono.Cecil.PE/Image.cs
+++ b/external/cecil/Mono.Cecil.PE/Image.cs
@@ -41,6 +41,7 @@ namespace Mono.Cecil.PE {
 		public ModuleKind Kind;
 		public TargetRuntime Runtime;
 		public TargetArchitecture Architecture;
+		public ModuleCharacteristics Characteristics;
 		public string FileName;
 
 		public Section [] Sections;
diff --git a/external/cecil/Mono.Cecil.PE/ImageReader.cs b/external/cecil/Mono.Cecil.PE/ImageReader.cs
index b320169..c96c1db 100644
--- a/external/cecil/Mono.Cecil.PE/ImageReader.cs
+++ b/external/cecil/Mono.Cecil.PE/ImageReader.cs
@@ -99,13 +99,14 @@ namespace Mono.Cecil.PE {
 			// Characteristics		2
 			ushort characteristics = ReadUInt16 ();
 
-			ushort subsystem;
-			ReadOptionalHeaders (out subsystem);
+			ushort subsystem, dll_characteristics;
+			ReadOptionalHeaders (out subsystem, out dll_characteristics);
 			ReadSections (sections);
 			ReadCLIHeader ();
 			ReadMetadata ();
 
 			image.Kind = GetModuleKind (characteristics, subsystem);
+			image.Characteristics = (ModuleCharacteristics) dll_characteristics;
 		}
 
 		TargetArchitecture ReadArchitecture ()
@@ -136,7 +137,7 @@ namespace Mono.Cecil.PE {
 			return ModuleKind.Console;
 		}
 
-		void ReadOptionalHeaders (out ushort subsystem)
+		void ReadOptionalHeaders (out ushort subsystem, out ushort dll_characteristics)
 		{
 			// - PEOptionalHeader
 			//   - StandardFieldsHeader
@@ -176,6 +177,7 @@ namespace Mono.Cecil.PE {
 			subsystem = ReadUInt16 ();
 
 			// DLLFlags				2
+			dll_characteristics = ReadUInt16 ();
 			// StackReserveSize		4 || 8
 			// StackCommitSize		4 || 8
 			// HeapReserveSize		4 || 8
@@ -192,7 +194,7 @@ namespace Mono.Cecil.PE {
 			// CertificateTable		8
 			// BaseRelocationTable	8
 
-			Advance (pe64 ? 90 : 74);
+			Advance (pe64 ? 88 : 72);
 
 			// Debug				8
 			image.Debug = ReadDataDirectory ();
diff --git a/external/cecil/Mono.Cecil.PE/ImageWriter.cs b/external/cecil/Mono.Cecil.PE/ImageWriter.cs
index 8a991d8..08f9ea2 100644
--- a/external/cecil/Mono.Cecil.PE/ImageWriter.cs
+++ b/external/cecil/Mono.Cecil.PE/ImageWriter.cs
@@ -58,6 +58,7 @@ namespace Mono.Cecil.PE {
 		internal const RVA text_rva = 0x2000;
 
 		readonly bool pe64;
+		readonly bool has_reloc;
 		readonly uint time_stamp;
 
 		internal Section text;
@@ -71,11 +72,12 @@ namespace Mono.Cecil.PE {
 		{
 			this.module = module;
 			this.metadata = metadata;
-			this.pe64 = module.Architecture != TargetArchitecture.I386;
+			this.pe64 = module.Architecture == TargetArchitecture.AMD64 || module.Architecture == TargetArchitecture.IA64;
+			this.has_reloc = module.Architecture == TargetArchitecture.I386;
 			this.GetDebugHeader ();
 			this.GetWin32Resources ();
 			this.text_map = BuildTextMap ();
-			this.sections = (ushort) (pe64 ? 1 : 2); // text + reloc
+			this.sections = (ushort) (has_reloc ? 2 : 1); // text + reloc?
 			this.time_stamp = (uint) DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1)).TotalSeconds;
 		}
 
@@ -133,7 +135,7 @@ namespace Mono.Cecil.PE {
 				previous = rsrc;
 			}
 
-			if (!pe64)
+			if (has_reloc)
 				reloc = CreateSection (".reloc", 12u, previous);
 		}
 
@@ -213,6 +215,8 @@ namespace Mono.Cecil.PE {
 				return 0x8664;
 			case TargetArchitecture.IA64:
 				return 0x0200;
+			case TargetArchitecture.ARMv7:
+				return 0x01c4;
 			}
 
 			throw new NotSupportedException ();
@@ -267,7 +271,7 @@ namespace Mono.Cecil.PE {
 
 			WriteUInt32 (0);	// Checksum
 			WriteUInt16 (GetSubSystem ());	// SubSystem
-			WriteUInt16 (0x8540);	// DLLFlags
+			WriteUInt16 ((ushort) module.Characteristics);	// DLLFlags
 
 			const ulong stack_reserve = 0x100000;
 			const ulong stack_commit = 0x1000;
@@ -398,7 +402,7 @@ namespace Mono.Cecil.PE {
 
 			// ImportAddressTable
 
-			if (!pe64) {
+			if (has_reloc) {
 				WriteRVA (text_map.GetRVA (TextSegment.ImportHintNameTable));
 				WriteRVA (0);
 			}
@@ -453,7 +457,7 @@ namespace Mono.Cecil.PE {
 				WriteDebugDirectory ();
 			}
 
-			if (pe64)
+			if (!has_reloc)
 				return;
 
 			// ImportDirectory
@@ -696,7 +700,7 @@ namespace Mono.Cecil.PE {
 
 			map.AddMap (TextSegment.DebugDirectory, debug_dir_len, 4);
 
-			if (pe64) {
+			if (!has_reloc) {
 				var start = map.GetNextRVA (TextSegment.DebugDirectory);
 				map.AddMap (TextSegment.ImportDirectory, new Range (start, 0));
 				map.AddMap (TextSegment.ImportHintNameTable, new Range (start, 0));
@@ -754,17 +758,18 @@ namespace Mono.Cecil.PE {
 				return 0;
 
 			var public_key = module.Assembly.Name.PublicKey;
+			if (public_key.IsNullOrEmpty ())
+				return 0;
 
-			if (public_key != null) {
-				// in fx 2.0 the key may be from 384 to 16384 bits
-				// so we must calculate the signature size based on
-				// the size of the public key (minus the 32 byte header)
-				int size = public_key.Length;
-				if (size > 32)
-					return size - 32;
-				// note: size == 16 for the ECMA "key" which is replaced
-				// by the runtime with a 1024 bits key (128 bytes)
-			}
+			// in fx 2.0 the key may be from 384 to 16384 bits
+			// so we must calculate the signature size based on
+			// the size of the public key (minus the 32 byte header)
+			int size = public_key.Length;
+			if (size > 32)
+				return size - 32;
+
+			// note: size == 16 for the ECMA "key" which is replaced
+			// by the runtime with a 1024 bits key (128 bytes)
 
 			return 128; // default strongname signature size
 		}
diff --git a/external/cecil/Mono.Cecil.nuspec b/external/cecil/Mono.Cecil.nuspec
index 021e794..9901dfc 100644
--- a/external/cecil/Mono.Cecil.nuspec
+++ b/external/cecil/Mono.Cecil.nuspec
@@ -2,7 +2,7 @@
 <package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <id>Mono.Cecil</id>
-    <version>0.9.5.2</version>
+    <version>0.9.5.4</version>
     <title>Mono.Cecil</title>
     <authors>Jb Evain</authors>
     <owners>Jb Evain</owners>
diff --git a/external/cecil/Mono.Cecil.sln.DotSettings b/external/cecil/Mono.Cecil.sln.DotSettings
new file mode 100755
index 0000000..6d06ad7
--- /dev/null
+++ b/external/cecil/Mono.Cecil.sln.DotSettings
@@ -0,0 +1,35 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=CheckNamespace/@EntryIndexedValue">DO_NOT_SHOW</s:String>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES/@EntryValue">True</s:Boolean>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Locals/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=LocalConstants/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
+	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/TYPE_DECLARATION_BRACES/@EntryValue">END_OF_LINE</s:String>
+	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue">END_OF_LINE</s:String>
+	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/CASE_BLOCK_BRACES/@EntryValue">END_OF_LINE</s:String>
+	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INITIALIZER_BRACES/@EntryValue">END_OF_LINE</s:String>
+	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/OTHER_BRACES/@EntryValue">END_OF_LINE</s:String>
+	<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue">1</s:Int64>
+	<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_CODE/@EntryValue">1</s:Int64>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_ELSE_ON_NEW_LINE/@EntryValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_CATCH_ON_NEW_LINE/@EntryValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FINALLY_ON_NEW_LINE/@EntryValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_LINES/@EntryValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_METHOD_CALL_PARENTHESES/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_EMPTY_METHOD_CALL_PARENTHESES/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_ARRAY_ACCESS_BRACKETS/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_METHOD_PARENTHESES/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_BEFORE_EMPTY_METHOD_PARENTHESES/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AROUND_MULTIPLICATIVE_OP/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/ALIGN_MULTILINE_PARAMETER/@EntryValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/ALIGN_FIRST_ARG_BY_PAREN/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/LINE_FEED_AT_FILE_END/@EntryValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INDENT_EMBRACED_INITIALIZER_BLOCK/@EntryValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INDENT_ANONYMOUS_METHOD_BLOCK/@EntryValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INDENT_CASE_FROM_SWITCH/@EntryValue">False</s:Boolean>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
+	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
+	<s:Boolean x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=3888B4217219C6449A29410818F112E6/@KeyIndexDefined">True</s:Boolean>
+	<s:String x:Key="/Default/Environment/InjectedLayers/FileInjectedLayer/=3888B4217219C6449A29410818F112E6/AbsolutePath/@EntryValue">C:\sources\cecil\Mono.Cecil.sln.DotSettings</s:String>
+	<s:Boolean x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=File3888B4217219C6449A29410818F112E6/@KeyIndexDefined">True</s:Boolean>
+	<s:Double x:Key="/Default/Environment/InjectedLayers/InjectedLayerCustomization/=File3888B4217219C6449A29410818F112E6/RelativePriority/@EntryValue">1</s:Double>
+	<s:String x:Key="/Default/Environment/UserInterface/ShortcutSchemeName/@EntryValue">None</s:String></wpf:ResourceDictionary>
\ No newline at end of file
diff --git a/external/cecil/Mono.Cecil/AssemblyNameReference.cs b/external/cecil/Mono.Cecil/AssemblyNameReference.cs
index 3da9780..4f58fe2 100644
--- a/external/cecil/Mono.Cecil/AssemblyNameReference.cs
+++ b/external/cecil/Mono.Cecil/AssemblyNameReference.cs
@@ -98,7 +98,7 @@ namespace Mono.Cecil {
 		}
 
 		public byte [] PublicKey {
-			get { return public_key; }
+			get { return public_key ?? Empty<byte>.Array; }
 			set {
 				public_key = value;
 				HasPublicKey = !public_key.IsNullOrEmpty ();
@@ -116,7 +116,7 @@ namespace Mono.Cecil {
 					Array.Copy (hash, (hash.Length - 8), public_key_token, 0, 8);
 					Array.Reverse (public_key_token, 0, 8);
 				}
-				return public_key_token;
+				return public_key_token ?? Empty<byte>.Array;
 			}
 			set {
 				public_key_token = value;
@@ -175,9 +175,10 @@ namespace Mono.Cecil {
 				builder.Append (sep);
 				builder.Append ("PublicKeyToken=");
 
-				if (this.PublicKeyToken != null && public_key_token.Length > 0) {
-					for (int i = 0 ; i < public_key_token.Length ; i++) {
-						builder.Append (public_key_token [i].ToString ("x2"));
+				var pk_token = PublicKeyToken;
+				if (!pk_token.IsNullOrEmpty () && pk_token.Length > 0) {
+					for (int i = 0 ; i < pk_token.Length ; i++) {
+						builder.Append (pk_token [i].ToString ("x2"));
 					}
 				} else
 					builder.Append ("null");
diff --git a/external/cecil/Mono.Cecil/AssemblyReader.cs b/external/cecil/Mono.Cecil/AssemblyReader.cs
index 9aa5b13..a9f0b6a 100644
--- a/external/cecil/Mono.Cecil/AssemblyReader.cs
+++ b/external/cecil/Mono.Cecil/AssemblyReader.cs
@@ -552,6 +552,7 @@ namespace Mono.Cecil {
 				var parameters = new ReaderParameters {
 					ReadingMode = module.ReadingMode,
 					SymbolReaderProvider = module.SymbolReaderProvider,
+					AssemblyResolver = module.AssemblyResolver
 				};
 
 				modules.Add (ModuleDefinition.ReadModule (
@@ -778,8 +779,12 @@ namespace Mono.Cecil {
 
 			var nested_types = new MemberDefinitionCollection<TypeDefinition> (type, mapping.Length);
 
-			for (int i = 0; i < mapping.Length; i++)
-				nested_types.Add (GetTypeDefinition (mapping [i]));
+			for (int i = 0; i < mapping.Length; i++) {
+				var nested_type = GetTypeDefinition (mapping [i]);
+
+				if (nested_type != null)
+					nested_types.Add (nested_type);
+			}
 
 			metadata.RemoveNestedTypeMapping (type);
 
@@ -1783,25 +1788,35 @@ namespace Mono.Cecil {
 		{
 			InitializeGenericParameters ();
 
-			Range range;
-			if (!metadata.TryGetGenericParameterRange (provider, out range))
+			Range [] ranges;
+			if (!metadata.TryGetGenericParameterRanges (provider, out ranges))
 				return false;
 
-			return range.Length > 0;
+			return RangesSize (ranges) > 0;
 		}
 
 		public Collection<GenericParameter> ReadGenericParameters (IGenericParameterProvider provider)
 		{
 			InitializeGenericParameters ();
 
-			Range range;
-			if (!metadata.TryGetGenericParameterRange (provider, out range)
-				|| !MoveTo (Table.GenericParam, range.Start))
+			Range [] ranges;
+			if (!metadata.TryGetGenericParameterRanges (provider, out ranges))
 				return new GenericParameterCollection (provider);
 
 			metadata.RemoveGenericParameterRange (provider);
 
-			var generic_parameters = new GenericParameterCollection (provider, (int) range.Length);
+			var generic_parameters = new GenericParameterCollection (provider, RangesSize (ranges));
+
+			for (int i = 0; i < ranges.Length; i++)
+				ReadGenericParametersRange (ranges [i], provider, generic_parameters);
+
+			return generic_parameters;
+		}
+
+		void ReadGenericParametersRange (Range range, IGenericParameterProvider provider, GenericParameterCollection generic_parameters)
+		{
+			if (!MoveTo (Table.GenericParam, range.Start))
+				return;
 
 			for (uint i = 0; i < range.Length; i++) {
 				ReadUInt16 (); // index
@@ -1815,8 +1830,6 @@ namespace Mono.Cecil {
 
 				generic_parameters.Add (parameter);
 			}
-
-			return generic_parameters;
 		}
 
 		void InitializeGenericParameters ()
@@ -1833,10 +1846,10 @@ namespace Mono.Cecil {
 			});
 		}
 
-		Dictionary<MetadataToken, Range> InitializeRanges (Table table, Func<MetadataToken> get_next)
+		Dictionary<MetadataToken, Range []> InitializeRanges (Table table, Func<MetadataToken> get_next)
 		{
 			int length = MoveTo (table);
-			var ranges = new Dictionary<MetadataToken, Range> (length);
+			var ranges = new Dictionary<MetadataToken, Range []> (length);
 
 			if (length == 0)
 				return ranges;
@@ -1851,20 +1864,34 @@ namespace Mono.Cecil {
 					owner = next;
 					range.Length++;
 				} else if (next != owner) {
-					if (owner.RID != 0)
-						ranges.Add (owner, range);
+					AddRange (ranges, owner, range);
 					range = new Range (i, 1);
 					owner = next;
 				} else
 					range.Length++;
 			}
 
-			if (owner != MetadataToken.Zero && !ranges.ContainsKey (owner))
-				ranges.Add (owner, range);
+			AddRange (ranges, owner, range);
 
 			return ranges;
 		}
 
+		static void AddRange (Dictionary<MetadataToken, Range []> ranges, MetadataToken owner, Range range)
+		{
+			if (owner.RID == 0)
+				return;
+
+			Range [] slots;
+			if (!ranges.TryGetValue (owner, out slots)) {
+				ranges.Add (owner, new [] { range });
+				return;
+			}
+
+			slots = slots.Resize (slots.Length + 1);
+			slots [slots.Length - 1] = range;
+			ranges [owner] = slots;
+		}
+
 		public bool HasGenericConstraints (GenericParameter generic_parameter)
 		{
 			InitializeGenericConstraints ();
@@ -2328,23 +2355,35 @@ namespace Mono.Cecil {
 		{
 			InitializeCustomAttributes ();
 
-			Range range;
-			if (!metadata.TryGetCustomAttributeRange (owner, out range))
+			Range [] ranges;
+			if (!metadata.TryGetCustomAttributeRanges (owner, out ranges))
 				return false;
 
-			return range.Length > 0;
+			return RangesSize (ranges) > 0;
 		}
 
 		public Collection<CustomAttribute> ReadCustomAttributes (ICustomAttributeProvider owner)
 		{
 			InitializeCustomAttributes ();
 
-			Range range;
-			if (!metadata.TryGetCustomAttributeRange (owner, out range)
-				|| !MoveTo (Table.CustomAttribute, range.Start))
+			Range [] ranges;
+			if (!metadata.TryGetCustomAttributeRanges (owner, out ranges))
 				return new Collection<CustomAttribute> ();
 
-			var custom_attributes = new Collection<CustomAttribute> ((int) range.Length);
+			var custom_attributes = new Collection<CustomAttribute> (RangesSize (ranges));
+
+			for (int i = 0; i < ranges.Length; i++)
+				ReadCustomAttributeRange (ranges [i], custom_attributes);
+
+			metadata.RemoveCustomAttributeRange (owner);
+
+			return custom_attributes;
+		}
+
+		void ReadCustomAttributeRange (Range range, Collection<CustomAttribute> custom_attributes)
+		{
+			if (!MoveTo (Table.CustomAttribute, range.Start))
+				return;
 
 			for (int i = 0; i < range.Length; i++) {
 				ReadMetadataToken (CodedIndex.HasCustomAttribute);
@@ -2356,10 +2395,15 @@ namespace Mono.Cecil {
 
 				custom_attributes.Add (new CustomAttribute (signature, constructor));
 			}
+		}
 
-			metadata.RemoveCustomAttributeRange (owner);
+		static int RangesSize (Range [] ranges)
+		{
+			uint size = 0;
+			for (int i = 0; i < ranges.Length; i++)
+				size += ranges [i].Length;
 
-			return custom_attributes;
+			return (int) size;
 		}
 
 		public byte [] ReadCustomAttributeBlob (uint signature)
@@ -2451,23 +2495,35 @@ namespace Mono.Cecil {
 		{
 			InitializeSecurityDeclarations ();
 
-			Range range;
-			if (!metadata.TryGetSecurityDeclarationRange (owner, out range))
+			Range [] ranges;
+			if (!metadata.TryGetSecurityDeclarationRanges (owner, out ranges))
 				return false;
 
-			return range.Length > 0;
+			return RangesSize (ranges) > 0;
 		}
 
 		public Collection<SecurityDeclaration> ReadSecurityDeclarations (ISecurityDeclarationProvider owner)
 		{
 			InitializeSecurityDeclarations ();
 
-			Range range;
-			if (!metadata.TryGetSecurityDeclarationRange (owner, out range)
-				|| !MoveTo (Table.DeclSecurity, range.Start))
+			Range [] ranges;
+			if (!metadata.TryGetSecurityDeclarationRanges (owner, out ranges))
 				return new Collection<SecurityDeclaration> ();
 
-			var security_declarations = new Collection<SecurityDeclaration> ((int) range.Length);
+			var security_declarations = new Collection<SecurityDeclaration> (RangesSize (ranges));
+
+			for (int i = 0; i < ranges.Length; i++)
+				ReadSecurityDeclarationRange (ranges [i], security_declarations);
+
+			metadata.RemoveSecurityDeclarationRange (owner);
+
+			return security_declarations;
+		}
+
+		void ReadSecurityDeclarationRange (Range range, Collection<SecurityDeclaration> security_declarations)
+		{
+			if (!MoveTo (Table.DeclSecurity, range.Start))
+				return;
 
 			for (int i = 0; i < range.Length; i++) {
 				var action = (SecurityAction) ReadUInt16 ();
@@ -2476,10 +2532,6 @@ namespace Mono.Cecil {
 
 				security_declarations.Add (new SecurityDeclaration (action, signature, module));
 			}
-
-			metadata.RemoveSecurityDeclarationRange (owner);
-
-			return security_declarations;
 		}
 
 		public byte [] ReadSecurityDeclarationBlob (uint signature)
diff --git a/external/cecil/Mono.Cecil/AssemblyWriter.cs b/external/cecil/Mono.Cecil/AssemblyWriter.cs
index bffa439..0597bc0 100644
--- a/external/cecil/Mono.Cecil/AssemblyWriter.cs
+++ b/external/cecil/Mono.Cecil/AssemblyWriter.cs
@@ -82,7 +82,7 @@ namespace Mono.Cecil {
 		public static void WriteModuleTo (ModuleDefinition module, Stream stream, WriterParameters parameters)
 		{
 			if ((module.Attributes & ModuleAttributes.ILOnly) == 0)
-				throw new ArgumentException ();
+				throw new NotSupportedException ("Writing mixed-mode assemblies is not supported");
 
 			if (module.HasImage && module.ReadingMode == ReadingMode.Deferred)
 				ImmediateModuleReader.ReadModule (module);
diff --git a/external/cecil/Mono.Cecil/BaseAssemblyResolver.cs b/external/cecil/Mono.Cecil/BaseAssemblyResolver.cs
index 10ab2c3..90be7bf 100644
--- a/external/cecil/Mono.Cecil/BaseAssemblyResolver.cs
+++ b/external/cecil/Mono.Cecil/BaseAssemblyResolver.cs
@@ -150,6 +150,13 @@ namespace Mono.Cecil {
 				return assembly;
 
 #if !SILVERLIGHT && !CF
+			if (name.IsRetargetable) {
+				// if the reference is retargetable, zero it
+				name = new AssemblyNameReference (name.Name, new Version (0, 0, 0, 0)) {
+					PublicKeyToken = Empty<byte>.Array,
+				};
+			}
+
 			var framework_dir = Path.GetDirectoryName (typeof (object).Module.FullyQualifiedName);
 
 			if (IsZero (name.Version)) {
diff --git a/external/cecil/Mono.Cecil/EventDefinition.cs b/external/cecil/Mono.Cecil/EventDefinition.cs
index 565186c..89b5548 100644
--- a/external/cecil/Mono.Cecil/EventDefinition.cs
+++ b/external/cecil/Mono.Cecil/EventDefinition.cs
@@ -124,8 +124,8 @@ namespace Mono.Cecil {
 		}
 
 		public bool IsRuntimeSpecialName {
-			get { return attributes.GetAttributes ((ushort) FieldAttributes.RTSpecialName); }
-			set { attributes = attributes.SetAttributes ((ushort) FieldAttributes.RTSpecialName, value); }
+			get { return attributes.GetAttributes ((ushort) EventAttributes.RTSpecialName); }
+			set { attributes = attributes.SetAttributes ((ushort) EventAttributes.RTSpecialName, value); }
 		}
 
 		#endregion
diff --git a/external/cecil/Mono.Cecil/FunctionPointerType.cs b/external/cecil/Mono.Cecil/FunctionPointerType.cs
index db80f76..756d31f 100644
--- a/external/cecil/Mono.Cecil/FunctionPointerType.cs
+++ b/external/cecil/Mono.Cecil/FunctionPointerType.cs
@@ -85,6 +85,7 @@ namespace Mono.Cecil {
 
 		public override IMetadataScope Scope {
 			get { return function.ReturnType.Scope; }
+			set { throw new InvalidOperationException (); }
 		}
 
 		public override bool IsFunctionPointer {
diff --git a/external/cecil/Mono.Cecil/GenericParameter.cs b/external/cecil/Mono.Cecil/GenericParameter.cs
index d694e29..d66cc91 100644
--- a/external/cecil/Mono.Cecil/GenericParameter.cs
+++ b/external/cecil/Mono.Cecil/GenericParameter.cs
@@ -107,6 +107,16 @@ namespace Mono.Cecil {
 					? ((MethodReference) owner).DeclaringType.Scope
 					: ((TypeReference) owner).Scope;
 			}
+			set { throw new InvalidOperationException (); }
+		}
+
+		public override TypeReference DeclaringType {
+			get { return owner as TypeReference; }
+			set { throw new InvalidOperationException (); }
+		}
+
+		public MethodReference DeclaringMethod {
+			get { return owner as MethodReference; }
 		}
 
 		public override ModuleDefinition Module {
diff --git a/external/cecil/Mono.Cecil/Import.cs b/external/cecil/Mono.Cecil/Import.cs
index 38d0120..a32eb3c 100644
--- a/external/cecil/Mono.Cecil/Import.cs
+++ b/external/cecil/Mono.Cecil/Import.cs
@@ -28,6 +28,7 @@
 
 using System;
 using System.Collections.Generic;
+using Mono.Collections.Generic;
 using SR = System.Reflection;
 
 using Mono.Cecil.Metadata;
@@ -39,6 +40,76 @@ namespace Mono.Cecil {
 		Open,
 	}
 
+	struct ImportGenericContext {
+
+		Collection<IGenericParameterProvider> stack;
+
+		public bool IsEmpty { get { return stack == null; } }
+
+		public ImportGenericContext (IGenericParameterProvider provider)
+		{
+			stack = null;
+
+			Push (provider);
+		}
+
+		public void Push (IGenericParameterProvider provider)
+		{
+			if (stack == null)
+				stack = new Collection<IGenericParameterProvider> (1) { provider };
+			else
+				stack.Add (provider);
+		}
+
+		public void Pop ()
+		{
+			stack.RemoveAt (stack.Count - 1);
+		}
+
+		public TypeReference MethodParameter (string method, int position)
+		{
+			for (int i = stack.Count - 1; i >= 0; i--) {
+				var candidate = stack [i] as MethodReference;
+				if (candidate == null)
+					continue;
+
+				if (method != candidate.Name)
+					continue;
+
+				return candidate.GenericParameters [position];
+			}
+
+			throw new InvalidOperationException ();
+		}
+
+		public TypeReference TypeParameter (string type, int position)
+		{
+			for (int i = stack.Count - 1; i >= 0; i--) {
+				var candidate = GenericTypeFor (stack [i]);
+
+				if (candidate.FullName != type)
+					continue;
+
+				return candidate.GenericParameters [position];
+			}
+
+			throw new InvalidOperationException ();
+		}
+
+		static TypeReference GenericTypeFor (IGenericParameterProvider context)
+		{
+			var type = context as TypeReference;
+			if (type != null)
+				return type.GetElementType ();
+
+			var method = context as MethodReference;
+			if (method != null)
+				return method.DeclaringType.GetElementType ();
+
+			throw new InvalidOperationException ();
+		}
+	}
+
 	class MetadataImporter {
 
 		readonly ModuleDefinition module;
@@ -70,12 +141,12 @@ namespace Mono.Cecil {
 			{ typeof (object), ElementType.Object },
 		};
 
-		public TypeReference ImportType (Type type, IGenericContext context)
+		public TypeReference ImportType (Type type, ImportGenericContext context)
 		{
 			return ImportType (type, context, ImportGenericKind.Open);
 		}
 
-		public TypeReference ImportType (Type type, IGenericContext context, ImportGenericKind import_kind)
+		public TypeReference ImportType (Type type, ImportGenericContext context, ImportGenericKind import_kind)
 		{
 			if (IsTypeSpecification (type) || ImportOpenGenericType (type, import_kind))
 				return ImportTypeSpecification (type, context);
@@ -119,7 +190,7 @@ namespace Mono.Cecil {
 #endif
 		}
 
-		TypeReference ImportTypeSpecification (Type type, IGenericContext context)
+		TypeReference ImportTypeSpecification (Type type, ImportGenericContext context)
 		{
 			if (type.IsByRef)
 				return new ByReferenceType (ImportType (type.GetElementType (), context));
@@ -139,32 +210,44 @@ namespace Mono.Cecil {
 			throw new NotSupportedException (type.FullName);
 		}
 
-		static TypeReference ImportGenericParameter (Type type, IGenericContext context)
+		static TypeReference ImportGenericParameter (Type type, ImportGenericContext context)
 		{
-			if (context == null)
+			if (context.IsEmpty)
 				throw new InvalidOperationException ();
 
-			var owner = type.DeclaringMethod != null
-				? context.Method
-				: context.Type;
+			if (type.DeclaringMethod != null)
+				return context.MethodParameter (type.DeclaringMethod.Name, type.GenericParameterPosition);
 
-			if (owner == null)
-				throw new InvalidOperationException ();
+			if (type.DeclaringType != null)
+				return  context.TypeParameter (NormalizedFullName (type.DeclaringType), type.GenericParameterPosition);
+
+			throw new InvalidOperationException();
+		}
+
+		private static string NormalizedFullName (Type type)
+		{
+			if (IsNestedType (type))
+				return NormalizedFullName (type.DeclaringType) + "/" + type.Name;
 
-			return owner.GenericParameters [type.GenericParameterPosition];
+			return type.FullName;
 		}
 
-		TypeReference ImportGenericInstance (Type type, IGenericContext context)
+		TypeReference ImportGenericInstance (Type type, ImportGenericContext context)
 		{
 			var element_type = ImportType (type.GetGenericTypeDefinition (), context, ImportGenericKind.Definition);
 			var instance = new GenericInstanceType (element_type);
 			var arguments = type.GetGenericArguments ();
 			var instance_arguments = instance.GenericArguments;
 
-			for (int i = 0; i < arguments.Length; i++)
-				instance_arguments.Add (ImportType (arguments [i], context ?? element_type));
+			context.Push (element_type);
+			try {
+				for (int i = 0; i < arguments.Length; i++)
+					instance_arguments.Add (ImportType (arguments [i], context));
 
-			return instance;
+				return instance;
+			} finally {
+				context.Pop ();
+			}
 		}
 
 		static bool IsTypeSpecification (Type type)
@@ -237,18 +320,23 @@ namespace Mono.Cecil {
 		}
 #endif
 
-		public FieldReference ImportField (SR.FieldInfo field, IGenericContext context)
+		public FieldReference ImportField (SR.FieldInfo field, ImportGenericContext context)
 		{
 			var declaring_type = ImportType (field.DeclaringType, context);
 
 			if (IsGenericInstance (field.DeclaringType))
 				field = ResolveFieldDefinition (field);
 
-			return new FieldReference {
-				Name = field.Name,
-				DeclaringType = declaring_type,
-				FieldType = ImportType (field.FieldType, context ?? declaring_type),
-			};
+			context.Push (declaring_type);
+			try {
+				return new FieldReference {
+					Name = field.Name,
+					DeclaringType = declaring_type,
+					FieldType = ImportType (field.FieldType, context),
+				};
+			} finally {
+				context.Pop ();
+			}
 		}
 
 		static SR.FieldInfo ResolveFieldDefinition (SR.FieldInfo field)
@@ -263,7 +351,7 @@ namespace Mono.Cecil {
 #endif
 		}
 
-		public MethodReference ImportMethod (SR.MethodBase method, IGenericContext context, ImportGenericKind import_kind)
+		public MethodReference ImportMethod (SR.MethodBase method, ImportGenericContext context, ImportGenericKind import_kind)
 		{
 			if (IsMethodSpecification (method) || ImportOpenGenericMethod (method, import_kind))
 				return ImportMethodSpecification (method, context);
@@ -286,21 +374,26 @@ namespace Mono.Cecil {
 			if (method.IsGenericMethod)
 				ImportGenericParameters (reference, method.GetGenericArguments ());
 
-			var method_info = method as SR.MethodInfo;
-			reference.ReturnType = method_info != null
-				? ImportType (method_info.ReturnType, context ?? reference)
-				: ImportType (typeof (void), null);
+			context.Push (reference);
+			try {
+				var method_info = method as SR.MethodInfo;
+				reference.ReturnType = method_info != null
+					? ImportType (method_info.ReturnType, context)
+					: ImportType (typeof (void), default (ImportGenericContext));
 
-			var parameters = method.GetParameters ();
-			var reference_parameters = reference.Parameters;
+				var parameters = method.GetParameters ();
+				var reference_parameters = reference.Parameters;
 
-			for (int i = 0; i < parameters.Length; i++)
-				reference_parameters.Add (
-					new ParameterDefinition (ImportType (parameters [i].ParameterType, context ?? reference)));
+				for (int i = 0; i < parameters.Length; i++)
+					reference_parameters.Add (
+						new ParameterDefinition (ImportType (parameters [i].ParameterType, context)));
 
-			reference.DeclaringType = declaring_type;
+				reference.DeclaringType = declaring_type;
 
-			return reference;
+				return reference;
+			} finally {
+				context.Pop ();
+			}
 		}
 
 		static void ImportGenericParameters (IGenericParameterProvider provider, Type [] arguments)
@@ -316,7 +409,7 @@ namespace Mono.Cecil {
 			return method.IsGenericMethod && !method.IsGenericMethodDefinition;
 		}
 
-		MethodReference ImportMethodSpecification (SR.MethodBase method, IGenericContext context)
+		MethodReference ImportMethodSpecification (SR.MethodBase method, ImportGenericContext context)
 		{
 			var method_info = method as SR.MethodInfo;
 			if (method_info == null)
@@ -327,10 +420,15 @@ namespace Mono.Cecil {
 			var arguments = method.GetGenericArguments ();
 			var instance_arguments = instance.GenericArguments;
 
-			for (int i = 0; i < arguments.Length; i++)
-				instance_arguments.Add (ImportType (arguments [i], context ?? element_method));
+			context.Push (element_method);
+			try {
+				for (int i = 0; i < arguments.Length; i++)
+					instance_arguments.Add (ImportType (arguments [i], context));
 
-			return instance;
+				return instance;
+			} finally {
+				context.Pop ();
+			}
 		}
 
 		static bool HasCallingConvention (SR.MethodBase method, SR.CallingConventions conventions)
@@ -339,7 +437,7 @@ namespace Mono.Cecil {
 		}
 #endif
 
-		public TypeReference ImportType (TypeReference type, IGenericContext context)
+		public TypeReference ImportType (TypeReference type, ImportGenericContext context)
 		{
 			if (type.IsTypeSpecification ())
 				return ImportTypeSpecification (type, context);
@@ -427,7 +525,7 @@ namespace Mono.Cecil {
 				imported_parameters.Add (new GenericParameter (parameters [i].Name, imported));
 		}
 
-		TypeReference ImportTypeSpecification (TypeReference type, IGenericContext context)
+		TypeReference ImportTypeSpecification (TypeReference type, ImportGenericContext context)
 		{
 			switch (type.etype) {
 			case ElementType.SzArray:
@@ -486,32 +584,33 @@ namespace Mono.Cecil {
 
 				return imported_instance;
 			case ElementType.Var:
-				if (context == null || context.Type == null)
-					throw new InvalidOperationException ();
-
-				return ((TypeReference) context.Type).GetElementType ().GenericParameters [((GenericParameter) type).Position];
+				var var_parameter = (GenericParameter) type;
+				return context.TypeParameter (type.DeclaringType.FullName, var_parameter.Position);
 			case ElementType.MVar:
-				if (context == null || context.Method == null)
-					throw new InvalidOperationException ();
-
-				return context.Method.GenericParameters [((GenericParameter) type).Position];
+				var mvar_parameter = (GenericParameter) type;
+				return context.MethodParameter (mvar_parameter.DeclaringMethod.Name, mvar_parameter.Position);
 			}
 
 			throw new NotSupportedException (type.etype.ToString ());
 		}
 
-		public FieldReference ImportField (FieldReference field, IGenericContext context)
+		public FieldReference ImportField (FieldReference field, ImportGenericContext context)
 		{
 			var declaring_type = ImportType (field.DeclaringType, context);
 
-			return new FieldReference {
-				Name = field.Name,
-				DeclaringType = declaring_type,
-				FieldType = ImportType (field.FieldType, context ?? declaring_type),
-			};
+			context.Push (declaring_type);
+			try {
+				return new FieldReference {
+					Name = field.Name,
+					DeclaringType = declaring_type,
+					FieldType = ImportType (field.FieldType, context),
+				};
+			} finally {
+				context.Pop ();
+			}
 		}
 
-		public MethodReference ImportMethod (MethodReference method, IGenericContext context)
+		public MethodReference ImportMethod (MethodReference method, ImportGenericContext context)
 		{
 			if (method.IsGenericInstance)
 				return ImportMethodSpecification (method, context);
@@ -523,29 +622,33 @@ namespace Mono.Cecil {
 				HasThis = method.HasThis,
 				ExplicitThis = method.ExplicitThis,
 				DeclaringType = declaring_type,
+				CallingConvention = method.CallingConvention,
 			};
 
-			reference.CallingConvention = method.CallingConvention;
-
 			if (method.HasGenericParameters)
 				ImportGenericParameters (reference, method);
 
-			reference.ReturnType = ImportType (method.ReturnType, context ?? reference);
+			context.Push (reference);
+			try {
+				reference.ReturnType = ImportType (method.ReturnType, context);
 
-			if (!method.HasParameters)
-				return reference;
+				if (!method.HasParameters)
+					return reference;
 
-			var reference_parameters = reference.Parameters;
+				var reference_parameters = reference.Parameters;
 
-			var parameters = method.Parameters;
-			for (int i = 0; i < parameters.Count; i++)
-				reference_parameters.Add (
-					new ParameterDefinition (ImportType (parameters [i].ParameterType, context ?? reference)));
+				var parameters = method.Parameters;
+				for (int i = 0; i < parameters.Count; i++)
+					reference_parameters.Add (
+						new ParameterDefinition (ImportType (parameters [i].ParameterType, context)));
 
-			return reference;
+				return reference;
+			} finally {
+				context.Pop();
+			}
 		}
 
-		MethodSpecification ImportMethodSpecification (MethodReference method, IGenericContext context)
+		MethodSpecification ImportMethodSpecification (MethodReference method, ImportGenericContext context)
 		{
 			if (!method.IsGenericInstance)
 				throw new NotSupportedException ();
diff --git a/external/cecil/Mono.Cecil/MetadataResolver.cs b/external/cecil/Mono.Cecil/MetadataResolver.cs
index e69fcd7..5543377 100644
--- a/external/cecil/Mono.Cecil/MetadataResolver.cs
+++ b/external/cecil/Mono.Cecil/MetadataResolver.cs
@@ -57,9 +57,26 @@ namespace Mono.Cecil {
 			get { return member; }
 		}
 
+		public IMetadataScope Scope {
+			get {
+				var type = member as TypeReference;
+				if (type != null)
+					return type.Scope;
+
+				var declaring_type = member.DeclaringType;
+				if (declaring_type != null)
+					return declaring_type.Scope;
+
+				throw new NotSupportedException ();
+			}
+		}
+
 		public ResolutionException (MemberReference member)
 			: base ("Failed to resolve " + member.FullName)
 		{
+			if (member == null)
+				throw new ArgumentNullException ("member");
+
 			this.member = member;
 		}
 
diff --git a/external/cecil/Mono.Cecil/MetadataSystem.cs b/external/cecil/Mono.Cecil/MetadataSystem.cs
index 693202b..3ae2015 100644
--- a/external/cecil/Mono.Cecil/MetadataSystem.cs
+++ b/external/cecil/Mono.Cecil/MetadataSystem.cs
@@ -65,13 +65,13 @@ namespace Mono.Cecil {
 		internal Dictionary<MetadataToken, uint> FieldMarshals;
 		internal Dictionary<MetadataToken, Row<ElementType, uint>> Constants;
 		internal Dictionary<uint, MetadataToken []> Overrides;
-		internal Dictionary<MetadataToken, Range> CustomAttributes;
-		internal Dictionary<MetadataToken, Range> SecurityDeclarations;
+		internal Dictionary<MetadataToken, Range []> CustomAttributes;
+		internal Dictionary<MetadataToken, Range []> SecurityDeclarations;
 		internal Dictionary<uint, Range> Events;
 		internal Dictionary<uint, Range> Properties;
 		internal Dictionary<uint, Row<MethodSemanticsAttributes, MetadataToken>> Semantics;
 		internal Dictionary<uint, Row<PInvokeAttributes, uint, uint>> PInvokes;
-		internal Dictionary<MetadataToken, Range> GenericParameters;
+		internal Dictionary<MetadataToken, Range []> GenericParameters;
 		internal Dictionary<uint, MetadataToken []> GenericConstraints;
 
 		static Dictionary<string, Row<ElementType, bool>> primitive_value_types;
@@ -106,7 +106,7 @@ namespace Mono.Cecil {
 				return;
 
 			var scope = type.scope;
-			if (scope == null || scope.MetadataScopeType != MetadataScopeType.AssemblyNameReference || scope.Name != "mscorlib")
+			if (scope == null || scope.MetadataScopeType != MetadataScopeType.AssemblyNameReference)
 				return;
 
 			Row<ElementType, bool> primitive_data;
@@ -124,9 +124,6 @@ namespace Mono.Cecil {
 			if (type.Namespace != "System")
 				return false;
 
-			if (!type.HasImage || !type.Module.IsCorlib ())
-				return false;
-
 			Row<ElementType, bool> primitive_data;
 			if (TryGetPrimitiveData (type, out primitive_data) && primitive_data.Col1.IsPrimitive ()) {
 				etype = primitive_data.Col1;
@@ -305,9 +302,9 @@ namespace Mono.Cecil {
 			Events.Remove (type.token.RID);
 		}
 
-		public bool TryGetGenericParameterRange (IGenericParameterProvider owner, out Range range)
+		public bool TryGetGenericParameterRanges (IGenericParameterProvider owner, out Range [] ranges)
 		{
-			return GenericParameters.TryGetValue (owner.MetadataToken, out range);
+			return GenericParameters.TryGetValue (owner.MetadataToken, out ranges);
 		}
 
 		public void RemoveGenericParameterRange (IGenericParameterProvider owner)
@@ -315,9 +312,9 @@ namespace Mono.Cecil {
 			GenericParameters.Remove (owner.MetadataToken);
 		}
 
-		public bool TryGetCustomAttributeRange (ICustomAttributeProvider owner, out Range range)
+		public bool TryGetCustomAttributeRanges (ICustomAttributeProvider owner, out Range [] ranges)
 		{
-			return CustomAttributes.TryGetValue (owner.MetadataToken, out range);
+			return CustomAttributes.TryGetValue (owner.MetadataToken, out ranges);
 		}
 
 		public void RemoveCustomAttributeRange (ICustomAttributeProvider owner)
@@ -325,9 +322,9 @@ namespace Mono.Cecil {
 			CustomAttributes.Remove (owner.MetadataToken);
 		}
 
-		public bool TryGetSecurityDeclarationRange (ISecurityDeclarationProvider owner, out Range range)
+		public bool TryGetSecurityDeclarationRanges (ISecurityDeclarationProvider owner, out Range [] ranges)
 		{
-			return SecurityDeclarations.TryGetValue (owner.MetadataToken, out range);
+			return SecurityDeclarations.TryGetValue (owner.MetadataToken, out ranges);
 		}
 
 		public void RemoveSecurityDeclarationRange (ISecurityDeclarationProvider owner)
diff --git a/external/cecil/Mono.Cecil/ModuleDefinition.cs b/external/cecil/Mono.Cecil/ModuleDefinition.cs
index 66ac027..7f75cbd 100644
--- a/external/cecil/Mono.Cecil/ModuleDefinition.cs
+++ b/external/cecil/Mono.Cecil/ModuleDefinition.cs
@@ -208,6 +208,7 @@ namespace Mono.Cecil {
 		TargetRuntime runtime;
 		TargetArchitecture architecture;
 		ModuleAttributes attributes;
+		ModuleCharacteristics characteristics;
 		Guid mvid;
 
 		internal AssemblyDefinition assembly;
@@ -247,6 +248,11 @@ namespace Mono.Cecil {
 			set { attributes = value; }
 		}
 
+		public ModuleCharacteristics Characteristics {
+			get { return characteristics; }
+			set { characteristics = value; }
+		}
+
 		public string FullyQualifiedName {
 			get { return fq_name; }
 		}
@@ -442,6 +448,7 @@ namespace Mono.Cecil {
 			this.runtime = image.Runtime;
 			this.architecture = image.Architecture;
 			this.attributes = image.Attributes;
+			this.characteristics = image.Characteristics;
 			this.fq_name = image.FileName;
 
 			this.reader = new MetadataReader (this);
@@ -616,89 +623,57 @@ namespace Mono.Cecil {
 				throw new ArgumentException ();
 		}
 
-#if !CF
-		public TypeReference Import (Type type)
+		static ImportGenericContext GenericContextFor (IGenericParameterProvider context)
 		{
-			CheckType (type);
-
-			return MetadataImporter.ImportType (type, null, ImportGenericKind.Definition);
+			return context != null ? new ImportGenericContext (context) : default (ImportGenericContext);
 		}
 
-		public TypeReference Import (Type type, TypeReference context)
-		{
-			return Import (type, (IGenericParameterProvider) context);
-		}
+#if !CF
 
-		public TypeReference Import (Type type, MethodReference context)
+		public TypeReference Import (Type type)
 		{
-			return Import (type, (IGenericParameterProvider) context);
+			return Import (type, null);
 		}
 
-		TypeReference Import (Type type, IGenericParameterProvider context)
+		public TypeReference Import (Type type, IGenericParameterProvider context)
 		{
 			CheckType (type);
 			CheckContext (context, this);
 
 			return MetadataImporter.ImportType (
 				type,
-				(IGenericContext) context,
-				context != null
-					? ImportGenericKind.Open
-					: ImportGenericKind.Definition);
+				GenericContextFor (context),
+				context != null ? ImportGenericKind.Open : ImportGenericKind.Definition);
 		}
 
 		public FieldReference Import (SR.FieldInfo field)
 		{
-			CheckField (field);
-
-			return MetadataImporter.ImportField (field, null);
-		}
-
-		public FieldReference Import (SR.FieldInfo field, TypeReference context)
-		{
-			return Import (field, (IGenericParameterProvider) context);
-		}
-
-		public FieldReference Import (SR.FieldInfo field, MethodReference context)
-		{
-			return Import (field, (IGenericParameterProvider) context);
+			return Import (field, null);
 		}
 
-		FieldReference Import (SR.FieldInfo field, IGenericParameterProvider context)
+		public FieldReference Import (SR.FieldInfo field, IGenericParameterProvider context)
 		{
 			CheckField (field);
 			CheckContext (context, this);
 
-			return MetadataImporter.ImportField (field, (IGenericContext) context);
+			return MetadataImporter.ImportField (field, GenericContextFor (context));
 		}
 
 		public MethodReference Import (SR.MethodBase method)
 		{
 			CheckMethod (method);
 
-			return MetadataImporter.ImportMethod (method, null, ImportGenericKind.Definition);
-		}
-
-		public MethodReference Import (SR.MethodBase method, TypeReference context)
-		{
-			return Import (method, (IGenericParameterProvider) context);
-		}
-
-		public MethodReference Import (SR.MethodBase method, MethodReference context)
-		{
-			return Import (method, (IGenericParameterProvider) context);
+			return MetadataImporter.ImportMethod (method, default (ImportGenericContext), ImportGenericKind.Definition);
 		}
 
-		MethodReference Import (SR.MethodBase method, IGenericParameterProvider context)
+		public MethodReference Import (SR.MethodBase method, IGenericParameterProvider context)
 		{
 			CheckMethod (method);
 			CheckContext (context, this);
 
 			return MetadataImporter.ImportMethod (method,
-				(IGenericContext) context,
-				context != null
-					? ImportGenericKind.Open
-					: ImportGenericKind.Definition);
+				GenericContextFor (context),
+				context != null ? ImportGenericKind.Open : ImportGenericKind.Definition);
 		}
 #endif
 
@@ -709,20 +684,10 @@ namespace Mono.Cecil {
 			if (type.Module == this)
 				return type;
 
-			return MetadataImporter.ImportType (type, null);
+			return MetadataImporter.ImportType (type, default (ImportGenericContext));
 		}
 
-		public TypeReference Import (TypeReference type, TypeReference context)
-		{
-			return Import (type, (IGenericParameterProvider) context);
-		}
-
-		public TypeReference Import (TypeReference type, MethodReference context)
-		{
-			return Import (type, (IGenericParameterProvider) context);
-		}
-
-		TypeReference Import (TypeReference type, IGenericParameterProvider context)
+		public TypeReference Import (TypeReference type, IGenericParameterProvider context)
 		{
 			CheckType (type);
 
@@ -731,7 +696,7 @@ namespace Mono.Cecil {
 
 			CheckContext (context, this);
 
-			return MetadataImporter.ImportType (type, (IGenericContext) context);
+			return MetadataImporter.ImportType (type, GenericContextFor (context));
 		}
 
 		public FieldReference Import (FieldReference field)
@@ -741,20 +706,10 @@ namespace Mono.Cecil {
 			if (field.Module == this)
 				return field;
 
-			return MetadataImporter.ImportField (field, null);
-		}
-
-		public FieldReference Import (FieldReference field, TypeReference context)
-		{
-			return Import (field, (IGenericParameterProvider) context);
-		}
-
-		public FieldReference Import (FieldReference field, MethodReference context)
-		{
-			return Import (field, (IGenericParameterProvider) context);
+			return MetadataImporter.ImportField (field, default (ImportGenericContext));
 		}
 
-		FieldReference Import (FieldReference field, IGenericParameterProvider context)
+		public FieldReference Import (FieldReference field, IGenericParameterProvider context)
 		{
 			CheckField (field);
 
@@ -763,30 +718,15 @@ namespace Mono.Cecil {
 
 			CheckContext (context, this);
 
-			return MetadataImporter.ImportField (field, (IGenericContext) context);
+			return MetadataImporter.ImportField (field, GenericContextFor (context));
 		}
 
 		public MethodReference Import (MethodReference method)
 		{
-			CheckMethod (method);
-
-			if (method.Module == this)
-				return method;
-
-			return MetadataImporter.ImportMethod (method, null);
-		}
-
-		public MethodReference Import (MethodReference method, TypeReference context)
-		{
-			return Import (method, (IGenericParameterProvider) context);
-		}
-
-		public MethodReference Import (MethodReference method, MethodReference context)
-		{
-			return Import (method, (IGenericParameterProvider) context);
+			return Import (method, null);
 		}
 
-		MethodReference Import (MethodReference method, IGenericParameterProvider context)
+		public MethodReference Import (MethodReference method, IGenericParameterProvider context)
 		{
 			CheckMethod (method);
 
@@ -795,7 +735,7 @@ namespace Mono.Cecil {
 
 			CheckContext (context, this);
 
-			return MetadataImporter.ImportMethod (method, (IGenericContext) context);
+			return MetadataImporter.ImportMethod (method, GenericContextFor (context));
 		}
 
 #endif
@@ -866,6 +806,7 @@ namespace Mono.Cecil {
 				architecture = parameters.Architecture,
 				mvid = Guid.NewGuid (),
 				Attributes = ModuleAttributes.ILOnly,
+				Characteristics = (ModuleCharacteristics) 0x8540,
 			};
 
 			if (parameters.AssemblyResolver != null)
diff --git a/external/cecil/Mono.Cecil/ModuleKind.cs b/external/cecil/Mono.Cecil/ModuleKind.cs
index bbbad72..c29da88 100644
--- a/external/cecil/Mono.Cecil/ModuleKind.cs
+++ b/external/cecil/Mono.Cecil/ModuleKind.cs
@@ -51,4 +51,14 @@ namespace Mono.Cecil {
 		StrongNameSigned = 8,
 		Preferred32Bit = 0x00020000,
 	}
+
+	[Flags]
+	public enum ModuleCharacteristics {
+		HighEntropyVA = 0x0020,
+		DynamicBase = 0x0040,
+		NoSEH = 0x0400,
+		NXCompat = 0x0100,
+		AppContainer = 0x1000,
+		TerminalServerAware = 0x8000,
+	}
 }
diff --git a/external/cecil/Mono.Cecil/TypeParser.cs b/external/cecil/Mono.Cecil/TypeParser.cs
index 06dc935..90e04a6 100644
--- a/external/cecil/Mono.Cecil/TypeParser.cs
+++ b/external/cecil/Mono.Cecil/TypeParser.cs
@@ -173,13 +173,7 @@ namespace Mono.Cecil {
 				return;
 			}
 
-#if !CF
-			Array.Resize (ref array, array.Length + 1);
-#else
-			var copy = new T [array.Length + 1];
-			Array.Copy (array, copy, array.Length);
-			array = copy;
-#endif
+			array = array.Resize (array.Length + 1);
 			array [array.Length - 1] = item;
 		}
 
@@ -272,7 +266,7 @@ namespace Mono.Cecil {
 
 		public static TypeReference ParseType (ModuleDefinition module, string fullname)
 		{
-			if (fullname == null)
+			if (string.IsNullOrEmpty (fullname))
 				return null;
 
 			var parser = new TypeParser (fullname);
diff --git a/external/cecil/Mono.Cecil/TypeReference.cs b/external/cecil/Mono.Cecil/TypeReference.cs
index ff28c63..f811b4f 100644
--- a/external/cecil/Mono.Cecil/TypeReference.cs
+++ b/external/cecil/Mono.Cecil/TypeReference.cs
@@ -147,6 +147,15 @@ namespace Mono.Cecil {
 
 				return scope;
 			}
+			set {
+				var declaring_type = this.DeclaringType;
+				if (declaring_type != null) {
+					declaring_type.Scope = value;
+					return;
+				}
+
+				scope = value;
+			}
 		}
 
 		public bool IsNested {
diff --git a/external/cecil/Mono.Cecil/TypeSpecification.cs b/external/cecil/Mono.Cecil/TypeSpecification.cs
index aa9b653..75651be 100644
--- a/external/cecil/Mono.Cecil/TypeSpecification.cs
+++ b/external/cecil/Mono.Cecil/TypeSpecification.cs
@@ -42,16 +42,17 @@ namespace Mono.Cecil {
 
 		public override string Name {
 			get { return element_type.Name; }
-			set { throw new NotSupportedException (); }
+			set { throw new InvalidOperationException (); }
 		}
 
 		public override string Namespace {
 			get { return element_type.Namespace; }
-			set { throw new NotSupportedException (); }
+			set { throw new InvalidOperationException (); }
 		}
 
 		public override IMetadataScope Scope {
 			get { return element_type.Scope; }
+			set { throw new InvalidOperationException (); }
 		}
 
 		public override ModuleDefinition Module {
diff --git a/external/cecil/Mono.Cecil/TypeSystem.cs b/external/cecil/Mono.Cecil/TypeSystem.cs
index 60ccae4..63f6aea 100644
--- a/external/cecil/Mono.Cecil/TypeSystem.cs
+++ b/external/cecil/Mono.Cecil/TypeSystem.cs
@@ -34,15 +34,24 @@ namespace Mono.Cecil {
 
 	public abstract class TypeSystem {
 
-		sealed class CorlibTypeSystem : TypeSystem {
+		sealed class CoreTypeSystem : TypeSystem {
 
-			public CorlibTypeSystem (ModuleDefinition module)
+			public CoreTypeSystem (ModuleDefinition module)
 				: base (module)
 			{
 			}
 
 			internal override TypeReference LookupType (string @namespace, string name)
 			{
+				var type = LookupTypeDefinition (@namespace, name) ?? LookupTypeForwarded (@namespace, name);
+				if (type != null)
+					return type;
+
+				throw new NotSupportedException ();
+			}
+
+			TypeReference LookupTypeDefinition (string @namespace, string name)
+			{
 				var metadata = module.MetadataSystem;
 				if (metadata.Types == null)
 					Initialize (module.Types);
@@ -64,6 +73,22 @@ namespace Mono.Cecil {
 				});
 			}
 
+			TypeReference LookupTypeForwarded (string @namespace, string name)
+			{
+				if (!module.HasExportedTypes)
+					return null;
+
+				var exported_types = module.ExportedTypes;
+				for (int i = 0; i < exported_types.Count; i++) {
+					var exported_type = exported_types [i];
+
+					if (exported_type.Name == name && exported_type.Namespace == @namespace)
+						return exported_type.CreateReference ();
+				}
+
+				return null;
+			}
+
 			static void Initialize (object obj)
 			{
 			}
@@ -159,7 +184,7 @@ namespace Mono.Cecil {
 		internal static TypeSystem CreateTypeSystem (ModuleDefinition module)
 		{
 			if (module.IsCorlib ())
-				return new CorlibTypeSystem (module);
+				return new CoreTypeSystem (module);
 
 			return new CommonTypeSystem (module);
 		}
diff --git a/external/cecil/Mono/Empty.cs b/external/cecil/Mono/Empty.cs
index d043a35..c9e5d7d 100644
--- a/external/cecil/Mono/Empty.cs
+++ b/external/cecil/Mono/Empty.cs
@@ -26,6 +26,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System;
 using Mono.Collections.Generic;
 
 namespace Mono {
@@ -49,5 +50,18 @@ namespace Mono.Cecil {
 		{
 			return self == null || self.size == 0;
 		}
+
+		public static T [] Resize<T> (this T [] self, int length)
+		{
+#if !CF
+			Array.Resize (ref self, length);
+#else
+			var copy = new T [length];
+			Array.Copy (self, copy, self.Length);
+			self = copy;
+#endif
+
+			return self;
+		}
 	}
 }
diff --git a/external/cecil/Test/Mono.Cecil.Tests.csproj b/external/cecil/Test/Mono.Cecil.Tests.csproj
index 2ff2951..eeebf78 100644
--- a/external/cecil/Test/Mono.Cecil.Tests.csproj
+++ b/external/cecil/Test/Mono.Cecil.Tests.csproj
@@ -75,17 +75,17 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <Reference Include="nunit.core, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.core">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>libs\nunit-2.5.10\nunit.core.dll</HintPath>
+      <HintPath>libs\nunit-2.6.2\nunit.core.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.core.interfaces, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.core.interfaces">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>libs\nunit-2.5.10\nunit.core.interfaces.dll</HintPath>
+      <HintPath>libs\nunit-2.6.2\nunit.core.interfaces.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.framework, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.framework">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>libs\nunit-2.5.10\nunit.framework.dll</HintPath>
+      <HintPath>libs\nunit-2.6.2\nunit.framework.dll</HintPath>
     </Reference>
     <Reference Include="System" />
   </ItemGroup>
diff --git a/external/cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs b/external/cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs
index e33da51..8f68e5f 100644
--- a/external/cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs
+++ b/external/cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs
@@ -119,9 +119,26 @@ namespace Mono.Cecil.Tests {
 		[TestModule ("delay-signed.dll")]
 		public void DelaySignedAssembly (ModuleDefinition module)
 		{
+			Assert.IsNotNull (module.Assembly.Name.PublicKey);
+			Assert.AreNotEqual (0, module.Assembly.Name.PublicKey.Length);
 			Assert.AreNotEqual (ModuleAttributes.StrongNameSigned, module.Attributes & ModuleAttributes.StrongNameSigned);
 			Assert.AreNotEqual (0, module.Image.StrongName.VirtualAddress);
 			Assert.AreNotEqual (0, module.Image.StrongName.Size);
 		}
+
+		[TestModule ("wp7.dll", Verify = false)]
+		public void WindowsPhoneNonSignedAssembly (ModuleDefinition module)
+		{
+			Assert.AreEqual (0, module.Assembly.Name.PublicKey.Length);
+			Assert.AreNotEqual (ModuleAttributes.StrongNameSigned, module.Attributes & ModuleAttributes.StrongNameSigned);
+			Assert.AreEqual (0, module.Image.StrongName.VirtualAddress);
+			Assert.AreEqual (0, module.Image.StrongName.Size);
+		}
+
+		[TestModule ("metro.exe", Verify = false)]
+		public void MetroAssembly (ModuleDefinition module)
+		{
+			Assert.AreEqual (ModuleCharacteristics.AppContainer, module.Characteristics & ModuleCharacteristics.AppContainer);
+		}
 	}
 }
diff --git a/external/cecil/Test/Mono.Cecil.Tests/ImportCecilTests.cs b/external/cecil/Test/Mono.Cecil.Tests/ImportCecilTests.cs
index 3fa0406..ae9a855 100644
--- a/external/cecil/Test/Mono.Cecil.Tests/ImportCecilTests.cs
+++ b/external/cecil/Test/Mono.Cecil.Tests/ImportCecilTests.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using System.Diagnostics;
 using System.IO;
 using System.Linq;
@@ -220,6 +221,69 @@ namespace Mono.Cecil.Tests {
 			Assert.AreEqual ("T Mono.Cecil.Tests.ImportCecilTests/Generic`1::Method(T)", method.FullName);
 		}
 
+		public class ContextGeneric1Method2<G1>
+		{
+			public G1 GenericMethod<R1, S1> (R1 r, S1 s)
+			{
+				return default (G1);
+			}
+		}
+
+		public class ContextGeneric2Method1<G2, H2>
+		{
+			public R2 GenericMethod<R2> (G2 g, H2 h)
+			{
+				return default (R2);
+			}
+		}
+
+		public class NestedGenericsA<A>
+		{
+			public class NestedGenericsB<B>
+			{
+				public class NestedGenericsC<C>
+				{
+					public A GenericMethod (B b, C c)
+					{
+						return default (A);
+					}
+				}
+			}
+		}
+
+		[Test]
+		public void ContextGenericTest ()
+		{
+			var module = ModuleDefinition.ReadModule (typeof (ContextGeneric1Method2<>).Module.FullyQualifiedName);
+			// by mixing open generics with 2 & 1 parameters, we make sure the right context is used (because otherwise, an exception will be thrown)
+			var type = typeof (ContextGeneric1Method2<>).MakeGenericType (typeof (ContextGeneric2Method1<,>));
+			var meth = type.GetMethod ("GenericMethod");
+			var imported_type = module.Import (type);
+			var method = module.Import (meth, imported_type);
+			Assert.AreEqual ("G1 Mono.Cecil.Tests.ImportCecilTests/ContextGeneric1Method2`1<Mono.Cecil.Tests.ImportCecilTests/ContextGeneric2Method1`2<G2,H2>>::GenericMethod<R1,S1>(R1,S1)", method.FullName);
+
+			// and the other way around
+			type = typeof (ContextGeneric2Method1<,>).MakeGenericType (typeof (ContextGeneric1Method2<>), typeof (IList<>));
+			meth = type.GetMethod ("GenericMethod");
+			imported_type = module.Import (type);
+			method = module.Import (meth, imported_type);
+			Assert.AreEqual ("R2 Mono.Cecil.Tests.ImportCecilTests/ContextGeneric2Method1`2<Mono.Cecil.Tests.ImportCecilTests/ContextGeneric1Method2`1<G1>,System.Collections.Generic.IList`1<T>>::GenericMethod<R2>(G2,H2)", method.FullName);
+
+			// not sure about this one
+			type = typeof (NestedGenericsA<string>.NestedGenericsB<int>.NestedGenericsC<float>);
+			meth = type.GetMethod ("GenericMethod");
+			imported_type = module.Import (type);
+			method = module.Import (meth, imported_type);
+			Assert.AreEqual ("A Mono.Cecil.Tests.ImportCecilTests/NestedGenericsA`1/NestedGenericsB`1/NestedGenericsC`1<System.String,System.Int32,System.Single>::GenericMethod(B,C)", method.FullName);
+
+			// We need both the method & type !
+			type = typeof (Generic<>).MakeGenericType (typeof (string));
+			meth = type.GetMethod ("ComplexGenericMethod");
+			imported_type = module.Import (type);
+			method = module.Import (meth, imported_type);
+			Assert.AreEqual ("Mono.Cecil.Tests.ImportCecilTests/Generic`1<TS> Mono.Cecil.Tests.ImportCecilTests/Generic`1<System.String>::ComplexGenericMethod<TS>(T,TS)", method.FullName);
+		}
+
 		delegate void Emitter (ModuleDefinition module, MethodBody body);
 
 		[MethodImpl (MethodImplOptions.NoInlining)]
diff --git a/external/cecil/Test/Mono.Cecil.Tests/ImportReflectionTests.cs b/external/cecil/Test/Mono.Cecil.Tests/ImportReflectionTests.cs
index dd1d28a..6ded91c 100644
--- a/external/cecil/Test/Mono.Cecil.Tests/ImportReflectionTests.cs
+++ b/external/cecil/Test/Mono.Cecil.Tests/ImportReflectionTests.cs
@@ -275,7 +275,7 @@ namespace Mono.Cecil.Tests {
 
 			var generic_field = module.Import (generic_list_foo_open_field, foo_def);
 
-			Assert.AreEqual ("TFoo Mono.Cecil.Tests.ImportReflectionTests/Generic`1<System.Collections.Generic.List`1<TFoo>>::Field",
+			Assert.AreEqual ("T Mono.Cecil.Tests.ImportReflectionTests/Generic`1<System.Collections.Generic.List`1<TFoo>>::Field",
 				generic_field.FullName);
 		}
 
@@ -291,7 +291,7 @@ namespace Mono.Cecil.Tests {
 
 			var generic_method = module.Import (generic_list_foo_open_method, foo_def);
 
-			Assert.AreEqual ("TFoo Mono.Cecil.Tests.ImportReflectionTests/Generic`1<System.Collections.Generic.List`1<TFoo>>::Method(TFoo)",
+			Assert.AreEqual ("T Mono.Cecil.Tests.ImportReflectionTests/Generic`1<System.Collections.Generic.List`1<TFoo>>::Method(T)",
 				generic_method.FullName);
 		}
 
diff --git a/external/cecil/Test/Mono.Cecil.Tests/ResolveTests.cs b/external/cecil/Test/Mono.Cecil.Tests/ResolveTests.cs
index 9ec1be8..cb7512d 100644
--- a/external/cecil/Test/Mono.Cecil.Tests/ResolveTests.cs
+++ b/external/cecil/Test/Mono.Cecil.Tests/ResolveTests.cs
@@ -211,6 +211,21 @@ namespace Mono.Cecil.Tests {
 			Assert.IsNotNull (resolver.Resolve (reference));
 		}
 
+		[Test]
+		public void ResolvePortableClassLibraryReference ()
+		{
+			var resolver = new DefaultAssemblyResolver ();
+			var parameters = new ReaderParameters { AssemblyResolver = resolver };
+			var pcl = GetResourceModule ("PortableClassLibrary.dll", parameters);
+
+			foreach (var reference in pcl.AssemblyReferences) {
+				Assert.IsTrue (reference.IsRetargetable);
+				var assembly = resolver.Resolve (reference);
+				Assert.IsNotNull (assembly);
+				Assert.AreEqual (typeof (object).Assembly.GetName ().Version, assembly.Name.Version);
+			}
+		}
+
 		static TRet GetReference<TDel, TRet> (TDel code)
 		{
 			var @delegate = code as Delegate;
diff --git a/external/cecil/Test/libs/nunit-2.4.8/license.txt b/external/cecil/Test/libs/nunit-2.4.8/license.txt
deleted file mode 100644
index fef6910..0000000
--- a/external/cecil/Test/libs/nunit-2.4.8/license.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Copyright � 2002-2007 Charlie Poole
-Copyright � 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
-Copyright � 2000-2002 Philip A. Craig
-
-This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
-
-Portions Copyright � 2002-2007 Charlie Poole or Copyright � 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright � 2000-2002 Philip A. Craig
-
-2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
-
-3. This notice may not be removed or altered from any source distribution.
diff --git a/external/cecil/Test/libs/nunit-2.6.2/license.txt b/external/cecil/Test/libs/nunit-2.6.2/license.txt
new file mode 100755
index 0000000..724e465
--- /dev/null
+++ b/external/cecil/Test/libs/nunit-2.6.2/license.txt
@@ -0,0 +1,15 @@
+Copyright � 2002-2012 Charlie Poole
+Copyright � 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+Copyright � 2000-2002 Philip A. Craig
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
+
+Portions Copyright � 2002-2012 Charlie Poole or Copyright � 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright � 2000-2002 Philip A. Craig
+
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
diff --git a/external/cecil/rocks/Test/Mono.Cecil.Rocks.Tests.csproj b/external/cecil/rocks/Test/Mono.Cecil.Rocks.Tests.csproj
index 3e7b8de..93c5550 100644
--- a/external/cecil/rocks/Test/Mono.Cecil.Rocks.Tests.csproj
+++ b/external/cecil/rocks/Test/Mono.Cecil.Rocks.Tests.csproj
@@ -51,17 +51,17 @@
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="nunit.core, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.core">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\Test\libs\nunit-2.5.10\nunit.core.dll</HintPath>
+      <HintPath>..\..\Test\libs\nunit-2.6.2\nunit.core.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.core.interfaces, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.core.interfaces">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\Test\libs\nunit-2.5.10\nunit.core.interfaces.dll</HintPath>
+      <HintPath>..\..\Test\libs\nunit-2.6.2\nunit.core.interfaces.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.framework, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.framework">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\Test\libs\nunit-2.5.10\nunit.framework.dll</HintPath>
+      <HintPath>..\..\Test\libs\nunit-2.6.2\nunit.framework.dll</HintPath>
     </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
diff --git a/external/cecil/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs b/external/cecil/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs
index 2db0419..2440a66 100644
--- a/external/cecil/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs
+++ b/external/cecil/symbols/mdb/Mono.Cecil.Mdb/MdbReader.cs
@@ -40,7 +40,7 @@ namespace Mono.Cecil.Mdb {
 
 		public ISymbolReader GetSymbolReader (ModuleDefinition module, string fileName)
 		{
-			return new MdbReader (MonoSymbolFile.ReadSymbolFile (module, fileName));
+			return new MdbReader (module, MonoSymbolFile.ReadSymbolFile (module, fileName));
 		}
 
 		public ISymbolReader GetSymbolReader (ModuleDefinition module, Stream symbolStream)
@@ -51,18 +51,20 @@ namespace Mono.Cecil.Mdb {
 
 	public class MdbReader : ISymbolReader {
 
+		readonly ModuleDefinition module;
 		readonly MonoSymbolFile symbol_file;
 		readonly Dictionary<string, Document> documents;
 
-		public MdbReader (MonoSymbolFile symFile)
+		public MdbReader (ModuleDefinition module, MonoSymbolFile symFile)
 		{
-			symbol_file = symFile;
-			documents = new Dictionary<string, Document> ();
+			this.module = module;
+			this.symbol_file = symFile;
+			this.documents = new Dictionary<string, Document> ();
 		}
 
 		public bool ProcessDebugHeader (ImageDebugDirectory directory, byte [] header)
 		{
-			return true;
+			return symbol_file.Guid == module.Mvid;
 		}
 
 		public void Read (MethodBody body, InstructionMapper mapper)
@@ -80,7 +82,11 @@ namespace Mono.Cecil.Mdb {
 		static void ReadLocalVariables (MethodEntry entry, MethodBody body, Scope [] scopes)
 		{
 			var locals = entry.GetLocals ();
+
 			foreach (var local in locals) {
+				if (local.Index < 0 || local.Index >= body.Variables.Count) // Mono 2.6 emits wrong local infos for iterators
+					continue;
+				
 				var variable = body.Variables [local.Index];
 				variable.Name = local.Name;
 
@@ -200,6 +206,9 @@ namespace Mono.Cecil.Mdb {
 		static void ReadLocalVariables (MethodEntry entry, MethodSymbols symbols)
 		{
 			foreach (var local in entry.GetLocals ()) {
+				if (local.Index < 0 || local.Index >= symbols.Variables.Count) // Mono 2.6 emits wrong local infos for iterators
+					continue;
+
 				var variable = symbols.Variables [local.Index];
 				variable.Name = local.Name;
 			}
diff --git a/external/cecil/symbols/mdb/Test/Mono.Cecil.Mdb.Tests.csproj b/external/cecil/symbols/mdb/Test/Mono.Cecil.Mdb.Tests.csproj
index 708f800..2123470 100644
--- a/external/cecil/symbols/mdb/Test/Mono.Cecil.Mdb.Tests.csproj
+++ b/external/cecil/symbols/mdb/Test/Mono.Cecil.Mdb.Tests.csproj
@@ -95,17 +95,17 @@
     <Content Include="Resources\assemblies\hello.exe.mdb" />
   </ItemGroup>
   <ItemGroup>
-    <Reference Include="nunit.core, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.core">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\Test\libs\nunit-2.5.10\nunit.core.dll</HintPath>
+      <HintPath>..\..\..\Test\libs\nunit-2.6.2\nunit.core.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.core.interfaces, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.core.interfaces">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\Test\libs\nunit-2.5.10\nunit.core.interfaces.dll</HintPath>
+      <HintPath>..\..\..\Test\libs\nunit-2.6.2\nunit.core.interfaces.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.framework, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.framework">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\Test\libs\nunit-2.5.10\nunit.framework.dll</HintPath>
+      <HintPath>..\..\..\Test\libs\nunit-2.6.2\nunit.framework.dll</HintPath>
     </Reference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
diff --git a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/BitAccess.cs b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/BitAccess.cs
index e8e77b0..d92a5b7 100644
--- a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/BitAccess.cs
+++ b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/BitAccess.cs
@@ -189,6 +189,12 @@ namespace Microsoft.Cci.Pdb {
       offset += len;
     }
 
+    internal string ReadBString(int len) {
+      var result = Encoding.UTF8.GetString(buffer, offset, len);
+      offset += len;
+      return result;
+    }
+
     internal void ReadCString(out string value) {
       int len = 0;
       while (offset + len < buffer.Length && buffer[offset + len] != 0) {
diff --git a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFile.cs b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFile.cs
index 9e56028..47191ef 100644
--- a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFile.cs
+++ b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFile.cs
@@ -131,11 +131,11 @@ namespace Microsoft.Cci.Pdb {
       return ht;
     }
 
-    private static PdbFunction match = new PdbFunction();
-
     private static int FindFunction(PdbFunction[] funcs, ushort sec, uint off) {
-      match.segment = sec;
-      match.address = off;
+      var match = new PdbFunction {
+        segment = sec,
+        address = off,
+      };
 
       return Array.BinarySearch(funcs, match, PdbFunction.byAddress);
     }
@@ -148,52 +148,9 @@ namespace Microsoft.Cci.Pdb {
                                  PdbReader reader,
                                  uint limit) {
       Array.Sort(funcs, PdbFunction.byAddressAndToken);
-      IntHashTable checks = new IntHashTable();
 
-      // Read the files first
       int begin = bits.Position;
-      while (bits.Position < limit) {
-        int sig;
-        int siz;
-        bits.ReadInt32(out sig);
-        bits.ReadInt32(out siz);
-        int place = bits.Position;
-        int endSym = bits.Position + siz;
-
-        switch ((DEBUG_S_SUBSECTION)sig) {
-          case DEBUG_S_SUBSECTION.FILECHKSMS:
-            while (bits.Position < endSym) {
-              CV_FileCheckSum chk;
-
-              int ni = bits.Position - place;
-              bits.ReadUInt32(out chk.name);
-              bits.ReadUInt8(out chk.len);
-              bits.ReadUInt8(out chk.type);
-
-              string name = (string)names[(int)chk.name];
-              int guidStream;
-              Guid doctypeGuid = SymDocumentType.Text;
-              Guid languageGuid = Guid.Empty;
-              Guid vendorGuid = Guid.Empty;
-              if (nameIndex.TryGetValue("/SRC/FILES/"+name.ToUpperInvariant(), out guidStream)) {
-                var guidBits = new BitAccess(0x100);
-                dir.streams[guidStream].Read(reader, guidBits);
-                LoadGuidStream(guidBits, out doctypeGuid, out languageGuid, out vendorGuid);
-              }
-
-              PdbSource src = new PdbSource(/*(uint)ni,*/ name, doctypeGuid, languageGuid, vendorGuid);
-              checks.Add(ni, src);
-              bits.Position += chk.len;
-              bits.Align(4);
-            }
-            bits.Position = endSym;
-            break;
-
-          default:
-            bits.Position = endSym;
-            break;
-        }
-      }
+      IntHashTable checks = ReadSourceFileInfo(bits, limit, names, dir, nameIndex, reader);
 
       // Read the lines next.
       bits.Position = begin;
@@ -222,7 +179,7 @@ namespace Microsoft.Cci.Pdb {
                   func = f;
                   funcIndex--;
                 }
-             } else {
+              } else {
                 while (funcIndex < funcs.Length-1 && func.lines != null) {
                   var f = funcs[funcIndex+1];
                   if (f.segment != sec.sec || f.address != sec.off) break;
@@ -380,12 +337,9 @@ namespace Microsoft.Cci.Pdb {
       bits.Position = end;
     }
 
-    internal static PdbFunction[] LoadFunctions(Stream read, bool readAllStrings, out int age, out Guid guid) {
+    internal static PdbFunction[] LoadFunctions(Stream read, out Dictionary<uint, PdbTokenLine> tokenToSourceMapping, out string sourceServerData, out int age, out Guid guid) {
+      tokenToSourceMapping = new Dictionary<uint, PdbTokenLine>();
       BitAccess bits = new BitAccess(512 * 1024);
-      return LoadFunctions(read, bits, readAllStrings, out age, out guid);
-    }
-
-    internal static PdbFunction[] LoadFunctions(Stream read, BitAccess bits, bool readAllStrings, out int age, out Guid guid) {
       PdbFileHeader head = new PdbFileHeader(read, bits);
       PdbReader reader = new PdbReader(read, head.pageSize);
       MsfDirectory dir = new MsfDirectory(reader, head, bits);
@@ -398,21 +352,34 @@ namespace Microsoft.Cci.Pdb {
       if (!nameIndex.TryGetValue("/NAMES", out nameStream)) {
         throw new PdbException("No `name' stream");
       }
-
       dir.streams[nameStream].Read(reader, bits);
       IntHashTable names = LoadNameStream(bits);
 
+      int srcsrvStream;
+      if (!nameIndex.TryGetValue("SRCSRV", out srcsrvStream))
+        sourceServerData = string.Empty;
+      else {
+        DataStream dataStream = dir.streams[srcsrvStream];
+        byte[] bytes = new byte[dataStream.contentSize];
+        dataStream.Read(reader, bits);
+        sourceServerData = bits.ReadBString(bytes.Length);
+      }
+
       dir.streams[3].Read(reader, bits);
-      LoadDbiStream(bits, out modules, out header, readAllStrings);
+      LoadDbiStream(bits, out modules, out header, true);
 
       ArrayList funcList = new ArrayList();
 
       if (modules != null) {
         for (int m = 0; m < modules.Length; m++) {
-          if (modules[m].stream > 0) {
-            dir.streams[modules[m].stream].Read(reader, bits);
-            LoadFuncsFromDbiModule(bits, modules[m], names, funcList,
-                                   readAllStrings, dir, nameIndex, reader);
+          var module = modules[m];
+          if (module.stream > 0) {
+            dir.streams[module.stream].Read(reader, bits);
+            if (module.moduleName == "TokenSourceLineInfo") {
+              LoadTokenToSourceInfo(bits, module, names, dir, nameIndex, reader, tokenToSourceMapping);
+              continue;
+            }
+            LoadFuncsFromDbiModule(bits, module, names, funcList, true, dir, nameIndex, reader);
           }
         }
       }
@@ -435,5 +402,136 @@ namespace Microsoft.Cci.Pdb {
       //Array.Sort(funcs, PdbFunction.byToken);
       return funcs;
     }
+
+    private static void LoadTokenToSourceInfo(BitAccess bits, DbiModuleInfo module, IntHashTable names, MsfDirectory dir,
+      Dictionary<string, int> nameIndex, PdbReader reader, Dictionary<uint, PdbTokenLine> tokenToSourceMapping) {
+      bits.Position = 0;
+      int sig;
+      bits.ReadInt32(out sig);
+      if (sig != 4) {
+        throw new PdbDebugException("Invalid signature. (sig={0})", sig);
+      }
+
+      bits.Position = 4;
+
+      while (bits.Position < module.cbSyms) {
+        ushort siz;
+        ushort rec;
+
+        bits.ReadUInt16(out siz);
+        int star = bits.Position;
+        int stop = bits.Position + siz;
+        bits.Position = star;
+        bits.ReadUInt16(out rec);
+
+        switch ((SYM)rec) {
+          case SYM.S_OEM:
+            OemSymbol oem;
+
+            bits.ReadGuid(out oem.idOem);
+            bits.ReadUInt32(out oem.typind);
+            // internal byte[]   rgl;        // user data, force 4-byte alignment
+
+            if (oem.idOem == PdbFunction.msilMetaData) {
+              string name = bits.ReadString();
+              if (name == "TSLI") {
+                uint token;
+                uint file_id;
+                uint line;
+                uint column;
+                uint endLine;
+                uint endColumn;
+                bits.ReadUInt32(out token);
+                bits.ReadUInt32(out file_id);
+                bits.ReadUInt32(out line);
+                bits.ReadUInt32(out column);
+                bits.ReadUInt32(out endLine);
+                bits.ReadUInt32(out endColumn);
+                PdbTokenLine tokenLine;
+                if (!tokenToSourceMapping.TryGetValue(token, out tokenLine))
+                  tokenToSourceMapping.Add(token, new PdbTokenLine(token, file_id, line, column, endLine, endColumn));
+                else {
+                  while (tokenLine.nextLine != null) tokenLine = tokenLine.nextLine;
+                  tokenLine.nextLine = new PdbTokenLine(token, file_id, line, column, endLine, endColumn);
+                }
+              }
+              bits.Position = stop;
+              break;
+            } else {
+              throw new PdbDebugException("OEM section: guid={0} ti={1}",
+                                          oem.idOem, oem.typind);
+              // bits.Position = stop;
+            }
+
+          case SYM.S_END:
+            bits.Position = stop;
+            break;
+
+          default:
+            //Console.WriteLine("{0,6}: {1:x2} {2}",
+            //                  bits.Position, rec, (SYM)rec);
+            bits.Position = stop;
+            break;
+        }
+      }
+
+      bits.Position = module.cbSyms + module.cbOldLines;
+      int limit = module.cbSyms + module.cbOldLines + module.cbLines;
+      IntHashTable sourceFiles = ReadSourceFileInfo(bits, (uint)limit, names, dir, nameIndex, reader);
+      foreach (var tokenLine in tokenToSourceMapping.Values) {
+        tokenLine.sourceFile = (PdbSource)sourceFiles[(int)tokenLine.file_id];
+      }
+
+    }
+
+    private static IntHashTable ReadSourceFileInfo(BitAccess bits, uint limit, IntHashTable names, MsfDirectory dir,
+      Dictionary<string, int> nameIndex, PdbReader reader) {
+      IntHashTable checks = new IntHashTable();
+
+      int begin = bits.Position;
+      while (bits.Position < limit) {
+        int sig;
+        int siz;
+        bits.ReadInt32(out sig);
+        bits.ReadInt32(out siz);
+        int place = bits.Position;
+        int endSym = bits.Position + siz;
+
+        switch ((DEBUG_S_SUBSECTION)sig) {
+          case DEBUG_S_SUBSECTION.FILECHKSMS:
+            while (bits.Position < endSym) {
+              CV_FileCheckSum chk;
+
+              int ni = bits.Position - place;
+              bits.ReadUInt32(out chk.name);
+              bits.ReadUInt8(out chk.len);
+              bits.ReadUInt8(out chk.type);
+
+              string name = (string)names[(int)chk.name];
+              int guidStream;
+              Guid doctypeGuid = SymDocumentType.Text;
+              Guid languageGuid = Guid.Empty;
+              Guid vendorGuid = Guid.Empty;
+              if (nameIndex.TryGetValue("/SRC/FILES/"+name.ToUpperInvariant(), out guidStream)) {
+                var guidBits = new BitAccess(0x100);
+                dir.streams[guidStream].Read(reader, guidBits);
+                LoadGuidStream(guidBits, out doctypeGuid, out languageGuid, out vendorGuid);
+              }
+
+              PdbSource src = new PdbSource(/*(uint)ni,*/ name, doctypeGuid, languageGuid, vendorGuid);
+              checks.Add(ni, src);
+              bits.Position += chk.len;
+              bits.Align(4);
+            }
+            bits.Position = endSym;
+            break;
+
+          default:
+            bits.Position = endSym;
+            break;
+        }
+      }
+      return checks;
+    }
   }
 }
diff --git a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFunction.cs b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFunction.cs
index d1daba1..7262231 100644
--- a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFunction.cs
+++ b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbFunction.cs
@@ -22,6 +22,7 @@ namespace Microsoft.Cci.Pdb {
 
     internal uint token;
     internal uint slotToken;
+    internal uint tokenOfMethodWhoseUsingInfoAppliesToThisMethod;
     //internal string name;
     //internal string module;
     //internal ushort flags;
@@ -40,6 +41,7 @@ namespace Microsoft.Cci.Pdb {
     internal IEnumerable<INamespaceScope>/*?*/ namespaceScopes;
     internal string/*?*/ iteratorClass;
     internal List<ILocalScope>/*?*/ iteratorScopes;
+    internal PdbSynchronizationInformation/*?*/ synchronizationInformation;
 
     private static string StripNamespace(string module) {
       int li = module.LastIndexOf('.');
@@ -267,6 +269,8 @@ namespace Microsoft.Cci.Pdb {
                     while (count-- > 0)
                       this.ReadCustomMetadata(bits);
                   }
+                } else if (name == "asyncMethodInfo") {
+                  this.synchronizationInformation = new PdbSynchronizationInformation(bits);
                 }
                 bits.Position = stop;
                 break;
@@ -294,8 +298,7 @@ namespace Microsoft.Cci.Pdb {
             }
 
           case SYM.S_MANSLOT:
-            uint typind;
-            slots[slot++] = new PdbSlot(bits, out typind);
+            slots[slot++] = new PdbSlot(bits);
             bits.Position = stop;
             break;
 
@@ -349,7 +352,7 @@ namespace Microsoft.Cci.Pdb {
       bits.ReadUInt32(out numberOfBytesInItem);
       switch (kind) {
         case 0: this.ReadUsingInfo(bits); break;
-        case 1: break; // this.ReadForwardInfo(bits); break;
+        case 1: this.ReadForwardInfo(bits); break;
         case 2: break; // this.ReadForwardedToModuleInfo(bits); break;
         case 3: this.ReadIteratorLocals(bits); break;
         case 4: this.ReadForwardIterator(bits); break;
@@ -378,8 +381,9 @@ namespace Microsoft.Cci.Pdb {
     //private void ReadForwardedToModuleInfo(BitAccess bits) {
     //}
 
-    //private void ReadForwardInfo(BitAccess bits) {
-    //}
+    private void ReadForwardInfo(BitAccess bits) {
+      bits.ReadUInt32(out this.tokenOfMethodWhoseUsingInfoAppliesToThisMethod);
+    }
 
     private void ReadUsingInfo(BitAccess bits) {
       ushort numberOfNamespaces;
@@ -449,4 +453,46 @@ namespace Microsoft.Cci.Pdb {
 
     //}
   }
+
+  internal class PdbSynchronizationInformation {
+    internal uint kickoffMethodToken;
+    internal uint generatedCatchHandlerIlOffset;
+    internal PdbSynchronizationPoint[] synchronizationPoints;
+
+    internal PdbSynchronizationInformation(BitAccess bits) {
+      uint asyncStepInfoCount;
+      bits.ReadUInt32(out this.kickoffMethodToken);
+      bits.ReadUInt32(out this.generatedCatchHandlerIlOffset);
+      bits.ReadUInt32(out asyncStepInfoCount);
+      this.synchronizationPoints = new PdbSynchronizationPoint[asyncStepInfoCount];
+      for (uint i = 0; i < asyncStepInfoCount; i += 1) {
+        this.synchronizationPoints[i] = new PdbSynchronizationPoint(bits);
+      }
+    }
+
+    public uint GeneratedCatchHandlerOffset {
+      get { return this.generatedCatchHandlerIlOffset; }
+    }
+  }
+
+  internal class PdbSynchronizationPoint {
+    internal uint synchronizeOffset;
+    internal uint continuationMethodToken;
+    internal uint continuationOffset;
+
+    internal PdbSynchronizationPoint(BitAccess bits) {
+      bits.ReadUInt32(out this.synchronizeOffset);
+      bits.ReadUInt32(out this.continuationMethodToken);
+      bits.ReadUInt32(out this.continuationOffset);
+    }
+
+    public uint SynchronizeOffset {
+      get { return this.synchronizeOffset; }
+    }
+
+    public uint ContinuationOffset {
+      get { return this.continuationOffset; }
+    }
+  }
+
 }
diff --git a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbScope.cs b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbScope.cs
index c46220b..92ac385 100644
--- a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbScope.cs
+++ b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbScope.cs
@@ -80,7 +80,7 @@ namespace Microsoft.Cci.Pdb {
             }
 
           case SYM.S_MANSLOT:
-            slots[slot++] = new PdbSlot(bits, out typind);
+            slots[slot++] = new PdbSlot(bits);
             bits.Position = stop;
             break;
 
diff --git a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbSlot.cs b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbSlot.cs
index 0dc89ad..e2b76d5 100644
--- a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbSlot.cs
+++ b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbSlot.cs
@@ -13,12 +13,13 @@ using System;
 namespace Microsoft.Cci.Pdb {
   internal class PdbSlot {
     internal uint slot;
+    internal uint typeToken;
     internal string name;
     internal ushort flags;
     //internal uint segment;
     //internal uint address;
 
-    internal PdbSlot(BitAccess bits, out uint typind) {
+    internal PdbSlot(BitAccess bits) {
       AttrSlotSym slot;
 
       bits.ReadUInt32(out slot.index);
@@ -29,12 +30,12 @@ namespace Microsoft.Cci.Pdb {
       bits.ReadCString(out slot.name);
 
       this.slot = slot.index;
+      this.typeToken = slot.typind;
       this.name = slot.name;
       this.flags = slot.flags;
       //this.segment = slot.segCod;
       //this.address = slot.offCod;
 
-      typind = slot.typind;
     }
   }
 }
diff --git a/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbTokenLine.cs b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbTokenLine.cs
new file mode 100644
index 0000000..879339b
--- /dev/null
+++ b/external/cecil/symbols/pdb/Microsoft.Cci.Pdb/PdbTokenLine.cs
@@ -0,0 +1,33 @@
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the Microsoft Public License.
+// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
+// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
+// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
+//
+//-----------------------------------------------------------------------------
+using System;
+
+namespace Microsoft.Cci.Pdb {
+  internal class PdbTokenLine {
+    internal uint token;
+    internal uint file_id;
+    internal uint line;
+    internal uint column;
+    internal uint endLine;
+    internal uint endColumn;
+    internal PdbSource sourceFile;
+    internal PdbTokenLine/*?*/ nextLine;
+
+    internal PdbTokenLine(uint token, uint file_id, uint line, uint column, uint endLine, uint endColumn) {
+      this.token = token;
+      this.file_id = file_id;
+      this.line = line;
+      this.column = column;
+      this.endLine = endLine;
+      this.endColumn = endColumn;
+    }
+  }
+}
diff --git a/external/cecil/symbols/pdb/Mono.Cecil.Pdb.csproj b/external/cecil/symbols/pdb/Mono.Cecil.Pdb.csproj
index 5248bad..e35add0 100644
--- a/external/cecil/symbols/pdb/Mono.Cecil.Pdb.csproj
+++ b/external/cecil/symbols/pdb/Mono.Cecil.Pdb.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">net_4_0_Debug</Configuration>
@@ -108,7 +108,10 @@
     <Compile Include="Microsoft.Cci.Pdb\PdbScope.cs" />
     <Compile Include="Microsoft.Cci.Pdb\PdbSlot.cs" />
     <Compile Include="Microsoft.Cci.Pdb\PdbSource.cs" />
-    <Compile Include="Microsoft.Cci.Pdb\SourceLocationProvider.cs" />
+    <Compile Include="Microsoft.Cci.Pdb\PdbTokenLine.cs" />
+    <Compile Include="Microsoft.Cci.Pdb\SourceLocationProvider.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Mono.Cecil.Pdb\AssemblyInfo.cs" />
     <Compile Include="Mono.Cecil.Pdb\ISymUnmanagedDocumentWriter.cs" />
     <Compile Include="Mono.Cecil.Pdb\ISymUnmanagedWriter2.cs" />
diff --git a/external/cecil/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs b/external/cecil/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs
index 9d71666..6d4fd09 100644
--- a/external/cecil/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs
+++ b/external/cecil/symbols/pdb/Mono.Cecil.Pdb/PdbReader.cs
@@ -86,11 +86,14 @@ namespace Mono.Cecil.Pdb {
 		bool PopulateFunctions ()
 		{
 			using (pdb_file) {
+				Dictionary<uint, PdbTokenLine> tokenToSourceMapping;
+				string sourceServerData;
 				int age;
 				Guid guid;
-				var funcs = PdbFile.LoadFunctions (pdb_file, true, out age, out guid);
 
-				if (this.age != 0 && this.guid != guid)
+				var funcs = PdbFile.LoadFunctions (pdb_file, out tokenToSourceMapping,  out sourceServerData, out age, out guid);
+
+				if (this.guid != guid)
 					return false;
 
 				foreach (PdbFunction function in funcs)
diff --git a/external/cecil/symbols/pdb/Test/Mono.Cecil.Pdb.Tests.csproj b/external/cecil/symbols/pdb/Test/Mono.Cecil.Pdb.Tests.csproj
index 7bf3ed4..657e351 100644
--- a/external/cecil/symbols/pdb/Test/Mono.Cecil.Pdb.Tests.csproj
+++ b/external/cecil/symbols/pdb/Test/Mono.Cecil.Pdb.Tests.csproj
@@ -100,17 +100,17 @@
     <Content Include="Resources\assemblies\VBConsApp.pdb" />
   </ItemGroup>
   <ItemGroup>
-    <Reference Include="nunit.core, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.core">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\Test\libs\nunit-2.5.10\nunit.core.dll</HintPath>
+      <HintPath>..\..\..\Test\libs\nunit-2.6.2\nunit.core.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.core.interfaces, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.core.interfaces">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\Test\libs\nunit-2.5.10\nunit.core.interfaces.dll</HintPath>
+      <HintPath>..\..\..\Test\libs\nunit-2.6.2\nunit.core.interfaces.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.framework, Version=2.5.10.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+    <Reference Include="nunit.framework">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\Test\libs\nunit-2.5.10\nunit.framework.dll</HintPath>
+      <HintPath>..\..\..\Test\libs\nunit-2.6.2\nunit.framework.dll</HintPath>
     </Reference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
diff --git a/external/ikvm/awt/ShellApi.cs b/external/ikvm/awt/ShellApi.cs
index 6597d4b..446ada7 100644
--- a/external/ikvm/awt/ShellApi.cs
+++ b/external/ikvm/awt/ShellApi.cs
@@ -316,7 +316,7 @@ namespace awt
         public struct SHFILEINFO
         {
             public IntPtr hIcon;
-            public IntPtr iIcon;
+            public int iIcon;
             public uint dwAttributes;
             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
             public string szDisplayName;
diff --git a/external/ikvm/classpath/ikvm/internal/HasCallerID.java b/external/ikvm/classpath/ikvm/internal/HasCallerID.java
deleted file mode 100644
index 27b1a17..0000000
--- a/external/ikvm/classpath/ikvm/internal/HasCallerID.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-  Copyright (C) 2008 Jeroen Frijters
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  Jeroen Frijters
-  jeroen at frijters.net
-  
-*/
-package ikvm.internal;
-
-import java.lang.annotation.*;
-
-/* This annotation is used to mark method inside the core class library that require an additional (hidden) ikvm.internal.CallerID parameter
- * (automatically supplied by the runtime) to efficiently query the caller's class or class loader.
- * It should only be applied to final or static methods that use one of the supported caller id methods (as defined in intrinsics.cs)
- */
-
- at Retention(RetentionPolicy.CLASS)
- at Target({ ElementType.METHOD })
- at ikvm.lang.Internal
-public @interface HasCallerID { }
diff --git a/external/ikvm/ikvm/starter.cs b/external/ikvm/ikvm/starter.cs
index 89d6cc1..044e657 100644
--- a/external/ikvm/ikvm/starter.cs
+++ b/external/ikvm/ikvm/starter.cs
@@ -29,7 +29,7 @@ using IKVM.Internal;
 using ikvm.runtime;
 using java.lang.reflect;
 
-public class Starter
+public static class Starter
 {
 	private class Timer
 	{
@@ -120,7 +120,13 @@ public class Starter
 			{
 				if(arg == "-help" || arg == "-?")
 				{
-					break;
+					PrintHelp();
+					return 1;
+				}
+				else if(arg == "-X")
+				{
+					PrintXHelp();
+					return 1;
 				}
 				else if(arg == "-Xsave")
 				{
@@ -251,7 +257,7 @@ public class Starter
                 }
                 else if (arg.StartsWith("-Xreference:"))
                 {
-                    Startup.addBootClassPathAssemby(Assembly.LoadFrom(arg.Substring(12)));
+                    Startup.addBootClassPathAssembly(Assembly.LoadFrom(arg.Substring(12)));
                 }
                 else if (arg == "-Xnoglobbing")
                 {
@@ -298,34 +304,7 @@ public class Starter
 		}
 		if(mainClass == null)
 		{
-			Console.Error.WriteLine("usage: ikvm [-options] <class> [args...]");
-			Console.Error.WriteLine("          (to execute a class)");
-			Console.Error.WriteLine("    or ikvm -jar [-options] <jarfile> [args...]");
-			Console.Error.WriteLine("          (to execute a jar file)");
-			Console.Error.WriteLine();
-			Console.Error.WriteLine("where options include:");
-			Console.Error.WriteLine("    -? -help          Display this message");
-			Console.Error.WriteLine("    -version          Display IKVM and runtime version");
-			Console.Error.WriteLine("    -showversion      Display version and continue running");
-			Console.Error.WriteLine("    -cp -classpath <directories and zip/jar files separated by {0}>", Path.PathSeparator);
-			Console.Error.WriteLine("                      Set search path for application classes and resources");
-			Console.Error.WriteLine("    -D<name>=<value>  Set a system property");
-			Console.Error.WriteLine("    -ea[:<packagename>...|:<classname>]");
-			Console.Error.WriteLine("    -enableassertions[:<packagename>...|:<classname>]");
-			Console.Error.WriteLine("                      Enable assertions.");
-			Console.Error.WriteLine("    -da[:<packagename>...|:<classname>]");
-			Console.Error.WriteLine("    -disableassertions[:<packagename>...|:<classname>]");
-			Console.Error.WriteLine("                      Disable assertions");
-			Console.Error.WriteLine("    -Xsave            Save the generated assembly (for debugging)");
-			Console.Error.WriteLine("    -Xtime            Time the execution");
-			Console.Error.WriteLine("    -Xtrace:<string>  Displays all tracepoints with the given name");
-			Console.Error.WriteLine("    -Xmethodtrace:<string>");
-			Console.Error.WriteLine("                      Builds method trace into the specified output methods");
-			Console.Error.WriteLine("    -Xwait            Keep process hanging around after exit");
-			Console.Error.WriteLine("    -Xbreak           Trigger a user defined breakpoint at startup");
-			Console.Error.WriteLine("    -Xnoclassgc       Disable class garbage collection");
-			Console.Error.WriteLine("    -Xnoglobbing      Disable argument globbing");
-			Console.Error.WriteLine("    -Xverify          Enable strict class file verification");
+			PrintHelp();
 			return 1;
 		}
 		try
@@ -414,4 +393,44 @@ public class Starter
 		}
 		return 1;
 	}
+
+	private static void PrintHelp()
+	{
+		Console.Error.WriteLine("usage: ikvm [-options] <class> [args...]");
+		Console.Error.WriteLine("          (to execute a class)");
+		Console.Error.WriteLine("    or ikvm -jar [-options] <jarfile> [args...]");
+		Console.Error.WriteLine("          (to execute a jar file)");
+		Console.Error.WriteLine();
+		Console.Error.WriteLine("where options include:");
+		Console.Error.WriteLine("    -? -help          Display this message");
+		Console.Error.WriteLine("    -X                Display non-standard options");
+		Console.Error.WriteLine("    -version          Display IKVM and runtime version");
+		Console.Error.WriteLine("    -showversion      Display version and continue running");
+		Console.Error.WriteLine("    -cp -classpath <directories and zip/jar files separated by {0}>", Path.PathSeparator);
+		Console.Error.WriteLine("                      Set search path for application classes and resources");
+		Console.Error.WriteLine("    -D<name>=<value>  Set a system property");
+		Console.Error.WriteLine("    -ea[:<packagename>...|:<classname>]");
+		Console.Error.WriteLine("    -enableassertions[:<packagename>...|:<classname>]");
+		Console.Error.WriteLine("                      Enable assertions.");
+		Console.Error.WriteLine("    -da[:<packagename>...|:<classname>]");
+		Console.Error.WriteLine("    -disableassertions[:<packagename>...|:<classname>]");
+		Console.Error.WriteLine("                      Disable assertions");
+	}
+
+	private static void PrintXHelp()
+	{
+		Console.Error.WriteLine("    -Xsave            Save the generated assembly (for troubleshooting)");
+		Console.Error.WriteLine("    -Xtime            Time the execution");
+		Console.Error.WriteLine("    -Xtrace:<string>  Displays all tracepoints with the given name");
+		Console.Error.WriteLine("    -Xmethodtrace:<string>");
+		Console.Error.WriteLine("                      Builds method trace into the specified output methods");
+		Console.Error.WriteLine("    -Xwait            Keep process hanging around after exit");
+		Console.Error.WriteLine("    -Xbreak           Trigger a user defined breakpoint at startup");
+		Console.Error.WriteLine("    -Xnoclassgc       Disable class garbage collection");
+		Console.Error.WriteLine("    -Xnoglobbing      Disable argument globbing");
+		Console.Error.WriteLine("    -Xverify          Enable strict class file verification");
+		Console.Error.WriteLine();
+		Console.Error.WriteLine("The -X options are non-standard and subject to change without notice.");
+		Console.Error.WriteLine();
+	}
 }
diff --git a/external/ikvm/ikvmc/CompilerClassLoader.cs b/external/ikvm/ikvmc/CompilerClassLoader.cs
index 5f8d1d5..e7247c1 100644
--- a/external/ikvm/ikvmc/CompilerClassLoader.cs
+++ b/external/ikvm/ikvmc/CompilerClassLoader.cs
@@ -44,7 +44,7 @@ namespace IKVM.Internal
 {
 	sealed class CompilerClassLoader : ClassLoaderWrapper
 	{
-		private Dictionary<string, JarItemReference> classes;
+		private Dictionary<string, Jar.Item> classes;
 		private Dictionary<string, RemapperTypeWrapper> remapped = new Dictionary<string, RemapperTypeWrapper>();
 		private string assemblyName;
 		private string assemblyFile;
@@ -63,7 +63,6 @@ namespace IKVM.Internal
 		private Dictionary<MethodKey, IKVM.Internal.MapXml.InstructionList> mapxml_MethodBodies;
 		private Dictionary<MethodKey, IKVM.Internal.MapXml.ReplaceMethodCall[]> mapxml_ReplacedMethods;
 		private Dictionary<MethodKey, IKVM.Internal.MapXml.InstructionList> mapxml_MethodPrologues;
-		private Dictionary<string, string> baseClasses;
 		private IKVM.Internal.MapXml.Root map;
 		private List<object> assemblyAnnotations;
 		private List<string> classesToCompile;
@@ -74,7 +73,7 @@ namespace IKVM.Internal
 		private List<string> jarList = new List<string>();
 		private List<TypeWrapper> allwrappers;
 
-		internal CompilerClassLoader(AssemblyClassLoader[] referencedAssemblies, CompilerOptions options, FileInfo assemblyPath, bool targetIsModule, string assemblyName, Dictionary<string, JarItemReference> classes)
+		internal CompilerClassLoader(AssemblyClassLoader[] referencedAssemblies, CompilerOptions options, FileInfo assemblyPath, bool targetIsModule, string assemblyName, Dictionary<string, Jar.Item> classes)
 			: base(options.codegenoptions, null)
 		{
 			this.referencedAssemblies = referencedAssemblies;
@@ -99,10 +98,7 @@ namespace IKVM.Internal
 
 		internal void AddReference(AssemblyClassLoader acl)
 		{
-			AssemblyClassLoader[] temp = new AssemblyClassLoader[referencedAssemblies.Length + 1];
-			Array.Copy(referencedAssemblies, 0, temp, 0, referencedAssemblies.Length);
-			temp[temp.Length - 1] = acl;
-			referencedAssemblies = temp;
+			referencedAssemblies = ArrayUtil.Concat(referencedAssemblies, acl);
 		}
 
 		internal void AddReference(CompilerClassLoader ccl)
@@ -172,7 +168,10 @@ namespace IKVM.Internal
 			string mainAssemblyName = options.sharedclassloader != null && options.sharedclassloader[0] != this
 				? options.sharedclassloader[0].assemblyName
 				: assemblyName;
-			AttributeHelper.SetInternalsVisibleToAttribute(assemblyBuilder, mainAssemblyName + DynamicClassLoader.DynamicAssemblySuffixAndPublicKey);
+			if(!DisableDynamicBinding)
+			{
+				AttributeHelper.SetInternalsVisibleToAttribute(assemblyBuilder, mainAssemblyName + DynamicClassLoader.DynamicAssemblySuffixAndPublicKey);
+			}
 			return moduleBuilder;
 		}
 
@@ -272,11 +271,10 @@ namespace IKVM.Internal
 			}
 			else
 			{
-				JarItemReference itemRef;
+				Jar.Item itemRef;
 				if(classes.TryGetValue(name, out itemRef))
 				{
 					classes.Remove(name);
-					JarItem classdef = itemRef.Jar.Items[itemRef.Index];
 					ClassFile f;
 					try
 					{
@@ -285,7 +283,8 @@ namespace IKVM.Internal
 						{
 							cfp |= ClassFileParseOptions.LineNumberTable;
 						}
-						f = new ClassFile(classdef.data, 0, classdef.data.Length, name, cfp);
+						byte[] buf = itemRef.GetData();
+						f = new ClassFile(buf, 0, buf.Length, name, cfp);
 					}
 					catch(ClassFormatError x)
 					{
@@ -330,22 +329,12 @@ namespace IKVM.Internal
 							f.SetInternal();
 						}
 					}
-					if(!f.IsInterface
-						&& !f.IsAbstract
-						&& !f.IsPublic
-						&& !f.IsInternal
-						&& !f.IsFinal
-						&& !baseClasses.ContainsKey(f.Name)
-						&& !options.targetIsModule
-						&& options.sharedclassloader == null)
-					{
-						f.SetEffectivelyFinal();
-					}
 					if(f.SourceFileAttribute != null)
 					{
-						if(classdef.path != null)
+						FileInfo path = itemRef.Path;
+						if(path != null)
 						{
-							string sourceFile = Path.GetFullPath(Path.Combine(classdef.path.DirectoryName, f.SourceFileAttribute));
+							string sourceFile = Path.GetFullPath(Path.Combine(path.DirectoryName, f.SourceFileAttribute));
 							if(File.Exists(sourceFile))
 							{
 								f.SourcePath = sourceFile;
@@ -370,9 +359,14 @@ namespace IKVM.Internal
 					{
 						TypeWrapper tw = DefineClass(f, null);
 						// we successfully created the type, so we don't need to include the class as a resource
-						itemRef.Jar.Items[itemRef.Index] = options.nojarstubs
-							? new JarItem()	// null entry
-							: new JarItem(itemRef.Jar.Items[itemRef.Index].zipEntry, null, null); // create a stub class pseudo resource
+						if (options.nojarstubs)
+						{
+							itemRef.Remove();
+						}
+						else
+						{
+							itemRef.MarkAsStub();
+						}
 						return tw;
 					}
 					catch (ClassFormatError x)
@@ -687,11 +681,11 @@ namespace IKVM.Internal
 						ccl.AddWildcardExports(exportedNamesPerAssembly);
 						foreach (Jar jar in ccl.options.jars)
 						{
-							foreach (JarItem item in jar.Items)
+							foreach (Jar.Item item in jar)
 							{
-								if (item.zipEntry != null && item.data != null)
+								if (!item.IsStub)
 								{
-									AddExportMapEntry(exportedNamesPerAssembly, ccl, item.zipEntry.Name);
+									AddExportMapEntry(exportedNamesPerAssembly, ccl, item.Name);
 								}
 							}
 						}
@@ -749,34 +743,25 @@ namespace IKVM.Internal
 					}
 					zip.SetLevel(9);
 					List<string> stubs = new List<string>();
-					foreach (JarItem item in options.jars[i].Items)
+					foreach (Jar.Item item in options.jars[i])
 					{
-						if (item.zipEntry == null)
-						{
-							continue;
-						}
-						if (item.data == null)
+						if (item.IsStub)
 						{
 							// we don't want stub class pseudo resources for classes loaded from the file system
 							if (i != options.classesJar)
 							{
-								stubs.Add(item.zipEntry.Name);
+								stubs.Add(item.Name);
 							}
 							continue;
 						}
-						ZipEntry zipEntry = new ZipEntry(item.zipEntry.Name);
-						zipEntry.Comment = item.zipEntry.Comment;
-						zipEntry.CompressionMethod = item.zipEntry.CompressionMethod;
-						zipEntry.DosTime = item.zipEntry.DosTime;
-						zipEntry.ExternalFileAttributes = item.zipEntry.ExternalFileAttributes;
-						zipEntry.ExtraData = item.zipEntry.ExtraData;
-						zipEntry.Flags = item.zipEntry.Flags;
+						ZipEntry zipEntry = item.ZipEntry;
 						if (options.compressedResources || zipEntry.CompressionMethod != CompressionMethod.Stored)
 						{
 							zipEntry.CompressionMethod = CompressionMethod.Deflated;
 						}
 						zip.PutNextEntry(zipEntry);
-						zip.Write(item.data, 0, item.data.Length);
+						byte[] data = item.GetData();
+						zip.Write(data, 0, data.Length);
 						zip.CloseEntry();
 						hasEntries = true;
 					}
@@ -1293,10 +1278,7 @@ namespace IKVM.Internal
 						if(specialCases != null)
 						{
 							CodeEmitter ilgen;
-							Type[] temp = typeWrapper.GetClassLoader().ArgTypeListFromSig(m.Sig);
-							Type[] argTypes = new Type[temp.Length + 1];
-							temp.CopyTo(argTypes, 1);
-							argTypes[0] = typeWrapper.shadowType;
+							Type[] argTypes = ArrayUtil.Concat(typeWrapper.shadowType, typeWrapper.GetClassLoader().ArgTypeListFromSig(m.Sig));
 							if(typeWrapper.helperTypeBuilder == null)
 							{
 								typeWrapper.helperTypeBuilder = typeWrapper.typeBuilder.DefineNestedType("__Helper", TypeAttributes.NestedPublic | TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.Abstract);
@@ -1434,10 +1416,7 @@ namespace IKVM.Internal
 								attr &= ~MethodAttributes.MemberAccessMask;
 								attr |= MethodAttributes.Assembly;
 							}
-							Type[] exParamTypes = new Type[paramTypes.Length + 1];
-							Array.Copy(paramTypes, 0, exParamTypes, 1, paramTypes.Length);
-							exParamTypes[0] = typeWrapper.shadowType;
-							mbHelper = typeWrapper.typeBuilder.DefineMethod("instancehelper_" + m.Name, attr, CallingConventions.Standard, retType, exParamTypes);
+							mbHelper = typeWrapper.typeBuilder.DefineMethod("instancehelper_" + m.Name, attr, CallingConventions.Standard, retType, ArrayUtil.Concat(typeWrapper.shadowType, paramTypes));
 							if(m.Attributes != null)
 							{
 								foreach(IKVM.Internal.MapXml.Attribute custattr in m.Attributes)
@@ -1689,10 +1668,8 @@ namespace IKVM.Internal
 					if(m.nonvirtualAlternateBody != null || (m. at override != null && overriders.Count > 0))
 					{
 						RemapperTypeWrapper typeWrapper = (RemapperTypeWrapper)DeclaringType;
-						Type[] argTypes = new Type[paramTypes.Length + 1];
-						argTypes[0] = typeWrapper.TypeAsSignatureType;
-						this.GetParametersForDefineMethod().CopyTo(argTypes, 1);
-						MethodBuilder mb = typeWrapper.typeBuilder.DefineMethod("nonvirtualhelper/" + this.Name, MethodAttributes.Private | MethodAttributes.Static, this.ReturnTypeForDefineMethod, argTypes);
+						MethodBuilder mb = typeWrapper.typeBuilder.DefineMethod("nonvirtualhelper/" + this.Name, MethodAttributes.Private | MethodAttributes.Static,
+							ReturnTypeForDefineMethod, ArrayUtil.Concat(typeWrapper.TypeAsSignatureType, GetParametersForDefineMethod()));
 						if(m.Attributes != null)
 						{
 							foreach(IKVM.Internal.MapXml.Attribute custattr in m.Attributes)
@@ -2734,13 +2711,13 @@ namespace IKVM.Internal
 			List<object> assemblyAnnotations = new List<object>();
 			Tracer.Info(Tracer.Compiler, "Parsing class files");
 			// map the class names to jar entries
-			Dictionary<string, JarItemReference> h = new Dictionary<string, JarItemReference>();
+			Dictionary<string, Jar.Item> h = new Dictionary<string, Jar.Item>();
 			List<string> classNames = new List<string>();
 			foreach (Jar jar in options.jars)
 			{
-				for (int i = 0; i < jar.Items.Count; i++)
+				foreach (Jar.Item item in jar)
 				{
-					string name = jar.Items[i].zipEntry.Name;
+					string name = item.Name;
 					if (name.EndsWith(".class", StringComparison.Ordinal)
 						&& name.Length > 6
 						&& name.IndexOf('.') == name.Length - 6)
@@ -2749,14 +2726,14 @@ namespace IKVM.Internal
 						if (options.IsExcludedClass(className))
 						{
 							// we don't compile the class and we also don't include it as a resource
-							jar.Items[i] = new JarItem();
+							item.Remove();
 						}
 						else
 						{
 							if (h.ContainsKey(className))
 							{
 								StaticCompiler.IssueMessage(Message.DuplicateClassName, className);
-								JarItemReference itemRef = h[className];
+								Jar.Item itemRef = h[className];
 								if ((options.classesJar != -1 && itemRef.Jar == options.jars[options.classesJar]) || jar != itemRef.Jar)
 								{
 									// the previous class stays, because it was either in an earlier jar or we're processing the classes.jar
@@ -2770,52 +2747,59 @@ namespace IKVM.Internal
 									classNames.Remove(className);
 								}
 							}
-							h.Add(className, new JarItemReference(jar, i));
+							h.Add(className, item);
 							classNames.Add(className);
 						}
 					}
 				}
 			}
-			// now process all the classes to record the classes that are used as base classes and
-			// to look for assembly attribute annotations and the main method
-			Dictionary<string, string> baseClasses = new Dictionary<string, string>();
-			foreach (string className in classNames)
+
+			// look for "assembly" type that acts as a placeholder for assembly attributes
+			Jar.Item assemblyType;
+			if (h.TryGetValue("assembly", out assemblyType))
 			{
 				try
 				{
-					JarItemReference itemRef = h[className];
-					byte[] buf = itemRef.Jar.Items[itemRef.Index].data;
+					byte[] buf = assemblyType.GetData();
 					ClassFile f = new ClassFile(buf, 0, buf.Length, null, ClassFileParseOptions.None);
-					if (!f.IsInterface && f.SuperClass != null)
-					{
-						baseClasses[f.SuperClass] = f.SuperClass;
-					}
 					// NOTE the "assembly" type in the unnamed package is a magic type
 					// that acts as the placeholder for assembly attributes
-					if (className == f.Name && f.Name == "assembly" && f.Annotations != null)
+					if (f.Name == "assembly" && f.Annotations != null)
 					{
 						assemblyAnnotations.AddRange(f.Annotations);
 						// HACK remove "assembly" type that exists only as a placeholder for assembly attributes
 						h.Remove(f.Name);
-						itemRef.Jar.Items[itemRef.Index] = new JarItem();
-						continue;
+						assemblyType.Remove();
 					}
-					if (options.mainClass == null && (options.guessFileKind || options.target != PEFileKinds.Dll))
+				}
+				catch (ClassFormatError) { }
+			}
+
+			// now look for a main method
+			if (options.mainClass == null && (options.guessFileKind || options.target != PEFileKinds.Dll))
+			{
+				foreach (string className in classNames)
+				{
+					try
 					{
-						foreach (ClassFile.Method m in f.Methods)
+						byte[] buf = h[className].GetData();
+						ClassFile f = new ClassFile(buf, 0, buf.Length, null, ClassFileParseOptions.None);
+						if (f.Name == className)
 						{
-							if (m.IsPublic && m.IsStatic && m.Name == "main" && m.Signature == "([Ljava.lang.String;)V")
+							foreach (ClassFile.Method m in f.Methods)
 							{
-								StaticCompiler.IssueMessage(Message.MainMethodFound, f.Name);
-								options.mainClass = f.Name;
-								break;
+								if (m.IsPublic && m.IsStatic && m.Name == "main" && m.Signature == "([Ljava.lang.String;)V")
+								{
+									StaticCompiler.IssueMessage(Message.MainMethodFound, f.Name);
+									options.mainClass = f.Name;
+									goto break_outer;
+								}
 							}
 						}
 					}
+					catch (ClassFormatError) { }
 				}
-				catch (ClassFormatError)
-				{
-				}
+			break_outer: ;
 			}
 
 			if(options.guessFileKind && options.mainClass == null)
@@ -2880,7 +2864,6 @@ namespace IKVM.Internal
 				referencedAssemblies[i] = acl;
 			}
 			loader = new CompilerClassLoader(referencedAssemblies, options, options.path, options.targetIsModule, options.assembly, h);
-			loader.baseClasses = baseClasses;
 			loader.assemblyAnnotations = assemblyAnnotations;
 			loader.classesToCompile = new List<string>(h.Keys);
 			if(options.remapfile != null)
@@ -3333,7 +3316,7 @@ namespace IKVM.Internal
 	{
 		internal readonly string Name;
 		internal readonly string Comment;
-		internal readonly List<JarItem> Items = new List<JarItem>();
+		private readonly List<JarItem> Items = new List<JarItem>();
 
 		internal Jar(string name, string comment)
 		{
@@ -3359,31 +3342,111 @@ namespace IKVM.Internal
 			zipEntry.CompressionMethod = CompressionMethod.Stored;
 			Items.Add(new JarItem(zipEntry, data, fileInfo));
 		}
-	}
 
-	struct JarItem
-	{
-		internal readonly ZipEntry zipEntry;
-		internal readonly byte[] data;
-		internal readonly FileInfo path;			// path of the original file, if it was individual file (used to construct source file path)
+		private struct JarItem
+		{
+			internal readonly ZipEntry zipEntry;
+			internal readonly byte[] data;
+			internal readonly FileInfo path;			// path of the original file, if it was individual file (used to construct source file path)
 
-		internal JarItem(ZipEntry zipEntry, byte[] data, FileInfo path)
+			internal JarItem(ZipEntry zipEntry, byte[] data, FileInfo path)
+			{
+				this.zipEntry = zipEntry;
+				this.data = data;
+				this.path = path;
+			}
+		}
+
+		public struct Item
 		{
-			this.zipEntry = zipEntry;
-			this.data = data;
-			this.path = path;
+			internal readonly Jar Jar;
+			private readonly int Index;
+
+			internal Item(Jar jar, int index)
+			{
+				this.Jar = jar;
+				this.Index = index;
+			}
+
+			internal string Name
+			{
+				get { return Jar.Items[Index].zipEntry.Name; }
+			}
+
+			internal byte[] GetData()
+			{
+				return Jar.Items[Index].data;
+			}
+
+			internal FileInfo Path
+			{
+				get { return Jar.Items[Index].path; }
+			}
+
+			internal ZipEntry ZipEntry
+			{
+				get
+				{
+					ZipEntry org = Jar.Items[Index].zipEntry;
+					ZipEntry zipEntry = new ZipEntry(org.Name);
+					zipEntry.Comment = org.Comment;
+					zipEntry.CompressionMethod = org.CompressionMethod;
+					zipEntry.DosTime = org.DosTime;
+					zipEntry.ExternalFileAttributes = org.ExternalFileAttributes;
+					zipEntry.ExtraData = org.ExtraData;
+					zipEntry.Flags = org.Flags;
+					return zipEntry;
+				}
+			}
+
+			internal void Remove()
+			{
+				Jar.Items[Index] = new JarItem();
+			}
+
+			internal void MarkAsStub()
+			{
+				Jar.Items[Index] = new JarItem(Jar.Items[Index].zipEntry, null, null);
+			}
+
+			internal bool IsStub
+			{
+				get { return Jar.Items[Index].data == null; }
+			}
 		}
-	}
 
-	struct JarItemReference
-	{
-		internal readonly Jar Jar;
-		internal readonly int Index;
+		internal struct JarEnumerator
+		{
+			private readonly Jar jar;
+			private int index;
+
+			internal JarEnumerator(Jar jar)
+			{
+				this.jar = jar;
+				this.index = -1;
+			}
 
-		internal JarItemReference(Jar jar, int index)
+			public Item Current
+			{
+				get { return new Item(jar, index); }
+			}
+
+			public bool MoveNext()
+			{
+				while (index + 1 < jar.Items.Count)
+				{
+					if (jar.Items[++index].zipEntry != null)
+					{
+						return true;
+					}
+				}
+				return false;
+			}
+		}
+
+		public JarEnumerator GetEnumerator()
 		{
-			this.Jar = jar;
-			this.Index = index;
+			return new JarEnumerator(this);
 		}
 	}
 
@@ -3572,6 +3635,7 @@ namespace IKVM.Internal
 		UnableToResolveType = 133,
 		StubsAreDeprecated = 134,
 		WrongClassName = 135,
+		ReflectionCallerClassRequiresCallerID = 136,
 		UnknownWarning = 999,
 		// This is where the errors start
 		StartErrors = 4000,
@@ -3590,6 +3654,7 @@ namespace IKVM.Internal
 		NonPrimaryAssemblyReference = 4013,
 		MissingType = 4014,
 		MissingReference = 4015,
+		CallerSensitiveOnUnsupportedMethod = 4016,
 		// Fatal errors
 		ResponseFileDepthExceeded = 5000,
 		ErrorReadingFile = 5001,
@@ -3651,7 +3716,7 @@ namespace IKVM.Internal
 
 	static class StaticCompiler
 	{
-		internal static readonly Universe Universe = new Universe(UniverseOptions.ResolveMissingMembers);
+		internal static readonly Universe Universe = new Universe(UniverseOptions.ResolveMissingMembers | UniverseOptions.EnableFunctionPointers);
 		internal static Assembly runtimeAssembly;
 		internal static Assembly runtimeJniAssembly;
 		internal static CompilerOptions toplevel;
@@ -3904,6 +3969,10 @@ namespace IKVM.Internal
 				case Message.WrongClassName:
 					msg = "Unable to compile \"{0}\" (wrong name: \"{1}\")";
 					break;
+				case Message.ReflectionCallerClassRequiresCallerID:
+					msg = "Reflection.getCallerClass() called from non-CallerID method" + Environment.NewLine +
+						"    (\"{0}.{1}{2}\")";
+					break;
 				case Message.UnableToCreateProxy:
 					msg = "Unable to create proxy \"{0}\"" + Environment.NewLine +
 						"    (\"{1}\")";
@@ -3944,6 +4013,10 @@ namespace IKVM.Internal
 				case Message.UnknownWarning:
 					msg = "{0}";
 					break;
+				case Message.CallerSensitiveOnUnsupportedMethod:
+					msg = "CallerSensitive annotation on unsupported method" + Environment.NewLine +
+						"    (\"{0}.{1}{2}\")";
+					break;
 				default:
 					throw new InvalidProgramException();
 			}
diff --git a/external/ikvm/ikvmstub/ikvmstub.cs b/external/ikvm/ikvmstub/ikvmstub.cs
index 71446c9..5f882ca 100644
--- a/external/ikvm/ikvmstub/ikvmstub.cs
+++ b/external/ikvm/ikvmstub/ikvmstub.cs
@@ -40,6 +40,7 @@ static class NetExp
 	private static bool includeSerialVersionUID;
 	private static bool includeNonPublicInterfaces;
 	private static bool includeNonPublicMembers;
+	private static bool includeParameterNames;
 	private static List<string> namespaces = new List<string>();
 
 	static int Main(string[] args)
@@ -106,6 +107,10 @@ static class NetExp
 				{
 					forwarders = true;
 				}
+				else if(s == "-parameters")
+				{
+					includeParameterNames = true;
+				}
 				else
 				{
 					// unrecognized option, or multiple assemblies, print usage message and exit
@@ -134,6 +139,7 @@ static class NetExp
 			Console.Error.WriteLine("    -lib:<dir>                 Additional directories to search for references");
 			Console.Error.WriteLine("    -namespace:<ns>            Only include types from specified namespace");
 			Console.Error.WriteLine("    -forwarders                Export forwarded types too");
+			Console.Error.WriteLine("    -parameters                Emit Java 8 classes with parameter names");
 			return 1;
 		}
 		if(File.Exists(assemblyNameOrPath) && nostdlib)
@@ -323,7 +329,7 @@ static class NetExp
 	{
 		zipCount++;
 		MemoryStream mem = new MemoryStream();
-		IKVM.StubGen.StubGenerator.WriteClass(mem, tw, includeNonPublicInterfaces, includeNonPublicMembers, includeSerialVersionUID);
+		IKVM.StubGen.StubGenerator.WriteClass(mem, tw, includeNonPublicInterfaces, includeNonPublicMembers, includeSerialVersionUID, includeParameterNames);
 		ZipEntry entry = new ZipEntry(tw.Name.Replace('.', '/') + ".class");
 		entry.Size = mem.Position;
 		zipFile.PutNextEntry(entry);
@@ -387,6 +393,7 @@ static class NetExp
 					try
 					{
 						ProcessClass(c);
+						WriteClass(c);
 					}
 					catch (Exception x)
 					{
@@ -400,7 +407,6 @@ static class NetExp
 							throw;
 						}
 					}
-					WriteClass(c);
 				}
 			}
 		} while(keepGoing);
@@ -497,7 +503,7 @@ static class Intrinsics
 
 static class StaticCompiler
 {
-	internal static readonly Universe Universe = new Universe();
+	internal static readonly Universe Universe = new Universe(UniverseOptions.EnableFunctionPointers);
 	internal static readonly AssemblyResolver Resolver = new AssemblyResolver();
 	internal static Assembly runtimeAssembly;
 
diff --git a/external/ikvm/openjdk/FORKED b/external/ikvm/openjdk/FORKED
new file mode 100644
index 0000000..64e8faf
--- /dev/null
+++ b/external/ikvm/openjdk/FORKED
@@ -0,0 +1,132 @@
+#
+# IKVM.NET Forked OpenJDK Files
+#
+# This file list all forked OpenJDK files in their original OpenJDK location and their forked ikvm/openjdk location.
+# Each line not starting with # contains a mapping: <original>=<forked>
+#
+build/linux-amd64/gensrc/sun/misc/Version.java=sun/misc/Version.java
+build/linux-amd64/gensrc/sun/nio/ch/SocketOptionRegistry.java=sun/nio/ch/SocketOptionRegistry.java
+build/linux-amd64/gensrc/sun/nio/cs/StandardCharsets.java=sun/nio/cs/StandardCharsets.java
+jdk/src/macosx/classes/java/lang/ClassLoaderHelper.java=java/lang/ClassLoaderHelper.java
+jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java=com/sun/imageio/plugins/jpeg/JPEGImageReader.java
+jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriter.java=com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
+jdk/src/share/classes/java/awt/Font.java=java/awt/Font.java
+jdk/src/share/classes/java/awt/GraphicsConfiguration.java=java/awt/GraphicsConfiguration.java
+jdk/src/share/classes/java/awt/Image.java=java/awt/Image.java
+jdk/src/share/classes/java/awt/image/BufferedImage.java=java/awt/image/BufferedImage.java
+jdk/src/share/classes/java/awt/image/DataBuffer.java=java/awt/image/DataBuffer.java
+jdk/src/share/classes/java/awt/image/DataBufferByte.java=java/awt/image/DataBufferByte.java
+jdk/src/share/classes/java/awt/image/DataBufferDouble.java=java/awt/image/DataBufferDouble.java
+jdk/src/share/classes/java/awt/image/DataBufferFloat.java=java/awt/image/DataBufferFloat.java
+jdk/src/share/classes/java/awt/image/DataBufferInt.java=java/awt/image/DataBufferInt.java
+jdk/src/share/classes/java/awt/image/DataBufferShort.java=java/awt/image/DataBufferShort.java
+jdk/src/share/classes/java/awt/image/DataBufferUShort.java=java/awt/image/DataBufferUShort.java
+jdk/src/share/classes/java/awt/image/IndexColorModel.java=java/awt/image/IndexColorModel.java
+jdk/src/share/classes/java/io/FileInputStream.java=java/io/FileInputStream.java
+jdk/src/share/classes/java/io/FileOutputStream.java=java/io/FileOutputStream.java
+jdk/src/share/classes/java/io/ObjectStreamClass.java=java/io/ObjectStreamClass.java
+jdk/src/share/classes/java/io/ObjectStreamField.java=java/io/ObjectStreamField.java
+jdk/src/share/classes/java/io/RandomAccessFile.java=java/io/RandomAccessFile.java
+jdk/src/share/classes/java/lang/Class.java=java/lang/Class.java
+jdk/src/share/classes/java/lang/ClassLoader.java=java/lang/ClassLoader.java
+jdk/src/share/classes/java/lang/Enum.java=java/lang/Enum.java
+jdk/src/share/classes/java/lang/invoke/AdapterMethodHandle.java=java/lang/invoke/AdapterMethodHandle.java
+jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java=java/lang/invoke/BoundMethodHandle.java
+jdk/src/share/classes/java/lang/invoke/CallSite.java=java/lang/invoke/CallSite.java
+jdk/src/share/classes/java/lang/invoke/ConstantCallSite.java=java/lang/invoke/ConstantCallSite.java
+jdk/src/share/classes/java/lang/invoke/DirectMethodHandle.java=java/lang/invoke/DirectMethodHandle.java
+jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java=java/lang/invoke/MethodHandleImpl.java
+jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java=java/lang/invoke/MethodHandleNatives.java
+jdk/src/share/classes/java/lang/invoke/MethodHandles.java=java/lang/invoke/MethodHandles.java
+jdk/src/share/classes/java/lang/invoke/MutableCallSite.java=java/lang/invoke/MutableCallSite.java
+jdk/src/share/classes/java/lang/invoke/VolatileCallSite.java=java/lang/invoke/VolatileCallSite.java
+jdk/src/share/classes/java/lang/management/PlatformComponent.java=java/lang/management/PlatformComponent.java
+jdk/src/share/classes/java/lang/Package.java=java/lang/Package.java
+jdk/src/share/classes/java/lang/ref/SoftReference.java=java/lang/ref/SoftReference.java
+jdk/src/share/classes/java/lang/reflect/Constructor.java=java/lang/reflect/Constructor.java
+jdk/src/share/classes/java/lang/reflect/Field.java=java/lang/reflect/Field.java
+jdk/src/share/classes/java/lang/reflect/Method.java=java/lang/reflect/Method.java
+jdk/src/share/classes/java/lang/reflect/Proxy.java=java/lang/reflect/Proxy.java
+jdk/src/share/classes/java/lang/Shutdown.java=java/lang/Shutdown.java
+jdk/src/share/classes/java/lang/String.java=java/lang/StringHelper.java
+jdk/src/share/classes/java/lang/System.java=java/lang/System.java
+jdk/src/share/classes/java/lang/Thread.java=java/lang/Thread.java
+jdk/src/share/classes/java/lang/Throwable.java=java/lang/ThrowableHelper.java
+jdk/src/share/classes/java/net/SocketInputStream.java=java/net/SocketInputStream.java
+jdk/src/share/classes/java/net/SocketOutputStream.java=java/net/SocketOutputStream.java
+jdk/src/share/classes/java/nio/Bits.java=java/nio/Bits.java
+jdk/src/share/classes/java/security/AccessController.java=java/security/AccessController.java
+jdk/src/share/classes/java/security/ProtectionDomain.java=java/security/ProtectionDomain.java
+jdk/src/share/classes/java/sql/DriverManager.java=java/sql/DriverManager.java
+jdk/src/share/classes/java/util/concurrent/atomic/AtomicBoolean.java=../classpath/java/util/concurrent/atomic/AtomicBoolean.java
+jdk/src/share/classes/java/util/concurrent/atomic/AtomicInteger.java=../classpath/java/util/concurrent/atomic/AtomicInteger.java
+jdk/src/share/classes/java/util/concurrent/atomic/AtomicIntegerArray.java=../classpath/java/util/concurrent/atomic/AtomicIntegerArray.java
+jdk/src/share/classes/java/util/concurrent/atomic/AtomicLong.java=../classpath/java/util/concurrent/atomic/AtomicLong.java
+jdk/src/share/classes/java/util/concurrent/atomic/AtomicLongArray.java=../classpath/java/util/concurrent/atomic/AtomicLongArray.java
+jdk/src/share/classes/java/util/concurrent/atomic/AtomicReference.java=../classpath/java/util/concurrent/atomic/AtomicReference.java
+jdk/src/share/classes/java/util/concurrent/atomic/AtomicReferenceArray.java=../classpath/java/util/concurrent/atomic/AtomicReferenceArray.java
+jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java=java/util/concurrent/locks/AbstractQueuedSynchronizer.java
+jdk/src/share/classes/java/util/concurrent/locks/LockSupport.java=java/util/concurrent/locks/LockSupport.java
+jdk/src/share/classes/java/util/ResourceBundle.java=java/util/ResourceBundle.java
+jdk/src/share/classes/java/util/TimeZone.java=java/util/TimeZone.java
+jdk/src/share/classes/sun/awt/AppContext.java=sun/awt/AppContext.java
+jdk/src/share/classes/sun/awt/EmbeddedFrame.java=sun/awt/EmbeddedFrame.java
+jdk/src/share/classes/sun/awt/image/ByteInterleavedRaster.java=sun/awt/image/ByteInterleavedRaster.java
+jdk/src/share/classes/sun/awt/image/ImagingLib.java=sun/awt/image/ImagingLib.java
+jdk/src/share/classes/sun/awt/image/IntegerInterleavedRaster.java=sun/awt/image/IntegerInterleavedRaster.java
+jdk/src/share/classes/sun/awt/image/SunWritableRaster.java=sun/awt/image/SunWritableRaster.java
+jdk/src/share/classes/sun/awt/image/ToolkitImage.java=sun/awt/image/ToolkitImage.java
+jdk/src/share/classes/sun/awt/SunToolkit.java=sun/awt/SunToolkit.java
+jdk/src/share/classes/sun/font/FontManager.java=sun/font/FontManager.java
+jdk/src/share/classes/sun/font/StrikeCache.java=sun/font/StrikeCache.java
+jdk/src/share/classes/sun/management/GcInfoBuilder.java=sun/management/GcInfoBuilder.java
+jdk/src/share/classes/sun/management/ManagementFactoryHelper.java=sun/management/ManagementFactoryHelper.java
+jdk/src/share/classes/sun/management/VMManagementImpl.java=sun/management/VMManagementImpl.java
+jdk/src/share/classes/sun/misc/IoTrace.java=sun/misc/IoTrace.java
+jdk/src/share/classes/sun/misc/JavaAWTAccess.java=sun/misc/JavaAWTAccess.java
+jdk/src/share/classes/sun/misc/SharedSecrets.java=sun/misc/SharedSecrets.java
+jdk/src/share/classes/sun/misc/VM.java=sun/misc/VM.java
+jdk/src/share/classes/sun/net/sdp/SdpSupport.java=sun/net/sdp/SdpSupport.java
+jdk/src/share/classes/sun/net/www/protocol/file/FileURLConnection.java=sun/net/www/protocol/file/FileURLConnection.java
+jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java=sun/nio/ch/DatagramChannelImpl.java
+jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java=sun/nio/ch/FileChannelImpl.java
+jdk/src/share/classes/sun/nio/ch/IOUtil.java=sun/nio/ch/IOUtil.java
+jdk/src/share/classes/sun/nio/ch/NativeDispatcher.java=sun/nio/ch/NativeDispatcher.java
+jdk/src/share/classes/sun/nio/ch/Net.java=sun/nio/ch/Net.java
+jdk/src/share/classes/sun/nio/ch/Util.java=sun/nio/ch/Util.java
+jdk/src/share/classes/sun/reflect/CallerSensitive.java=sun/reflect/CallerSensitive.java
+jdk/src/share/classes/sun/reflect/MethodAccessor.java=sun/reflect/MethodAccessor.java
+jdk/src/share/classes/sun/reflect/misc/ReflectUtil.java=sun/reflect/misc/ReflectUtil.java
+jdk/src/share/classes/sun/reflect/Reflection.java=sun/reflect/Reflection.java
+jdk/src/share/classes/sun/reflect/ReflectionFactory.java=sun/reflect/ReflectionFactory.java
+jdk/src/solaris/classes/sun/nio/fs/UnixUriUtils.java=sun/nio/fs/UnixUriUtils.java
+jdk/src/windows/classes/java/io/FileDescriptor.java=java/io/FileDescriptor.java
+jdk/src/windows/classes/java/lang/ProcessImpl.java=java/lang/ProcessImpl.java
+jdk/src/windows/classes/java/net/DefaultDatagramSocketImplFactory.java=java/net/DefaultDatagramSocketImplFactory.java
+jdk/src/windows/classes/java/net/DualStackPlainDatagramSocketImpl.java=java/net/DualStackPlainDatagramSocketImpl.java
+jdk/src/windows/classes/java/net/DualStackPlainSocketImpl.java=java/net/DualStackPlainSocketImpl.java
+jdk/src/windows/classes/java/net/PlainSocketImpl.java=java/net/PlainSocketImpl.java
+jdk/src/windows/classes/java/net/TwoStacksPlainDatagramSocketImpl.java=java/net/TwoStacksPlainDatagramSocketImpl.java
+jdk/src/windows/classes/java/net/TwoStacksPlainSocketImpl.java=java/net/TwoStacksPlainSocketImpl.java
+jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java=sun/awt/shell/Win32ShellFolder2.java
+jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java=sun/awt/shell/Win32ShellFolderManager2.java
+jdk/src/windows/classes/sun/misc/FileURLMapper.java=sun/misc/FileURLMapper.java
+jdk/src/windows/classes/sun/net/dns/ResolverConfigurationImpl.java=sun/net/dns/ResolverConfigurationImpl.java
+jdk/src/windows/classes/sun/net/www/protocol/file/Handler.java=sun/net/www/protocol/file/Handler.java
+jdk/src/windows/classes/sun/net/www/protocol/jar/JarFileFactory.java=sun/net/www/protocol/jar/JarFileFactory.java
+jdk/src/windows/classes/sun/nio/ch/DefaultSelectorProvider.java=sun/nio/ch/DefaultSelectorProvider.java
+jdk/src/windows/classes/sun/nio/ch/FileDispatcherImpl.java=sun/nio/ch/FileDispatcherImpl.java
+jdk/src/windows/classes/sun/nio/ch/Iocp.java=sun/nio/ch/Iocp.java
+jdk/src/windows/classes/sun/nio/ch/PollArrayWrapper.java=sun/nio/ch/PollArrayWrapper.java
+jdk/src/windows/classes/sun/nio/ch/SocketDispatcher.java=sun/nio/ch/SocketDispatcher.java
+jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java=sun/nio/ch/WindowsAsynchronousFileChannelImpl.java
+jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousServerSocketChannelImpl.java=sun/nio/ch/WindowsAsynchronousServerSocketChannelImpl.java
+jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java=sun/nio/ch/WindowsAsynchronousSocketChannelImpl.java
+jdk/src/windows/classes/sun/nio/fs/WindowsUriSupport.java=sun/nio/fs/WindowsUriSupport.java
+jdk/src/windows/classes/sun/print/Win32PrintJob.java=sun/print/Win32PrintJob.java
+jdk/src/windows/classes/sun/print/Win32PrintService.java=sun/print/Win32PrintService.java
+jdk/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c=java/net/DualStackPlainDatagramSocketImpl_c.java
+jdk/src/windows/native/java/net/DualStackPlainSocketImpl.c=java/net/DualStackPlainSocketImpl_c.java
+jdk/src/windows/native/java/net/net_util_md.c=java/net/net_util_md.java
+jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c=java/net/TwoStacksPlainDatagramSocketImpl_c.java
+jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c=java/net/TwoStacksPlainSocketImpl_c.java
diff --git a/external/ikvm/openjdk/allsources.lst b/external/ikvm/openjdk/allsources.lst
index 5df16cb..533d764 100644
--- a/external/ikvm/openjdk/allsources.lst
+++ b/external/ikvm/openjdk/allsources.lst
@@ -4,7 +4,6 @@
 ../classpath/ikvm/internal/AssemblyClassLoader.java
 ../classpath/ikvm/internal/CallerID.java
 ../classpath/ikvm/internal/Formatter.java
-../classpath/ikvm/internal/HasCallerID.java
 ../classpath/ikvm/internal/JMath.java
 ../classpath/ikvm/internal/MonoUtils.java
 ../classpath/ikvm/internal/Util.java
@@ -32,9 +31,7 @@
 ../classpath/sun/misc/Ref.java
 AssemblyInfo.java
 com/sun/imageio/plugins/jpeg/JPEGImageReader.java
-com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java
 com/sun/imageio/plugins/jpeg/JPEGImageWriter.java
-com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java
 com/sun/management/OperatingSystem.java
 gnu/java/awt/Buffers.java
 gnu/java/awt/color/CieXyzConverter.java
@@ -67,6 +64,13 @@ java/awt/image/BandCombineOp.java
 java/awt/image/BufferedImage.java
 java/awt/image/ConvolveOp.java
 java/awt/image/ColorConvertOp.java
+java/awt/image/DataBuffer.java
+java/awt/image/DataBufferByte.java
+java/awt/image/DataBufferDouble.java
+java/awt/image/DataBufferFloat.java
+java/awt/image/DataBufferInt.java
+java/awt/image/DataBufferShort.java
+java/awt/image/DataBufferUShort.java
 java/awt/image/IndexColorModel.java
 java/awt/image/LookupOp.java
 java/awt/image/RescaleOp.java
@@ -94,6 +98,7 @@ java/lang/invoke/MutableCallSite.java
 java/lang/invoke/VolatileCallSite.java
 java/lang/LangHelper.java
 java/lang/management/PlatformComponent.java
+java/lang/Package.java
 java/lang/ProcessImpl.java
 java/lang/PropertyConstants.java
 java/lang/ref/Reference.java
@@ -148,19 +153,15 @@ java/util/zip/StreamManipulator.java
 java/util/zip/ZipEntry.java
 java/util/zip/ZipFile.java
 sun/awt/AppContext.java
-sun/awt/AppContextDC.java
 sun/awt/EmbeddedFrame.java
 sun/awt/IkvmDataTransferer.java
-sun/awt/image/ByteComponentRaster.java
-sun/awt/image/BytePackedRaster.java
+sun/awt/image/ByteInterleavedRaster.java
 sun/awt/image/GifImageDecoder.java
 sun/awt/image/IkvmImageDecoder.java
 sun/awt/image/ImageRepresentation.java
 sun/awt/image/ImagingLib.java
-sun/awt/image/IntegerComponentRaster.java
+sun/awt/image/IntegerInterleavedRaster.java
 sun/awt/image/JPEGImageDecoder.java
-sun/awt/image/OffScreenImageSource.java
-sun/awt/image/ShortComponentRaster.java
 sun/awt/image/SunWritableRaster.java
 sun/awt/image/ToolkitImage.java
 sun/awt/shell/Win32ShellFolder2.java
@@ -203,6 +204,8 @@ sun/management/GcInfoBuilder.java
 sun/management/ManagementFactoryHelper.java
 sun/management/VMManagementImpl.java
 sun/misc/FileURLMapper.java
+sun/misc/IoTrace.java
+sun/misc/JavaAWTAccess.java
 sun/misc/MiscHelper.java
 sun/misc/OSEnvironment.java
 sun/misc/SharedSecrets.java
@@ -246,9 +249,11 @@ sun/print/UnixPrintServiceLookup.java
 sun/print/Win32PrintJob.java
 sun/print/Win32PrintService.java
 sun/print/Win32PrintServiceLookup.java
+sun/reflect/CallerSensitive.java
 sun/reflect/MethodAccessor.java
 sun/reflect/Reflection.java
 sun/reflect/ReflectionFactory.java
+sun/reflect/misc/ReflectUtil.java
 sun/security/jgss/wrapper/NativeGSSFactory.java
 sun/security/jgss/wrapper/SunNativeProvider.java
 @OPENJDK7@/build/linux-amd64/gensrc/com/sun/accessibility/internal/resources/accessibility.java
@@ -7451,6 +7456,8 @@ sun/security/jgss/wrapper/SunNativeProvider.java
 @OPENJDK7@/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFWritableImageMetadata.java
 @OPENJDK7@/jdk/src/share/classes/com/sun/imageio/plugins/gif/GIFWritableStreamMetadata.java
 @OPENJDK7@/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEG.java
+ at OPENJDK7@/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java
+ at OPENJDK7@/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java
 @OPENJDK7@/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageReader.java
 @OPENJDK7@/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageReaderSpi.java
 @OPENJDK7@/jdk/src/share/classes/com/sun/imageio/plugins/png/PNGImageWriter.java
@@ -8572,13 +8579,6 @@ sun/security/jgss/wrapper/SunNativeProvider.java
 @OPENJDK7@/jdk/src/share/classes/java/awt/image/ComponentColorModel.java
 @OPENJDK7@/jdk/src/share/classes/java/awt/image/ComponentSampleModel.java
 @OPENJDK7@/jdk/src/share/classes/java/awt/image/CropImageFilter.java
- at OPENJDK7@/jdk/src/share/classes/java/awt/image/DataBuffer.java
- at OPENJDK7@/jdk/src/share/classes/java/awt/image/DataBufferByte.java
- at OPENJDK7@/jdk/src/share/classes/java/awt/image/DataBufferDouble.java
- at OPENJDK7@/jdk/src/share/classes/java/awt/image/DataBufferFloat.java
- at OPENJDK7@/jdk/src/share/classes/java/awt/image/DataBufferInt.java
- at OPENJDK7@/jdk/src/share/classes/java/awt/image/DataBufferShort.java
- at OPENJDK7@/jdk/src/share/classes/java/awt/image/DataBufferUShort.java
 @OPENJDK7@/jdk/src/share/classes/java/awt/image/DirectColorModel.java
 @OPENJDK7@/jdk/src/share/classes/java/awt/image/FilteredImageSource.java
 @OPENJDK7@/jdk/src/share/classes/java/awt/image/ImageConsumer.java
@@ -8972,7 +8972,6 @@ sun/security/jgss/wrapper/SunNativeProvider.java
 @OPENJDK7@/jdk/src/share/classes/java/lang/OutOfMemoryError.java
 @OPENJDK7@/jdk/src/share/classes/java/lang/Override.java
 @OPENJDK7@/jdk/src/share/classes/java/lang/package-info.java
- at OPENJDK7@/jdk/src/share/classes/java/lang/Package.java
 @OPENJDK7@/jdk/src/share/classes/java/lang/Process.java
 @OPENJDK7@/jdk/src/share/classes/java/lang/ProcessBuilder.java
 @OPENJDK7@/jdk/src/share/classes/java/lang/Readable.java
@@ -11395,7 +11394,8 @@ sun/security/jgss/wrapper/SunNativeProvider.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/BufferedImageGraphicsConfig.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/ByteArrayImageSource.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/ByteBandedRaster.java
- at OPENJDK7@/jdk/src/share/classes/sun/awt/image/ByteInterleavedRaster.java
+ at OPENJDK7@/jdk/src/share/classes/sun/awt/image/ByteComponentRaster.java
+ at OPENJDK7@/jdk/src/share/classes/sun/awt/image/BytePackedRaster.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/FileImageSource.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/ImageConsumerQueue.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/ImageDecoder.java
@@ -11404,10 +11404,13 @@ sun/security/jgss/wrapper/SunNativeProvider.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/ImageFormatException.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/ImageWatched.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/InputStreamImageSource.java
- at OPENJDK7@/jdk/src/share/classes/sun/awt/image/IntegerInterleavedRaster.java
+ at OPENJDK7@/jdk/src/share/classes/sun/awt/image/IntegerComponentRaster.java
+ at OPENJDK7@/jdk/src/share/classes/sun/awt/image/NativeLibLoader.java
+ at OPENJDK7@/jdk/src/share/classes/sun/awt/image/OffScreenImageSource.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/PixelConverter.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/PNGImageDecoder.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/ShortBandedRaster.java
+ at OPENJDK7@/jdk/src/share/classes/sun/awt/image/ShortComponentRaster.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/ShortInterleavedRaster.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/URLImageSource.java
 @OPENJDK7@/jdk/src/share/classes/sun/awt/image/VSyncedBSManager.java
@@ -12389,7 +12392,6 @@ sun/security/jgss/wrapper/SunNativeProvider.java
 @OPENJDK7@/jdk/src/share/classes/sun/reflect/misc/ConstructorUtil.java
 @OPENJDK7@/jdk/src/share/classes/sun/reflect/misc/FieldUtil.java
 @OPENJDK7@/jdk/src/share/classes/sun/reflect/misc/MethodUtil.java
- at OPENJDK7@/jdk/src/share/classes/sun/reflect/misc/ReflectUtil.java
 @OPENJDK7@/jdk/src/share/classes/sun/reflect/SignatureIterator.java
 @OPENJDK7@/jdk/src/share/classes/sun/rmi/log/LogHandler.java
 @OPENJDK7@/jdk/src/share/classes/sun/rmi/log/LogInputStream.java
diff --git a/external/ikvm/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java b/external/ikvm/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java
deleted file mode 100644
index 3b6c2e7..0000000
--- a/external/ikvm/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageReaderSpi.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.imageio.plugins.jpeg;
-
-import java.util.Locale;
-import javax.imageio.spi.ImageReaderSpi;
-import javax.imageio.stream.ImageInputStream;
-import javax.imageio.spi.IIORegistry;
-import javax.imageio.spi.ServiceRegistry;
-import java.io.IOException;
-import javax.imageio.ImageReader;
-import javax.imageio.IIOException;
-
-public class JPEGImageReaderSpi extends ImageReaderSpi {
-
-    private static String [] writerSpiNames =
-        {"com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi"};
-
-    private boolean registered = false;
-
-    public JPEGImageReaderSpi() {
-        super(JPEG.vendor,
-              JPEG.version,
-              JPEG.names,
-              JPEG.suffixes,
-              JPEG.MIMETypes,
-              "com.sun.imageio.plugins.jpeg.JPEGImageReader",
-              new Class[] { ImageInputStream.class },
-              writerSpiNames,
-              true,
-              JPEG.nativeStreamMetadataFormatName,
-              JPEG.nativeStreamMetadataFormatClassName,
-              null, null,
-              true,
-              JPEG.nativeImageMetadataFormatName,
-              JPEG.nativeImageMetadataFormatClassName,
-              null, null
-              );
-    }
-
-    public void onRegistration(ServiceRegistry registry,
-                               Class<?> category) {
-        if (registered) {
-            return;
-        }
-    /*
-        try {
-            java.security.AccessController.doPrivileged(
-                new sun.security.action.LoadLibraryAction("jpeg"));
-            // Stuff it all into one lib for first pass
-            //java.security.AccessController.doPrivileged(
-            //new sun.security.action.LoadLibraryAction("imageioIJG"));
-        } catch (Throwable e) { // Fail on any Throwable
-            // if it can't be loaded, deregister and return
-            registry.deregisterServiceProvider(this);
-            return;
-        }
-     */
-
-        registered = true;
-    }
-
-    public String getDescription(Locale locale) {
-        return "Standard JPEG Image Reader";
-    }
-
-    public boolean canDecodeInput(Object source) throws IOException {
-        if (!(source instanceof ImageInputStream)) {
-            return false;
-        }
-        ImageInputStream iis = (ImageInputStream) source;
-        iis.mark();
-        // If the first two bytes are a JPEG SOI marker, it's probably
-        // a JPEG file.  If they aren't, it definitely isn't a JPEG file.
-        int byte1 = iis.read();
-        int byte2 = iis.read();
-        iis.reset();
-        if ((byte1 == 0xFF) && (byte2 == JPEG.SOI)) {
-            return true;
-        }
-        return false;
-    }
-
-    public ImageReader createReaderInstance(Object extension)
-        throws IIOException {
-        return new JPEGImageReader(this);
-    }
-
-}
diff --git a/external/ikvm/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java b/external/ikvm/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java
deleted file mode 100644
index ef3a1ea..0000000
--- a/external/ikvm/openjdk/com/sun/imageio/plugins/jpeg/JPEGImageWriterSpi.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.imageio.plugins.jpeg;
-
-import javax.imageio.spi.ImageWriterSpi;
-import javax.imageio.spi.ServiceRegistry;
-import javax.imageio.spi.IIORegistry;
-import javax.imageio.stream.ImageOutputStream;
-import javax.imageio.ImageWriter;
-import javax.imageio.ImageTypeSpecifier;
-import javax.imageio.IIOException;
-
-import java.awt.image.ColorModel;
-import java.awt.image.IndexColorModel;
-import java.awt.image.SampleModel;
-import java.util.Locale;
-
-public class JPEGImageWriterSpi extends ImageWriterSpi {
-
-    private static String [] readerSpiNames = 
-        {"com.sun.imageio.plugins.jpeg.JPEGImageReaderSpi"};
-
-    private boolean registered = false;
-    
-    public JPEGImageWriterSpi() {
-        super(JPEG.vendor,
-              JPEG.version,
-              JPEG.names,
-              JPEG.suffixes,
-              JPEG.MIMETypes,
-              "com.sun.imageio.plugins.jpeg.JPEGImageWriter",
-              new Class[] { ImageOutputStream.class },
-              readerSpiNames,
-              true,
-              JPEG.nativeStreamMetadataFormatName,
-              JPEG.nativeStreamMetadataFormatClassName,
-              null, null,
-              true,
-              JPEG.nativeImageMetadataFormatName,
-              JPEG.nativeImageMetadataFormatClassName,
-              null, null
-              );
-    }
-
-    public String getDescription(Locale locale) {
-        return "Standard JPEG Image Writer (not implemented)";
-    }
-
-    public void onRegistration(ServiceRegistry registry,
-                               Class<?> category) {
-        if (registered) {
-            return;
-        }
-    /*
-        try {
-            java.security.AccessController.doPrivileged(
-                new sun.security.action.LoadLibraryAction("jpeg"));
-        } catch (Throwable e) { // Fail on any Throwable
-            // if it can't be loaded, deregister and return
-            registry.deregisterServiceProvider(this);
-            return;
-        }
-     */
-
-        registered = true;
-    }
-
-    public boolean isFormatLossless() {
-        return false;
-    }
-
-    public boolean canEncodeImage(ImageTypeSpecifier type) {
-        SampleModel sampleModel = type.getSampleModel();
-
-        // Find the maximum bit depth across all channels
-        int[] sampleSize = sampleModel.getSampleSize();
-        int bitDepth = sampleSize[0];
-        for (int i = 1; i < sampleSize.length; i++) {
-            if (sampleSize[i] > bitDepth) {
-                bitDepth = sampleSize[i];
-            }
-        }
-
-        // 4450894: Ensure bitDepth is between 1 and 8
-        if (bitDepth < 1 || bitDepth > 8) {
-            return false;
-        }
-
-        return true;
-    }
-
-    public ImageWriter createWriterInstance(Object extension)
-        throws IIOException {
-        return new JPEGImageWriter(this);
-    }
-}
diff --git a/external/ikvm/openjdk/ikvm/internal/AnnotationAttributeBase.java b/external/ikvm/openjdk/ikvm/internal/AnnotationAttributeBase.java
index 7ccf9f2..f2359e5 100644
--- a/external/ikvm/openjdk/ikvm/internal/AnnotationAttributeBase.java
+++ b/external/ikvm/openjdk/ikvm/internal/AnnotationAttributeBase.java
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2005-2011 Jeroen Frijters
+  Copyright (C) 2005-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -23,11 +23,11 @@
 */
 package ikvm.internal;
 
-import cli.System.Reflection.BindingFlags;
 import ikvm.lang.CIL;
 import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Array;
+import java.lang.reflect.GenericSignatureFormatError;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -36,13 +36,15 @@ import java.util.Arrays;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.HashMap;
+import sun.reflect.annotation.TypeNotPresentExceptionProxy;
 
 public abstract class AnnotationAttributeBase
     extends cli.System.Attribute
     implements Annotation, Serializable
 {
-    private final HashMap values = new HashMap();
     private final Class annotationType;
+    private HashMap<String, Object> values;
+    private Object[] definition;
     private boolean frozen;
 
     protected AnnotationAttributeBase(Class annotationType)
@@ -106,7 +108,7 @@ public abstract class AnnotationAttributeBase
 
     protected final synchronized void setValue(String name, Object value)
     {
-        if(frozen)
+        if(frozen || definition != null)
         {
             throw new IllegalStateException("Annotation properties have already been defined");
         }
@@ -115,7 +117,7 @@ public abstract class AnnotationAttributeBase
             Class type = annotationType.getMethod(name).getReturnType();
             if(type.isEnum())
             {
-                value = type.getMethod("valueOf", String.class).invoke(null, value.toString());
+                value = Enum.valueOf(type, value.toString());
             }
             else if(type == Class.class)
             {
@@ -162,12 +164,11 @@ public abstract class AnnotationAttributeBase
                 type = type.getComponentType();
                 if(type.isEnum())
                 {
-                    Method valueOf = type.getMethod("valueOf", String.class);
                     cli.System.Array orgarray = (cli.System.Array)value;
                     Object[] array = (Object[])Array.newInstance(type, orgarray.get_Length());
                     for(int i = 0; i < array.length; i++)
                     {
-                        array[i] = valueOf.invoke(null, orgarray.GetValue(i).toString());
+                        array[i] = Enum.valueOf(type, orgarray.GetValue(i).toString());
                     }
                     value = array;
                 }
@@ -190,47 +191,54 @@ public abstract class AnnotationAttributeBase
             {
                 throw new InternalError("Invalid annotation type: " + type);
             }
+            if(values == null)
+            {
+                values = new HashMap<String, Object>();
+            }
             values.put(name, value);
         }
         catch (NoSuchMethodException x)
         {
             throw (NoSuchMethodError)new NoSuchMethodError().initCause(x);
         }
-        catch (IllegalAccessException x)
-        {
-            throw (IllegalAccessError)new IllegalAccessError().initCause(x);
-        }
-        catch (InvocationTargetException x)
-        {
-            throw (InternalError)new InternalError().initCause(x);
-        }
     }
 
     protected final synchronized void setDefinition(Object[] array)
     {
-        if(frozen)
+        if(frozen || definition != null)
         {
             throw new IllegalStateException("Annotation properties have already been defined");
         }
-        frozen = true;
-        // TODO consider checking that the type matches
-        // (or better yet (?), remove the first two redundant elements from the array)
-        decodeValues(values, annotationType, annotationType.getClassLoader(), array);
+        definition = array;
     }
 
     @ikvm.lang.Internal
-    public Map getValues()
+    public final Map getValues()
     {
         return values;
     }
 
     @ikvm.lang.Internal
-    public synchronized void freeze()
+    public final synchronized void freeze()
     {
         if(!frozen)
         {
             frozen = true;
-            setDefaults(values, annotationType);
+            if(values == null)
+            {
+                values = new HashMap<String, Object>();
+            }
+            if(definition == null)
+            {
+                setDefaults(values, annotationType);
+            }
+            else
+            {
+                // TODO consider checking that the type matches
+                // (or better yet (?), remove the first two redundant elements from the array)
+                decodeValues(values, annotationType, annotationType.getClassLoader(), definition);
+                definition = null;
+            }
         }
     }
 
@@ -251,8 +259,7 @@ public abstract class AnnotationAttributeBase
             }
             catch (NoSuchMethodException x)
             {
-                // TODO this probably isn't the right exception
-                throw new IncompatibleClassChangeError("Method " + name + " is missing in annotation " + annotationClass.getName());
+                // ignore values for members that are no longer present
             }
         }
         setDefaults(map, annotationClass);
@@ -273,15 +280,7 @@ public abstract class AnnotationAttributeBase
 
     private static Class classFromSig(ClassLoader loader, String name)
     {
-        if (name.startsWith("L") && name.endsWith(";"))
-        {
-            name = name.substring(1, name.length() - 1).replace('/', '.');
-        }
-        else if (name.startsWith("["))
-        {
-            name = name.replace('/', '.');
-        }
-        else if (name.length() == 1)
+        if (name.length() == 1)
         {
             switch (name.charAt(0))
             {
@@ -304,9 +303,23 @@ public abstract class AnnotationAttributeBase
                 case 'V':
                     return Void.TYPE;
                 default:
-                    throw new TypeNotPresentException(name, null);
+                    throw new GenericSignatureFormatError();
             }
         }
+
+        if (!isValidTypeSig(name, 0, name.length()))
+        {
+            throw new GenericSignatureFormatError();
+        }
+
+        if (name.charAt(0) == 'L')
+        {
+            name = name.substring(1, name.length() - 1).replace('/', '.');
+        }
+        else // must be an array then
+        {
+            name = name.replace('/', '.');
+        }
         try
         {
             return Class.forName(name, false, loader);
@@ -317,6 +330,41 @@ public abstract class AnnotationAttributeBase
         }
     }
 
+    private static boolean isValidTypeSig(String sig, int start, int end)
+    {
+        if (start >= end)
+        {
+            return false;
+        }
+        switch (sig.charAt(start))
+        {
+            case 'L':
+                return sig.indexOf(';', start + 1) == end - 1;
+            case '[':
+                while (sig.charAt(start) == '[')
+                {
+                    start++;
+                    if (start == end)
+                    {
+                        return false;
+                    }
+                }
+                return isValidTypeSig(sig, start, end);
+            case 'B':
+            case 'Z':
+            case 'C':
+            case 'S':
+            case 'I':
+            case 'J':
+            case 'F':
+            case 'D':
+                return start == end - 1;
+            default:
+                return false;
+        }
+    }
+
+    @ikvm.lang.Internal
     public static Object newAnnotation(ClassLoader loader, Object definition)
     {
         Object[] array = (Object[])definition;
@@ -328,6 +376,10 @@ public abstract class AnnotationAttributeBase
         if (classNameOrClass instanceof String)
         {
             annotationClass = classFromSig(loader, (String)classNameOrClass);
+            if (!annotationClass.isAnnotation())
+            {
+                return null;
+            }
             array[1] = annotationClass;
         }
         else
@@ -339,6 +391,7 @@ public abstract class AnnotationAttributeBase
         return Proxy.newProxyInstance(annotationClass.getClassLoader(), new Class<?>[] { annotationClass }, newAnnotationInvocationHandler(annotationClass, map));
     }
 
+    @ikvm.lang.Internal
     public static Object decodeElementValue(Object obj, Class type, ClassLoader loader)
         throws IllegalAccessException
     {
@@ -348,7 +401,10 @@ public abstract class AnnotationAttributeBase
             try
             {
                 Object[] error = (Object[])obj;
-                t = (Throwable)Class.forName((String)error[1]).getConstructor(String.class).newInstance(error[2]);
+                Class exception = Class.forName((String)error[1]);
+                t = (Throwable)(error.length == 2
+                    ? exception.newInstance()
+                    : exception.getConstructor(String.class).newInstance(error[2]));
             }
             catch (Exception x)
             {
@@ -398,7 +454,14 @@ public abstract class AnnotationAttributeBase
             byte tag = CIL.unbox_byte(array[0]);
             if (tag != 'c')
                 throw new ClassCastException();
-            return classFromSig(loader, (String)array[1]);
+            try
+            {
+                return classFromSig(loader, (String)array[1]);
+            }
+            catch (TypeNotPresentException x)
+            {
+                return new TypeNotPresentExceptionProxy(x.typeName(), x);
+            }
         }
         else if (type.isArray())
         {
@@ -410,21 +473,34 @@ public abstract class AnnotationAttributeBase
             Object dst = Array.newInstance(type, array.length - 1);
             for (int i = 0; i < array.length - 1; i++)
             {
-                Array.set(dst, i, decodeElementValue(array[i + 1], type, loader));
+                Object val = decodeElementValue(array[i + 1], type, loader);
+                try
+                {
+                    Array.set(dst, i, val);
+                }
+                catch (IllegalArgumentException _)
+                {
+                    // JDKBUG emulate JDK bug
+                    throw new ArrayStoreException(val.getClass().getName());
+                }
             }
             return dst;
         }
-        else if (type.isAnnotation())
-        {
-            return type.cast(newAnnotation(loader, obj));
-        }
         else if (type.isEnum())
         {
             Object[] array = (Object[])obj;
             byte tag = CIL.unbox_byte(array[0]);
             if (tag != 'e')
                 throw new ClassCastException();
-            Class enumClass = classFromSig(loader, (String)array[1]);
+            Class enumClass;
+            try
+            {
+                enumClass = classFromSig(loader, (String)array[1]);
+            }
+            catch (TypeNotPresentException x)
+            {
+                return new TypeNotPresentExceptionProxy(x.typeName(), x);
+            }
             try
             {
                 return Enum.valueOf(enumClass, (String)array[2]);
@@ -434,32 +510,29 @@ public abstract class AnnotationAttributeBase
                 throw new EnumConstantNotPresentException(enumClass, (String)array[2]);
             }
         }
-        else
+        else // must be an annotation then
         {
-            throw new ClassCastException();
+            Object ann = newAnnotation(loader, obj);
+            if (!type.isInstance(ann))
+            {
+                // JDKBUG if newAnnotation() returns null (because the class is not an annotation),
+                // the next line will throw a NullPointerException (similar to the JDK)
+                return newAnnotationTypeMismatchExceptionProxy(ann.getClass() + "[" + ann + "]");
+            }
+            return ann;
         }
     }
 
-    protected final Object writeReplace()
+    private final Object writeReplace()
     {
+        freeze();
 	return Proxy.newProxyInstance(annotationType.getClassLoader(),
 	    new Class[] { annotationType },
 	    newAnnotationInvocationHandler(annotationType, values));
     }
 
-    private static cli.System.Reflection.ConstructorInfo annotationInvocationHandlerConstructor;
-
-    private static InvocationHandler newAnnotationInvocationHandler(Class type, Map memberValues)
-    {
-	if (annotationInvocationHandlerConstructor == null)
-	{
-	    cli.System.Type typeofClass = cli.System.Type.GetType("java.lang.Class");
-	    cli.System.Type typeofMap = cli.System.Type.GetType("java.util.Map");
-	    annotationInvocationHandlerConstructor = cli.System.Type.GetType("sun.reflect.annotation.AnnotationInvocationHandler")
-		.GetConstructor(BindingFlags.wrap(BindingFlags.Instance | BindingFlags.NonPublic), null, new cli.System.Type[] { typeofClass, typeofMap }, null);
-	}
-	return (InvocationHandler)annotationInvocationHandlerConstructor.Invoke(new Object[] { type, memberValues });
-    }
+    private static native InvocationHandler newAnnotationInvocationHandler(Class type, Map memberValues);
+    private static native Object newAnnotationTypeMismatchExceptionProxy(String msg);
 
     public final Class<? extends Annotation> annotationType()
     {
@@ -468,16 +541,19 @@ public abstract class AnnotationAttributeBase
 
     public final boolean Equals(Object o)
     {
+        freeze();
         return equals(annotationType, values, o);
     }
 
     public final int GetHashCode()
     {
+        freeze();
         return hashCode(annotationType, values);
     }
 
     public final String ToString()
     {
+        freeze();
         return toString(annotationType, values);
     }
 
diff --git a/external/ikvm/openjdk/ikvm/internal/Winsock.java b/external/ikvm/openjdk/ikvm/internal/Winsock.java
index 86cbb85..ce05de0 100644
--- a/external/ikvm/openjdk/ikvm/internal/Winsock.java
+++ b/external/ikvm/openjdk/ikvm/internal/Winsock.java
@@ -122,6 +122,7 @@ public final class Winsock
     public static final int SO_RCVBUF = SocketOptionName.ReceiveBuffer;
     public static final int SO_KEEPALIVE = SocketOptionName.KeepAlive;
     public static final int SO_REUSEADDR = SocketOptionName.ReuseAddress;
+    public static final int SO_EXCLUSIVEADDRUSE = SocketOptionName.ExclusiveAddressUse;
     public static final int SO_BROADCAST = SocketOptionName.Broadcast;
     public static final int SO_RCVTIMEO = SocketOptionName.ReceiveTimeout;
     public static final int SO_ERROR = SocketOptionName.Error;
diff --git a/external/ikvm/openjdk/java/awt/image/BufferedImage.java b/external/ikvm/openjdk/java/awt/image/BufferedImage.java
index 33c9c27..ee00c6a 100644
--- a/external/ikvm/openjdk/java/awt/image/BufferedImage.java
+++ b/external/ikvm/openjdk/java/awt/image/BufferedImage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,6 +38,8 @@ import java.awt.geom.Rectangle2D;
 import java.awt.geom.Point2D;
 import java.awt.Point;
 import java.awt.Rectangle;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.Hashtable;
 import java.util.Vector;
 
@@ -425,6 +427,7 @@ public class BufferedImage extends java.awt.Image
         colorModel = cm;
         this.imageType = imageType;
         this.currentBuffer = BUFFER_RASTER;
+        raster.getDataBuffer().setImage( this );
     }
 
     /**
@@ -469,7 +472,7 @@ public class BufferedImage extends java.awt.Image
                           WritableRaster raster,
                           boolean isRasterPremultiplied,
                           Hashtable<?,?> properties) {
-        
+
         if (!cm.isCompatibleRaster(raster)) {
             throw new
                 IllegalArgumentException("Raster "+raster+
@@ -486,10 +489,12 @@ public class BufferedImage extends java.awt.Image
 
         colorModel = cm;
         this.raster  = raster;
+        raster.getDataBuffer().setImage( this );
         this.currentBuffer = BUFFER_RASTER;
         this.properties = properties;
         int numBands = raster.getNumBands();
         boolean isAlphaPre = cm.isAlphaPremultiplied();
+        final boolean isStandard = isStandard(cm, raster);
         ColorSpace cs;
 
         // Force the raster data alpha state to match the premultiplied
@@ -500,8 +505,9 @@ public class BufferedImage extends java.awt.Image
         cs = cm.getColorSpace();
         int csType = cs.getType();
         if (csType != ColorSpace.TYPE_RGB) {
-            if (csType == ColorSpace.TYPE_GRAY
-                && cm instanceof ComponentColorModel) {
+            if (csType == ColorSpace.TYPE_GRAY &&
+                isStandard &&
+                cm instanceof ComponentColorModel) {
                 // Check if this might be a child raster (fix for bug 4240596)
                 if (sm instanceof ComponentSampleModel &&
                     ((ComponentSampleModel)sm).getPixelStride() != numBands) {
@@ -531,6 +537,7 @@ public class BufferedImage extends java.awt.Image
             // are correct
             int pixSize = cm.getPixelSize();
             if (iraster.getPixelStride() == 1 &&
+                isStandard &&
                 cm instanceof DirectColorModel  &&
                 (pixSize == 32 || pixSize == 24))
             {
@@ -563,6 +570,7 @@ public class BufferedImage extends java.awt.Image
             }   // if (iraster.getPixelStride() == 1
         }   // ((raster instanceof IntegerComponentRaster) &&
         else if ((cm instanceof IndexColorModel) && (numBands == 1) &&
+                 isStandard &&
                  (!cm.hasAlpha() || !isAlphaPre))
         {
             IndexColorModel icm = (IndexColorModel) cm;
@@ -580,6 +588,7 @@ public class BufferedImage extends java.awt.Image
         }   // else if (cm instanceof IndexColorModel) && (numBands == 1))
         else if ((raster instanceof ShortComponentRaster)
                  && (cm instanceof DirectColorModel)
+                 && isStandard
                  && (numBands == 3)
                  && !cm.hasAlpha())
         {
@@ -599,6 +608,7 @@ public class BufferedImage extends java.awt.Image
         }   // else if ((cm instanceof IndexColorModel) && (numBands == 1))
         else if ((raster instanceof ByteComponentRaster)
                  && (cm instanceof ComponentColorModel)
+                 && isStandard
                  && (raster.getSampleModel() instanceof PixelInterleavedSampleModel)
                  && (numBands == 3 || numBands == 4))
         {
@@ -623,14 +633,15 @@ public class BufferedImage extends java.awt.Image
                 }
             }
             if (is8bit &&
+                braster.getPixelStride() == numBands &&
                 offs[0] == numBands-1 &&
                 offs[1] == numBands-2 &&
                 offs[2] == numBands-3)
             {
-                if (numBands == 3) {
+                if (numBands == 3 && !ccm.hasAlpha()) {
                     imageType = TYPE_3BYTE_BGR;
                 }
-                else if (offs[3] == 0) {
+                else if (offs[3] == 0 && ccm.hasAlpha()) {
                     imageType = (isAlphaPre
                                  ? TYPE_4BYTE_ABGR_PRE
                                  : TYPE_4BYTE_ABGR);
@@ -638,6 +649,27 @@ public class BufferedImage extends java.awt.Image
             }
         }   // else if ((raster instanceof ByteComponentRaster) &&
     }
+
+    private static boolean isStandard(ColorModel cm, WritableRaster wr) {
+        final Class<? extends ColorModel> cmClass = cm.getClass();
+        final Class<? extends WritableRaster> wrClass = wr.getClass();
+        final Class<? extends SampleModel> smClass = wr.getSampleModel().getClass();
+
+        final PrivilegedAction<Boolean> checkClassLoadersAction =
+                new PrivilegedAction<Boolean>()
+        {
+
+            @Override
+            public Boolean run() {
+                final ClassLoader std = System.class.getClassLoader();
+
+                return (cmClass.getClassLoader() == std) &&
+                        (smClass.getClassLoader() == std) &&
+                        (wrClass.getClassLoader() == std);
+            }
+        };
+        return AccessController.doPrivileged(checkClassLoadersAction);
+    }
     
     /**
      * Get the .NET Bitmap object.
@@ -649,6 +681,23 @@ public class BufferedImage extends java.awt.Image
     }
 
     /**
+     * Switch to the BITMAP buffer and invalidate the RASTER buffer before a graphics operation.
+     */
+    final void toBitmap(){
+    	raster2Bitmap();
+    	currentBuffer = BUFFER_BITMAP;
+    }
+    
+    /**
+     * Switch to the RASTER buffer and invalidate the BITMAP buffer before a graphics operation.
+     */
+    @cli.IKVM.Attributes.HideFromJavaAttribute.Annotation
+    final void toRaster() {
+    	bitmap2Raster();
+    	currentBuffer = BUFFER_RASTER;
+    }
+    
+    /**
      * This Implementation of BufferedImage has 2 different Buffer, 
      * a Java WritableRaster and a .NET Bitmap.
      * This method convert a Java WritableRaster to a .NET Bitmap if needed.
@@ -714,21 +763,23 @@ public class BufferedImage extends java.awt.Image
             }
             if(raster == null){
                 raster = createRaster(width, height);
+                raster.getDataBuffer().setImage( this );
             }
             
+            this.currentBuffer = BUFFER_BOTH;
             switch (getType()){
                 case TYPE_INT_ARGB:
                     copyFromBitmap(bitmap, ((DataBufferInt)raster.getDataBuffer()).getData());
                     break;
                 default:
+                	Object pixel = colorModel.getDataElements( 0, null ); //allocate a buffer for the follow loop
                     for( int y = 0; y<height; y++){
                         for(int x = 0; x<width; x++){
                             int rgb = bitmap.GetPixel(x, y).ToArgb();
-                            raster.setDataElements(x, y, colorModel.getDataElements(rgb, null));
+                            raster.setDataElements(x, y, colorModel.getDataElements(rgb, pixel));
                         }
                     }
             }
-            this.currentBuffer = BUFFER_BOTH;
         }
     }
 
@@ -1192,7 +1243,7 @@ public class BufferedImage extends java.awt.Image
      * pixels for this image.
      * @see ImageProducer
      */
-    public ImageProducer getSource(){
+    public ImageProducer getSource() {
         if(currentBuffer != BUFFER_RASTER){
             synchronized( bitmap ) {
                 int width = bitmap.get_Width();
@@ -1281,10 +1332,9 @@ public class BufferedImage extends java.awt.Image
      *          image.
      */
     public Graphics2D createGraphics() {
-        ikvm.awt.IkvmToolkit toolkit = ikvm.awt.IkvmToolkit.DefaultToolkit.get();
-        raster2Bitmap();
-        this.currentBuffer = BUFFER_BITMAP;
-        return toolkit.createGraphics( bitmap );
+        GraphicsEnvironment env =
+            GraphicsEnvironment.getLocalGraphicsEnvironment();
+        return env.createGraphics(this);
     }
 
     /**
@@ -1346,9 +1396,9 @@ public class BufferedImage extends java.awt.Image
      *          <code>BufferedImage</code>.
      */
     public String toString() {
-        return new String("BufferedImage@"+Integer.toHexString(hashCode())
-                          +": type = "+imageType
-                          +" "+colorModel+" "+raster);
+        return "BufferedImage@"+Integer.toHexString(hashCode())
+            +": type = "+imageType
+            +" "+colorModel+" "+raster;
     }
 
     /**
diff --git a/external/ikvm/openjdk/java/awt/image/IndexColorModel.java b/external/ikvm/openjdk/java/awt/image/IndexColorModel.java
index 34ab79d..b76f924 100644
--- a/external/ikvm/openjdk/java/awt/image/IndexColorModel.java
+++ b/external/ikvm/openjdk/java/awt/image/IndexColorModel.java
@@ -618,7 +618,7 @@ public class IndexColorModel extends ColorModel {
             }
             nBits[0] = nBits[1] = nBits[2] = 8;
         }
-        return nBits;
+        return nBits.clone();
     }
 
     /**
@@ -1501,6 +1501,14 @@ public class IndexColorModel extends ColorModel {
     }
 
     /**
+     * Disposes of system resources associated with this
+     * <code>ColorModel</code> once this <code>ColorModel</code> is no
+     * longer referenced.
+     */
+    public void finalize() {
+    }
+
+    /**
      * Returns the <code>String</code> representation of the contents of
      * this <code>ColorModel</code>object.
      * @return a <code>String</code> representing the contents of this
diff --git a/external/ikvm/openjdk/java/io/FileInputStream.java b/external/ikvm/openjdk/java/io/FileInputStream.java
index a0bc224..3547947 100644
--- a/external/ikvm/openjdk/java/io/FileInputStream.java
+++ b/external/ikvm/openjdk/java/io/FileInputStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@ package java.io;
 
 import java.nio.channels.FileChannel;
 import sun.nio.ch.FileChannelImpl;
+import sun.misc.IoTrace;
 
 
 /**
@@ -51,6 +52,9 @@ class FileInputStream extends InputStream
     /* File Descriptor - handle to the open file */
     private final FileDescriptor fd;
 
+    /* The path of the referenced file (null if the stream is created with a file descriptor) */
+    private final String path;
+
     private FileChannel channel = null;
 
     private final Object closeLock = new Object();
@@ -133,8 +137,14 @@ class FileInputStream extends InputStream
         if (name == null) {
             throw new NullPointerException();
         }
+        /*
+        if (file.isInvalid()) {
+            throw new FileNotFoundException("Invalid file path");
+        }
+        */
         fd = new FileDescriptor();
         fd.incrementAndGetUseCount();
+        this.path = name;
         open(name);
     }
 
@@ -171,6 +181,7 @@ class FileInputStream extends InputStream
             security.checkRead(fdObj);
         }
         fd = fdObj;
+        path = null;
 
         /*
          * FileDescriptor is being shared by streams.
@@ -197,9 +208,15 @@ class FileInputStream extends InputStream
      *             file is reached.
      * @exception  IOException  if an I/O error occurs.
      */
-    public int read() throws IOException
-    {
-        return fd.read();
+    public int read() throws IOException {
+        Object traceContext = IoTrace.fileReadBegin(path);
+        int b = 0;
+        try {
+            b = fd.read();
+        } finally {
+            IoTrace.fileReadEnd(traceContext, b == -1 ? 0 : 1);
+        }
+        return b;
     }
 
     /**
@@ -226,7 +243,14 @@ class FileInputStream extends InputStream
      * @exception  IOException  if an I/O error occurs.
      */
     public int read(byte b[]) throws IOException {
-        return readBytes(b, 0, b.length);
+        Object traceContext = IoTrace.fileReadBegin(path);
+        int bytesRead = 0;
+        try {
+            bytesRead = readBytes(b, 0, b.length);
+        } finally {
+            IoTrace.fileReadEnd(traceContext, bytesRead == -1 ? 0 : bytesRead);
+        }
+        return bytesRead;
     }
 
     /**
@@ -248,7 +272,14 @@ class FileInputStream extends InputStream
      * @exception  IOException  if an I/O error occurs.
      */
     public int read(byte b[], int off, int len) throws IOException {
-        return readBytes(b, off, len);
+        Object traceContext = IoTrace.fileReadBegin(path);
+        int bytesRead = 0;
+        try {
+            bytesRead = readBytes(b, off, len);
+        } finally {
+            IoTrace.fileReadEnd(traceContext, bytesRead == -1 ? 0 : bytesRead);
+        }
+        return bytesRead;
     }
 
     /**
@@ -376,7 +407,7 @@ class FileInputStream extends InputStream
     public FileChannel getChannel() {
         synchronized (this) {
             if (channel == null) {
-                channel = FileChannelImpl.open(fd, true, false, this);
+                channel = FileChannelImpl.open(fd, path, true, false, this);
 
                 /*
                  * Increment fd's use count. Invoking the channel's close()
diff --git a/external/ikvm/openjdk/java/io/FileOutputStream.java b/external/ikvm/openjdk/java/io/FileOutputStream.java
index e931fe6..dae9d4b 100644
--- a/external/ikvm/openjdk/java/io/FileOutputStream.java
+++ b/external/ikvm/openjdk/java/io/FileOutputStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@ package java.io;
 
 import java.nio.channels.FileChannel;
 import sun.nio.ch.FileChannelImpl;
+import sun.misc.IoTrace;
 
 
 /**
@@ -58,6 +59,11 @@ class FileOutputStream extends OutputStream
     private final FileDescriptor fd;
 
     /**
+     * The path of the referenced file (null if the stream is created with a file descriptor)
+     */
+    private final String path;
+
+    /**
      * True if the file is opened for append.
      */
     private final boolean append;
@@ -205,9 +211,14 @@ class FileOutputStream extends OutputStream
         if (name == null) {
             throw new NullPointerException();
         }
+        /*
+        if (file.isInvalid()) {
+            throw new FileNotFoundException("Invalid file path");
+        }
+        */
         this.fd = new FileDescriptor();
         this.append = append;
-
+        this.path = name;
         fd.incrementAndGetUseCount();
         open(name, append);
     }
@@ -244,6 +255,7 @@ class FileOutputStream extends OutputStream
             security.checkWrite(fdObj);
         }
         this.fd = fdObj;
+        this.path = null;
         this.append = false;
 
         /*
@@ -287,7 +299,14 @@ class FileOutputStream extends OutputStream
      * @exception  IOException  if an I/O error occurs.
      */
     public void write(int b) throws IOException {
-        write(b, append);
+        Object traceContext = IoTrace.fileWriteBegin(path);
+        int bytesWritten = 0;
+        try {
+            write(b, append);
+            bytesWritten = 1;
+        } finally {
+            IoTrace.fileWriteEnd(traceContext, bytesWritten);
+        }
     }
 
     /**
@@ -312,7 +331,14 @@ class FileOutputStream extends OutputStream
      * @exception  IOException  if an I/O error occurs.
      */
     public void write(byte b[]) throws IOException {
-        writeBytes(b, 0, b.length, append);
+        Object traceContext = IoTrace.fileWriteBegin(path);
+        int bytesWritten = 0;
+        try {
+            writeBytes(b, 0, b.length, append);
+            bytesWritten = b.length;
+        } finally {
+            IoTrace.fileWriteEnd(traceContext, bytesWritten);
+        }
     }
 
     /**
@@ -325,7 +351,14 @@ class FileOutputStream extends OutputStream
      * @exception  IOException  if an I/O error occurs.
      */
     public void write(byte b[], int off, int len) throws IOException {
-        writeBytes(b, off, len, append);
+        Object traceContext = IoTrace.fileWriteBegin(path);
+        int bytesWritten = 0;
+        try {
+            writeBytes(b, off, len, append);
+            bytesWritten = len;
+        } finally {
+            IoTrace.fileWriteEnd(traceContext, bytesWritten);
+        }
     }
 
     /**
@@ -408,7 +441,7 @@ class FileOutputStream extends OutputStream
     public FileChannel getChannel() {
         synchronized (this) {
             if (channel == null) {
-                channel = FileChannelImpl.open(fd, false, true, append, this);
+                channel = FileChannelImpl.open(fd, path, false, true, append, this);
 
                 /*
                  * Increment fd's use count. Invoking the channel's close()
diff --git a/external/ikvm/openjdk/java/io/ObjectStreamClass.java b/external/ikvm/openjdk/java/io/ObjectStreamClass.java
index 7cca355..97489b1 100644
--- a/external/ikvm/openjdk/java/io/ObjectStreamClass.java
+++ b/external/ikvm/openjdk/java/io/ObjectStreamClass.java
@@ -50,7 +50,10 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import sun.misc.Unsafe;
+import sun.reflect.CallerSensitive;
+import sun.reflect.Reflection;
 import sun.reflect.ReflectionFactory;
+import sun.reflect.misc.ReflectUtil;
 
 /**
  * Serialization's descriptor for classes.  It contains the name and
@@ -262,7 +265,17 @@ public class ObjectStreamClass implements Serializable {
      *
      * @return  the <code>Class</code> instance that this descriptor represents
      */
+    @CallerSensitive
     public Class<?> forClass() {
+        if (cl == null) {
+            return null;
+        }
+        if (System.getSecurityManager() != null) {
+            Class<?> caller = Reflection.getCallerClass();
+            if (ReflectUtil.needsPackageAccessCheck(caller.getClassLoader(), cl.getClassLoader())) {
+                ReflectUtil.checkPackageAccess(cl);
+            }
+        }
         return cl;
     }
 
@@ -1156,7 +1169,14 @@ public class ObjectStreamClass implements Serializable {
             end = end.getSuperclass();
         }
 
+        HashSet<String> oscNames = new HashSet<>(3);
+
         for (ObjectStreamClass d = this; d != null; d = d.superDesc) {
+            if (oscNames.contains(d.name)) {
+                throw new InvalidClassException("Circular reference.");
+            } else {
+                oscNames.add(d.name);
+            }
 
             // search up inheritance hierarchy for class with matching name
             String searchName = (d.cl != null) ? d.cl.getName() : d.name;
@@ -1848,8 +1868,10 @@ public class ObjectStreamClass implements Serializable {
         private final ObjectStreamField[] fields;
         /** number of primitive fields */
         private final int numPrimFields;
-        /** unsafe field keys */
-        private final long[] keys;
+        /** unsafe field keys for reading fields - may contain dupes */
+        private final long[] readKeys;
+        /** unsafe fields keys for writing fields - no dupes */
+        private final long[] writeKeys;
         /** field data offsets */
         private final int[] offsets;
         /** field type codes */
@@ -1867,16 +1889,22 @@ public class ObjectStreamClass implements Serializable {
         FieldReflector(ObjectStreamField[] fields) {
             this.fields = fields;
             int nfields = fields.length;
-            keys = new long[nfields];
+            readKeys = new long[nfields];
+            writeKeys = new long[nfields];
             offsets = new int[nfields];
             typeCodes = new char[nfields];
             ArrayList<Class<?>> typeList = new ArrayList<>();
+            Set<Long> usedKeys = new HashSet<>();
+
 
             for (int i = 0; i < nfields; i++) {
                 ObjectStreamField f = fields[i];
                 Field rf = f.getField();
-                keys[i] = (rf != null) ?
+                long key = (rf != null) ?
                     unsafe.objectFieldOffset(rf) : Unsafe.INVALID_FIELD_OFFSET;
+                readKeys[i] = key;
+                writeKeys[i] = usedKeys.add(key) ?
+                    key : Unsafe.INVALID_FIELD_OFFSET;
                 offsets[i] = f.getOffset();
                 typeCodes[i] = f.getTypeCode();
                 if (!f.isPrimitive()) {
@@ -1912,7 +1940,7 @@ public class ObjectStreamClass implements Serializable {
              * in array should be equal to Unsafe.INVALID_FIELD_OFFSET.
              */
             for (int i = 0; i < numPrimFields; i++) {
-                long key = keys[i];
+                long key = readKeys[i];
                 int off = offsets[i];
                 switch (typeCodes[i]) {
                     case 'Z':
@@ -1963,7 +1991,7 @@ public class ObjectStreamClass implements Serializable {
                 throw new NullPointerException();
             }
             for (int i = 0; i < numPrimFields; i++) {
-                long key = keys[i];
+                long key = writeKeys[i];
                 if (key == Unsafe.INVALID_FIELD_OFFSET) {
                     continue;           // discard value
                 }
@@ -2024,7 +2052,7 @@ public class ObjectStreamClass implements Serializable {
                 switch (typeCodes[i]) {
                     case 'L':
                     case '[':
-                        vals[offsets[i]] = unsafe.getObject(obj, keys[i]);
+                        vals[offsets[i]] = unsafe.getObject(obj, readKeys[i]);
                         break;
 
                     default:
@@ -2045,7 +2073,7 @@ public class ObjectStreamClass implements Serializable {
                 throw new NullPointerException();
             }
             for (int i = numPrimFields; i < fields.length; i++) {
-                long key = keys[i];
+                long key = writeKeys[i];
                 if (key == Unsafe.INVALID_FIELD_OFFSET) {
                     continue;           // discard value
                 }
@@ -2148,7 +2176,7 @@ public class ObjectStreamClass implements Serializable {
         }
     }
 
-    private static native Object getFastFieldReflector(Object fields);
+    private static native Object getFastFieldReflector(ObjectStreamField[] fields);
     
     /**
      * FieldReflector cache lookup key.  Keys are considered equal if they
diff --git a/external/ikvm/openjdk/java/io/ObjectStreamField.java b/external/ikvm/openjdk/java/io/ObjectStreamField.java
index c2d1ffe..1d7c2cd 100644
--- a/external/ikvm/openjdk/java/io/ObjectStreamField.java
+++ b/external/ikvm/openjdk/java/io/ObjectStreamField.java
@@ -26,6 +26,9 @@
 package java.io;
 
 import java.lang.reflect.Field;
+import sun.reflect.CallerSensitive;
+import sun.reflect.Reflection;
+import sun.reflect.misc.ReflectUtil;
 
 /**
  * A description of a Serializable field from a Serializable class.  An array
@@ -163,7 +166,14 @@ public class ObjectStreamField
      * @return  a <code>Class</code> object representing the type of the
      *          serializable field
      */
+    @CallerSensitive
     public Class<?> getType() {
+        if (System.getSecurityManager() != null) {
+            Class<?> caller = Reflection.getCallerClass();
+            if (ReflectUtil.needsPackageAccessCheck(caller.getClassLoader(), type.getClassLoader())) {
+                ReflectUtil.checkPackageAccess(type);
+            }
+        }
         return type;
     }
 
diff --git a/external/ikvm/openjdk/java/io/RandomAccessFile.java b/external/ikvm/openjdk/java/io/RandomAccessFile.java
index 3cddafd..61fc27a 100644
--- a/external/ikvm/openjdk/java/io/RandomAccessFile.java
+++ b/external/ikvm/openjdk/java/io/RandomAccessFile.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@ package java.io;
 
 import java.nio.channels.FileChannel;
 import sun.nio.ch.FileChannelImpl;
+import sun.misc.IoTrace;
 
 
 /**
@@ -62,6 +63,9 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable {
     private FileChannel channel = null;
     private boolean rw;
 
+    /* The path of the referenced file */
+    private final String path;
+
     private Object closeLock = new Object();
     private volatile boolean closed = false;
 
@@ -228,8 +232,14 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable {
         if (name == null) {
             throw new NullPointerException();
         }
+        /*
+        if (file.isInvalid()) {
+            throw new FileNotFoundException("Invalid file path");
+        }
+        */
         fd = new FileDescriptor();
         fd.incrementAndGetUseCount();
+        this.path = name;
         open(name, imode);
     }
 
@@ -267,7 +277,7 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable {
     public final FileChannel getChannel() {
         synchronized (this) {
             if (channel == null) {
-                channel = FileChannelImpl.open(fd, true, rw, this);
+                channel = FileChannelImpl.open(fd, path, true, rw, this);
 
                 /*
                  * FileDescriptor could be shared by FileInputStream or
@@ -325,9 +335,15 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable {
      * @exception  IOException  if an I/O error occurs. Not thrown if
      *                          end-of-file has been reached.
      */
-    public int read() throws IOException
-    {
-        return fd.read();
+    public int read() throws IOException {
+        Object traceContext = IoTrace.fileReadBegin(path);
+        int b = 0;
+        try {
+            b = fd.read();
+        } finally {
+            IoTrace.fileReadEnd(traceContext, b == -1 ? 0 : 1);
+        }
+        return b;
     }
 
     /**
@@ -339,7 +355,14 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable {
      */
     private int readBytes(byte b[], int off, int len) throws IOException
     {
-        return fd.readBytes(b, off, len);
+        Object traceContext = IoTrace.fileReadBegin(path);
+        int bytesRead = 0;
+        try {
+            bytesRead = fd.readBytes(b, off, len);
+        } finally {
+            IoTrace.fileReadEnd(traceContext, bytesRead == -1 ? 0 : bytesRead);
+        }
+        return bytesRead;
     }
 
     /**
@@ -479,9 +502,15 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable {
      * @param      b   the <code>byte</code> to be written.
      * @exception  IOException  if an I/O error occurs.
      */
-    public void write(int b) throws IOException
-    {
-        fd.write(b);
+    public void write(int b) throws IOException {
+        Object traceContext = IoTrace.fileWriteBegin(path);
+        int bytesWritten = 0;
+        try {
+            fd.write(b);
+            bytesWritten = 1;
+        } finally {
+            IoTrace.fileWriteEnd(traceContext, bytesWritten);
+        }
     }
 
     /**
@@ -492,9 +521,15 @@ public class RandomAccessFile implements DataOutput, DataInput, Closeable {
      * @param len the number of bytes that are written
      * @exception IOException If an I/O error has occurred.
      */
-    private void writeBytes(byte b[], int off, int len) throws IOException
-    {
-        fd.writeBytes(b, off, len);
+    private void writeBytes(byte b[], int off, int len) throws IOException {
+        Object traceContext = IoTrace.fileWriteBegin(path);
+        int bytesWritten = 0;
+        try {
+            fd.writeBytes(b, off, len);
+            bytesWritten = len;
+        } finally {
+            IoTrace.fileWriteEnd(traceContext, bytesWritten);
+        }
     }
 
     /**
diff --git a/external/ikvm/openjdk/java/lang/Class.java b/external/ikvm/openjdk/java/lang/Class.java
index 20f3553..bbc1d24 100644
--- a/external/ikvm/openjdk/java/lang/Class.java
+++ b/external/ikvm/openjdk/java/lang/Class.java
@@ -53,6 +53,7 @@ import java.util.Set;
 import java.util.Map;
 import java.util.HashMap;
 import sun.misc.Unsafe;
+import sun.reflect.CallerSensitive;
 import sun.reflect.ConstantPool;
 import sun.reflect.Reflection;
 import sun.reflect.ReflectionFactory;
@@ -65,7 +66,9 @@ import sun.reflect.generics.repository.ConstructorRepository;
 import sun.reflect.generics.scope.ClassScope;
 import sun.security.util.SecurityConstants;
 import java.lang.annotation.Annotation;
-import sun.reflect.annotation.AnnotationType;
+import java.lang.reflect.Proxy;
+import sun.reflect.annotation.*;
+import sun.reflect.misc.ReflectUtil;
 import cli.System.Runtime.Serialization.IObjectReference;
 import cli.System.Runtime.Serialization.SerializationException;
 import cli.System.Runtime.Serialization.SerializationInfo;
@@ -281,10 +284,11 @@ public final
      *            by this method fails
      * @exception ClassNotFoundException if the class cannot be located
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static Class<?> forName(String className)
                 throws ClassNotFoundException {
-        return forName0(className, true, ClassLoader.getCallerClassLoader());
+        return forName0(className, true,
+                        ClassLoader.getClassLoader(Reflection.getCallerClass()));
     }
 
 
@@ -348,7 +352,7 @@ public final
      * @see       java.lang.ClassLoader
      * @since     1.2
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static Class<?> forName(String name, boolean initialize,
                                    ClassLoader loader)
         throws ClassNotFoundException
@@ -356,7 +360,7 @@ public final
         if (loader == null) {
             SecurityManager sm = System.getSecurityManager();
             if (sm != null) {
-                ClassLoader ccl = ClassLoader.getCallerClassLoader();
+                ClassLoader ccl = ClassLoader.getClassLoader(Reflection.getCallerClass());
                 if (ccl != null) {
                     sm.checkPermission(
                         SecurityConstants.GET_CLASSLOADER_PERMISSION);
@@ -418,19 +422,14 @@ public final
      *             </ul>
      *
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public T newInstance()
         throws InstantiationException, IllegalAccessException
     {
         if (System.getSecurityManager() != null) {
-            checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+            checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), false);
         }
-        return newInstance0(ikvm.internal.CallerID.getCallerID());
-    }
 
-    private T newInstance0(ikvm.internal.CallerID callerID)
-        throws InstantiationException, IllegalAccessException
-    {
         // NOTE: the following code may not be strictly correct under
         // the current Java memory model.
 
@@ -464,7 +463,7 @@ public final
         // Security check (same as in java.lang.reflect.Constructor)
         int modifiers = tmpConstructor.getModifiers();
         if (!Reflection.quickCheckMemberAccess(this, modifiers)) {
-            Class<?> caller = callerID.getCallerClass();
+            Class<?> caller = Reflection.getCallerClass();
             if (newInstanceCallerCache != caller) {
                 Reflection.ensureMemberAccess(caller, this, null, modifiers);
                 newInstanceCallerCache = caller;
@@ -705,17 +704,14 @@ public final
      * @see SecurityManager#checkPermission
      * @see java.lang.RuntimePermission
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public ClassLoader getClassLoader() {
         ClassLoader cl = getClassLoader0();
         if (cl == null)
             return null;
         SecurityManager sm = System.getSecurityManager();
         if (sm != null) {
-            ClassLoader ccl = ClassLoader.getCallerClassLoader();
-            if (ccl != null && ccl != cl && !cl.isAncestor(ccl)) {
-                sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
-            }
+            ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());
         }
         return cl;
     }
@@ -996,6 +992,7 @@ public final
      *     that class is a local or anonymous class; otherwise {@code null}.
      * @since 1.5
      */
+    @CallerSensitive
     public Method getEnclosingMethod() {
         EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
 
@@ -1017,13 +1014,22 @@ public final
             for(int i = 0; i < parameterClasses.length; i++)
                 parameterClasses[i] = toClass(parameterTypes[i]);
 
+            // Perform access check
+            Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
+            // be very careful not to change the stack depth of this
+            // checkMemberAccess call for security reasons
+            // see java.lang.SecurityManager.checkMemberAccess
+            //
+            // Note that we need to do this on the enclosing class
+            enclosingCandidate.checkMemberAccess(Member.DECLARED,
+                                                 Reflection.getCallerClass(), true);
             /*
              * Loop over all declared methods; match method name,
              * number of and type of parameters, *and* return
              * type.  Matching return type is also necessary
              * because of covariant returns, etc.
              */
-            for(Method m: enclosingInfo.getEnclosingClass().getDeclaredMethods()) {
+            for(Method m: enclosingCandidate.getDeclaredMethods()) {
                 if (m.getName().equals(enclosingInfo.getName()) ) {
                     Class<?>[] candidateParamClasses = m.getParameterTypes();
                     if (candidateParamClasses.length == parameterClasses.length) {
@@ -1124,6 +1130,7 @@ public final
      *     that class is a local or anonymous class; otherwise {@code null}.
      * @since 1.5
      */
+    @CallerSensitive
     public Constructor<?> getEnclosingConstructor() {
         EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
 
@@ -1144,11 +1151,20 @@ public final
             for(int i = 0; i < parameterClasses.length; i++)
                 parameterClasses[i] = toClass(parameterTypes[i]);
 
+            // Perform access check
+            Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
+            // be very careful not to change the stack depth of this
+            // checkMemberAccess call for security reasons
+            // see java.lang.SecurityManager.checkMemberAccess
+            //
+            // Note that we need to do this on the enclosing class
+            enclosingCandidate.checkMemberAccess(Member.DECLARED,
+                                                 Reflection.getCallerClass(), true);
             /*
              * Loop over all declared constructors; match number
              * of and type of parameters.
              */
-            for(Constructor<?> c: enclosingInfo.getEnclosingClass().getDeclaredConstructors()) {
+            for(Constructor<?> c: enclosingCandidate.getDeclaredConstructors()) {
                 Class<?>[] candidateParamClasses = c.getParameterTypes();
                 if (candidateParamClasses.length == parameterClasses.length) {
                     boolean matches = true;
@@ -1190,6 +1206,7 @@ public final
      * @return the immediately enclosing class of the underlying class
      * @since 1.5
      */
+    @CallerSensitive
     public Class<?> getEnclosingClass() {
         // There are five kinds of classes (or interfaces):
         // a) Top level classes
@@ -1203,18 +1220,24 @@ public final
         // attribute if and only if it is a local class or an
         // anonymous class.
         EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
+        Class<?> enclosingCandidate;
 
         if (enclosingInfo == null) {
             // This is a top level or a nested class or an inner class (a, b, or c)
-            return getDeclaringClass();
+            enclosingCandidate = getDeclaringClass();
         } else {
             Class<?> enclosingClass = enclosingInfo.getEnclosingClass();
             // This is a local class or an anonymous class (d or e)
             if (enclosingClass == this || enclosingClass == null)
                 throw new InternalError("Malformed enclosing method information");
             else
-                return enclosingClass;
+                enclosingCandidate = enclosingClass;
         }
+
+        if (enclosingCandidate != null)
+            enclosingCandidate.checkPackageAccess(
+                    ClassLoader.getClassLoader(Reflection.getCallerClass()), true);
+        return enclosingCandidate;
     }
 
     /**
@@ -1397,12 +1420,12 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Class<?>[] getClasses() {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), false);
 
         // Privileged so this implementation can look at DECLARED classes,
         // something the caller might not have privilege to do.  The code here
@@ -1473,12 +1496,12 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Field[] getFields() throws SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
         return copyFields(privateGetPublicFields(null));
     }
 
@@ -1525,12 +1548,12 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Method[] getMethods() throws SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
         return copyMethods(privateGetPublicMethods());
     }
 
@@ -1575,12 +1598,12 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Constructor<?>[] getConstructors() throws SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
         return copyConstructors(privateGetDeclaredConstructors(true));
     }
 
@@ -1634,13 +1657,13 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Field getField(String name)
         throws NoSuchFieldException, SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
         Field field = getField0(name);
         if (field == null) {
             throw new NoSuchFieldException(name);
@@ -1720,13 +1743,13 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Method getMethod(String name, Class<?>... parameterTypes)
         throws NoSuchMethodException, SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
         Method method = getMethod0(name, parameterTypes);
         if (method == null) {
             throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
@@ -1775,13 +1798,13 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Constructor<T> getConstructor(Class<?>... parameterTypes)
         throws NoSuchMethodException, SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
         return getConstructor0(parameterTypes, Member.PUBLIC);
     }
 
@@ -1819,12 +1842,12 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Class<?>[] getDeclaredClasses() throws SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), false);
         return getDeclaredClasses0();
     }
 
@@ -1864,12 +1887,12 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Field[] getDeclaredFields() throws SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
         return copyFields(privateGetDeclaredFields(false));
     }
 
@@ -1913,12 +1936,12 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Method[] getDeclaredMethods() throws SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
         return copyMethods(privateGetDeclaredMethods(false));
     }
 
@@ -1959,12 +1982,12 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Constructor<?>[] getDeclaredConstructors() throws SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
         return copyConstructors(privateGetDeclaredConstructors(false));
     }
 
@@ -2003,13 +2026,13 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Field getDeclaredField(String name)
         throws NoSuchFieldException, SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
         Field field = searchFields(privateGetDeclaredFields(false), name);
         if (field == null) {
             throw new NoSuchFieldException(name);
@@ -2059,13 +2082,13 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
         throws NoSuchMethodException, SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
         Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
         if (method == null) {
             throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
@@ -2110,13 +2133,13 @@ public final
      *
      * @since JDK1.1
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
         throws NoSuchMethodException, SecurityException {
         // be very careful not to change the stack depth of this
         // checkMemberAccess call for security reasons
         // see java.lang.SecurityManager.checkMemberAccess
-        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        checkMemberAccess(Member.DECLARED, Reflection.getCallerClass(), true);
         return getConstructor0(parameterTypes, Member.DECLARED);
     }
 
@@ -2274,31 +2297,69 @@ public final
      */
     static native Class getPrimitiveClass(String name);
 
+    private static boolean isCheckMemberAccessOverridden(SecurityManager smgr) {
+        if (smgr.getClass() == SecurityManager.class) return false;
+
+        Class<?>[] paramTypes = new Class<?>[] {Class.class, int.class};
+        return smgr.getClass().getMethod0("checkMemberAccess", paramTypes).
+                getDeclaringClass() != SecurityManager.class;
+    }
+
 
     /*
      * Check if client is allowed to access members.  If access is denied,
      * throw a SecurityException.
      *
-     * Be very careful not to change the stack depth of this checkMemberAccess
-     * call for security reasons.
-     * See java.lang.SecurityManager.checkMemberAccess.
+     * This method also enforces package access.
      *
      * <p> Default policy: allow all clients access with normal Java access
      * control.
      */
-    private void checkMemberAccess(int which, ClassLoader ccl) {
-        SecurityManager s = System.getSecurityManager();
+    private void checkMemberAccess(int which, Class<?> caller, boolean checkProxyInterfaces) {
+        final SecurityManager s = System.getSecurityManager();
         if (s != null) {
-            s.checkMemberAccess(this, which);
-            ClassLoader cl = getClassLoader0();
-            if ((ccl != null) && (ccl != cl) &&
-                  ((cl == null) || !cl.isAncestor(ccl))) {
+            final ClassLoader ccl = ClassLoader.getClassLoader(caller);
+            final ClassLoader cl = getClassLoader0();
+            if (!isCheckMemberAccessOverridden(s)) {
+                // Inlined SecurityManager.checkMemberAccess
+                if (which != Member.PUBLIC) {
+                    if (ccl != cl) {
+                        s.checkPermission(SecurityConstants.CHECK_MEMBER_ACCESS_PERMISSION);
+                    }
+                }
+            } else {
+                // Don't refactor; otherwise break the stack depth for
+                // checkMemberAccess of subclasses of SecurityManager as specified.
+                s.checkMemberAccess(this, which);
+            }
+            this.checkPackageAccess(ccl, checkProxyInterfaces);
+        }
+    }
+
+    /*
+     * Checks if a client loaded in ClassLoader ccl is allowed to access this
+     * class under the current package access policy. If access is denied,
+     * throw a SecurityException.
+     */
+    private void checkPackageAccess(final ClassLoader ccl, boolean checkProxyInterfaces) {
+        final SecurityManager s = System.getSecurityManager();
+        if (s != null) {
+            final ClassLoader cl = getClassLoader0();
+            if (ReflectUtil.needsPackageAccessCheck(ccl, cl)) {
                 String name = this.getName();
                 int i = name.lastIndexOf('.');
                 if (i != -1) {
-                    s.checkPackageAccess(name.substring(0, i));
+                    // skip the package access check on a proxy class in default proxy package
+                    String pkg = name.substring(0, i);
+                    if (!Proxy.isProxyClass(this) || ReflectUtil.isNonPublicProxyClass(this)) {
+                        s.checkPackageAccess(pkg);
+                    }
                 }
             }
+            // check package access on the proxy interfaces
+            if (checkProxyInterfaces && Proxy.isProxyClass(this)) {
+                ReflectUtil.checkProxyPackageAccess(ccl, this.getInterfaces());
+            }
         }
     }
 
diff --git a/external/ikvm/openjdk/java/lang/ClassLoader.java b/external/ikvm/openjdk/java/lang/ClassLoader.java
index 8162ba8..57c1ee3 100644
--- a/external/ikvm/openjdk/java/lang/ClassLoader.java
+++ b/external/ikvm/openjdk/java/lang/ClassLoader.java
@@ -56,6 +56,7 @@ import sun.misc.CompoundEnumeration;
 import sun.misc.Resource;
 import sun.misc.URLClassPath;
 import sun.misc.VM;
+import sun.reflect.CallerSensitive;
 import sun.reflect.Reflection;
 import sun.security.util.SecurityConstants;
 
@@ -1256,9 +1257,11 @@ public abstract class ClassLoader {
      *
      * @since   1.7
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     protected static boolean registerAsParallelCapable() {
-        return ParallelLoaders.register(ikvm.internal.CallerID.getCallerID().getCallerClass());
+        Class<? extends ClassLoader> callerClass =
+            Reflection.getCallerClass().asSubclass(ClassLoader.class);
+        return ParallelLoaders.register(callerClass);
     }
 
     /**
@@ -1402,15 +1405,13 @@ public abstract class ClassLoader {
      *
      * @since  1.2
      */
+    @CallerSensitive
     public final ClassLoader getParent() {
         if (parent == null)
             return null;
         SecurityManager sm = System.getSecurityManager();
         if (sm != null) {
-            ClassLoader ccl = getCallerClassLoader();
-            if (ccl != null && !isAncestor(ccl)) {
-                sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
-            }
+            checkClassLoaderPermission(parent, Reflection.getCallerClass());
         }
         return parent;
     }
@@ -1470,7 +1471,7 @@ public abstract class ClassLoader {
      *
      * @revised  1.4
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static ClassLoader getSystemClassLoader() {
         initSystemClassLoader();
         if (scl == null) {
@@ -1478,10 +1479,7 @@ public abstract class ClassLoader {
         }
         SecurityManager sm = System.getSecurityManager();
         if (sm != null) {
-            ClassLoader ccl = getCallerClassLoader();
-            if (ccl != null && ccl != scl && !scl.isAncestor(ccl)) {
-                sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
-            }
+            checkClassLoaderPermission(scl, Reflection.getCallerClass());
         }
         return scl;
     }
@@ -1529,13 +1527,25 @@ public abstract class ClassLoader {
         return false;
     }
 
-    // Returns the invoker's class loader, or null if none.
-    // NOTE: This must always be invoked when there is exactly one intervening
-    // frame from the core libraries on the stack between this method's
-    // invocation and the desired invoker.
-    static ClassLoader getCallerClassLoader() {
-        // NOTE use of more generic Reflection.getCallerClass()
-        Class caller = Reflection.getCallerClass(3);
+    // Tests if class loader access requires "getClassLoader" permission
+    // check.  A class loader 'from' can access class loader 'to' if
+    // class loader 'from' is same as class loader 'to' or an ancestor
+    // of 'to'.  The class loader in a system domain can access
+    // any class loader.
+    private static boolean needsClassLoaderPermissionCheck(ClassLoader from,
+                                                           ClassLoader to)
+    {
+        if (from == to)
+            return false;
+
+        if (from == null)
+            return false;
+
+        return !to.isAncestor(from);
+    }
+
+    // Returns the class's class loader, or null if none.
+    static ClassLoader getClassLoader(Class<?> caller) {
         // This can be null if the VM is requesting it
         if (caller == null) {
             return null;
@@ -1544,6 +1554,17 @@ public abstract class ClassLoader {
         return caller.getClassLoader0();
     }
 
+    static void checkClassLoaderPermission(ClassLoader cl, Class<?> caller) {
+        SecurityManager sm = System.getSecurityManager();
+        if (sm != null) {
+            // caller can be null if the VM is requesting it
+            ClassLoader ccl = getClassLoader(caller);
+            if (needsClassLoaderPermissionCheck(ccl, cl)) {
+                sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
+            }
+        }
+    }
+
     // The class loader for the system
     // @GuardedBy("ClassLoader.class")
     private static ClassLoader scl;
diff --git a/external/ikvm/openjdk/java/lang/Package.java b/external/ikvm/openjdk/java/lang/Package.java
new file mode 100644
index 0000000..395cf33
--- /dev/null
+++ b/external/ikvm/openjdk/java/lang/Package.java
@@ -0,0 +1,615 @@
+/*
+ * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang;
+
+import java.io.InputStream;
+import java.util.Enumeration;
+
+import java.util.StringTokenizer;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+import java.util.jar.Attributes;
+import java.util.jar.Attributes.Name;
+import java.util.jar.JarException;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import java.lang.annotation.Annotation;
+import sun.net.www.ParseUtil;
+import sun.reflect.CallerSensitive;
+import sun.reflect.Reflection;
+
+/**
+ * {@code Package} objects contain version information
+ * about the implementation and specification of a Java package.
+ * This versioning information is retrieved and made available
+ * by the {@link ClassLoader} instance that
+ * loaded the class(es).  Typically, it is stored in the manifest that is
+ * distributed with the classes.
+ *
+ * <p>The set of classes that make up the package may implement a
+ * particular specification and if so the specification title, version number,
+ * and vendor strings identify that specification.
+ * An application can ask if the package is
+ * compatible with a particular version, see the {@link
+ * #isCompatibleWith isCompatibleWith}
+ * method for details.
+ *
+ * <p>Specification version numbers use a syntax that consists of nonnegative
+ * decimal integers separated by periods ".", for example "2.0" or
+ * "1.2.3.4.5.6.7".  This allows an extensible number to be used to represent
+ * major, minor, micro, etc. versions.  The version specification is described
+ * by the following formal grammar:
+ * <blockquote>
+ * <dl>
+ * <dt><i>SpecificationVersion:
+ * <dd>Digits RefinedVersion<sub>opt</sub></i>
+
+ * <p><dt><i>RefinedVersion:</i>
+ * <dd>{@code .} <i>Digits</i>
+ * <dd>{@code .} <i>Digits RefinedVersion</i>
+ *
+ * <p><dt><i>Digits:
+ * <dd>Digit
+ * <dd>Digits</i>
+ *
+ * <p><dt><i>Digit:</i>
+ * <dd>any character for which {@link Character#isDigit} returns {@code true},
+ * e.g. 0, 1, 2, ...
+ * </dl>
+ * </blockquote>
+ *
+ * <p>The implementation title, version, and vendor strings identify an
+ * implementation and are made available conveniently to enable accurate
+ * reporting of the packages involved when a problem occurs. The contents
+ * all three implementation strings are vendor specific. The
+ * implementation version strings have no specified syntax and should
+ * only be compared for equality with desired version identifiers.
+ *
+ * <p>Within each {@code ClassLoader} instance all classes from the same
+ * java package have the same Package object.  The static methods allow a package
+ * to be found by name or the set of all packages known to the current class
+ * loader to be found.
+ *
+ * @see ClassLoader#definePackage
+ */
+public class Package implements java.lang.reflect.AnnotatedElement {
+    /**
+     * Return the name of this package.
+     *
+     * @return  The fully-qualified name of this package as defined in section 6.5.3 of
+     *          <cite>The Java™ Language Specification</cite>,
+     *          for example, {@code java.lang}
+     */
+    public String getName() {
+        return pkgName;
+    }
+
+
+    /**
+     * Return the title of the specification that this package implements.
+     * @return the specification title, null is returned if it is not known.
+     */
+    public String getSpecificationTitle() {
+        return specTitle;
+    }
+
+    /**
+     * Returns the version number of the specification
+     * that this package implements.
+     * This version string must be a sequence of nonnegative decimal
+     * integers separated by "."'s and may have leading zeros.
+     * When version strings are compared the most significant
+     * numbers are compared.
+     * @return the specification version, null is returned if it is not known.
+     */
+    public String getSpecificationVersion() {
+        return specVersion;
+    }
+
+    /**
+     * Return the name of the organization, vendor,
+     * or company that owns and maintains the specification
+     * of the classes that implement this package.
+     * @return the specification vendor, null is returned if it is not known.
+     */
+    public String getSpecificationVendor() {
+        return specVendor;
+    }
+
+    /**
+     * Return the title of this package.
+     * @return the title of the implementation, null is returned if it is not known.
+     */
+    public String getImplementationTitle() {
+        return implTitle;
+    }
+
+    /**
+     * Return the version of this implementation. It consists of any string
+     * assigned by the vendor of this implementation and does
+     * not have any particular syntax specified or expected by the Java
+     * runtime. It may be compared for equality with other
+     * package version strings used for this implementation
+     * by this vendor for this package.
+     * @return the version of the implementation, null is returned if it is not known.
+     */
+    public String getImplementationVersion() {
+        return implVersion;
+    }
+
+    /**
+     * Returns the name of the organization,
+     * vendor or company that provided this implementation.
+     * @return the vendor that implemented this package..
+     */
+    public String getImplementationVendor() {
+        return implVendor;
+    }
+
+    /**
+     * Returns true if this package is sealed.
+     *
+     * @return true if the package is sealed, false otherwise
+     */
+    public boolean isSealed() {
+        return sealBase != null;
+    }
+
+    /**
+     * Returns true if this package is sealed with respect to the specified
+     * code source url.
+     *
+     * @param url the code source url
+     * @return true if this package is sealed with respect to url
+     */
+    public boolean isSealed(URL url) {
+        return url.equals(sealBase);
+    }
+
+    /**
+     * Compare this package's specification version with a
+     * desired version. It returns true if
+     * this packages specification version number is greater than or equal
+     * to the desired version number. <p>
+     *
+     * Version numbers are compared by sequentially comparing corresponding
+     * components of the desired and specification strings.
+     * Each component is converted as a decimal integer and the values
+     * compared.
+     * If the specification value is greater than the desired
+     * value true is returned. If the value is less false is returned.
+     * If the values are equal the period is skipped and the next pair of
+     * components is compared.
+     *
+     * @param desired the version string of the desired version.
+     * @return true if this package's version number is greater
+     *          than or equal to the desired version number
+     *
+     * @exception NumberFormatException if the desired or current version
+     *          is not of the correct dotted form.
+     */
+    public boolean isCompatibleWith(String desired)
+        throws NumberFormatException
+    {
+        if (specVersion == null || specVersion.length() < 1) {
+            throw new NumberFormatException("Empty version string");
+        }
+
+        String [] sa = specVersion.split("\\.", -1);
+        int [] si = new int[sa.length];
+        for (int i = 0; i < sa.length; i++) {
+            si[i] = Integer.parseInt(sa[i]);
+            if (si[i] < 0)
+                throw NumberFormatException.forInputString("" + si[i]);
+        }
+
+        String [] da = desired.split("\\.", -1);
+        int [] di = new int[da.length];
+        for (int i = 0; i < da.length; i++) {
+            di[i] = Integer.parseInt(da[i]);
+            if (di[i] < 0)
+                throw NumberFormatException.forInputString("" + di[i]);
+        }
+
+        int len = Math.max(di.length, si.length);
+        for (int i = 0; i < len; i++) {
+            int d = (i < di.length ? di[i] : 0);
+            int s = (i < si.length ? si[i] : 0);
+            if (s < d)
+                return false;
+            if (s > d)
+                return true;
+        }
+        return true;
+    }
+
+    /**
+     * Find a package by name in the callers {@code ClassLoader} instance.
+     * The callers {@code ClassLoader} instance is used to find the package
+     * instance corresponding to the named class. If the callers
+     * {@code ClassLoader} instance is null then the set of packages loaded
+     * by the system {@code ClassLoader} instance is searched to find the
+     * named package. <p>
+     *
+     * Packages have attributes for versions and specifications only if the class
+     * loader created the package instance with the appropriate attributes. Typically,
+     * those attributes are defined in the manifests that accompany the classes.
+     *
+     * @param name a package name, for example, java.lang.
+     * @return the package of the requested name. It may be null if no package
+     *          information is available from the archive or codebase.
+     */
+    @CallerSensitive
+    public static Package getPackage(String name) {
+        ClassLoader l = ClassLoader.getClassLoader(Reflection.getCallerClass());
+        if (l != null) {
+            return l.getPackage(name);
+        } else {
+            return getSystemPackage(name);
+        }
+    }
+
+    /**
+     * Get all the packages currently known for the caller's {@code ClassLoader}
+     * instance.  Those packages correspond to classes loaded via or accessible by
+     * name to that {@code ClassLoader} instance.  If the caller's
+     * {@code ClassLoader} instance is the bootstrap {@code ClassLoader}
+     * instance, which may be represented by {@code null} in some implementations,
+     * only packages corresponding to classes loaded by the bootstrap
+     * {@code ClassLoader} instance will be returned.
+     *
+     * @return a new array of packages known to the callers {@code ClassLoader}
+     * instance.  An zero length array is returned if none are known.
+     */
+    @CallerSensitive
+    public static Package[] getPackages() {
+        ClassLoader l = ClassLoader.getClassLoader(Reflection.getCallerClass());
+        if (l != null) {
+            return l.getPackages();
+        } else {
+            return getSystemPackages();
+        }
+    }
+
+    /**
+     * Get the package for the specified class.
+     * The class's class loader is used to find the package instance
+     * corresponding to the specified class. If the class loader
+     * is the bootstrap class loader, which may be represented by
+     * {@code null} in some implementations, then the set of packages
+     * loaded by the bootstrap class loader is searched to find the package.
+     * <p>
+     * Packages have attributes for versions and specifications only
+     * if the class loader created the package
+     * instance with the appropriate attributes. Typically those
+     * attributes are defined in the manifests that accompany
+     * the classes.
+     *
+     * @param class the class to get the package of.
+     * @return the package of the class. It may be null if no package
+     *          information is available from the archive or codebase.  */
+    static Package getPackage(Class<?> c) {
+        String name = c.getName();
+        int i = name.lastIndexOf('.');
+        if (i != -1) {
+            name = name.substring(0, i);
+            ClassLoader cl = c.getClassLoader();
+            if (cl != null) {
+                return cl.getPackage(name);
+            } else {
+                return getSystemPackage(name);
+            }
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Return the hash code computed from the package name.
+     * @return the hash code computed from the package name.
+     */
+    public int hashCode(){
+        return pkgName.hashCode();
+    }
+
+    /**
+     * Returns the string representation of this Package.
+     * Its value is the string "package " and the package name.
+     * If the package title is defined it is appended.
+     * If the package version is defined it is appended.
+     * @return the string representation of the package.
+     */
+    public String toString() {
+        String spec = specTitle;
+        String ver =  specVersion;
+        if (spec != null && spec.length() > 0)
+            spec = ", " + spec;
+        else
+            spec = "";
+        if (ver != null && ver.length() > 0)
+            ver = ", version " + ver;
+        else
+            ver = "";
+        return "package " + pkgName + spec + ver;
+    }
+
+    private Class<?> getPackageInfo() {
+        if (packageInfo == null) {
+            try {
+                packageInfo = Class.forName(pkgName + ".package-info", false, loader);
+            } catch (ClassNotFoundException ex) {
+                // store a proxy for the package info that has no annotations
+                class PackageInfoProxy {}
+                packageInfo = PackageInfoProxy.class;
+            }
+        }
+        return packageInfo;
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @since 1.5
+     */
+    public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
+        return getPackageInfo().getAnnotation(annotationClass);
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @since 1.5
+     */
+    public boolean isAnnotationPresent(
+        Class<? extends Annotation> annotationClass) {
+        return getPackageInfo().isAnnotationPresent(annotationClass);
+    }
+
+    /**
+     * @since 1.5
+     */
+    public Annotation[] getAnnotations() {
+        return getPackageInfo().getAnnotations();
+    }
+
+    /**
+     * @since 1.5
+     */
+    public Annotation[] getDeclaredAnnotations()  {
+        return getPackageInfo().getDeclaredAnnotations();
+    }
+
+    /**
+     * Construct a package instance with the specified version
+     * information.
+     * @param pkgName the name of the package
+     * @param spectitle the title of the specification
+     * @param specversion the version of the specification
+     * @param specvendor the organization that maintains the specification
+     * @param impltitle the title of the implementation
+     * @param implversion the version of the implementation
+     * @param implvendor the organization that maintains the implementation
+     * @return a new package for containing the specified information.
+     */
+    Package(String name,
+            String spectitle, String specversion, String specvendor,
+            String impltitle, String implversion, String implvendor,
+            URL sealbase, ClassLoader loader)
+    {
+        pkgName = name;
+        implTitle = impltitle;
+        implVersion = implversion;
+        implVendor = implvendor;
+        specTitle = spectitle;
+        specVersion = specversion;
+        specVendor = specvendor;
+        sealBase = sealbase;
+        this.loader = loader;
+    }
+
+    /*
+     * Construct a package using the attributes from the specified manifest.
+     *
+     * @param name the package name
+     * @param man the optional manifest for the package
+     * @param url the optional code source url for the package
+     */
+    private Package(String name, Manifest man, URL url, ClassLoader loader) {
+        String path = name.replace('.', '/').concat("/");
+        String sealed = null;
+        String specTitle= null;
+        String specVersion= null;
+        String specVendor= null;
+        String implTitle= null;
+        String implVersion= null;
+        String implVendor= null;
+        URL sealBase= null;
+        Attributes attr = man.getAttributes(path);
+        if (attr != null) {
+            specTitle   = attr.getValue(Name.SPECIFICATION_TITLE);
+            specVersion = attr.getValue(Name.SPECIFICATION_VERSION);
+            specVendor  = attr.getValue(Name.SPECIFICATION_VENDOR);
+            implTitle   = attr.getValue(Name.IMPLEMENTATION_TITLE);
+            implVersion = attr.getValue(Name.IMPLEMENTATION_VERSION);
+            implVendor  = attr.getValue(Name.IMPLEMENTATION_VENDOR);
+            sealed      = attr.getValue(Name.SEALED);
+        }
+        attr = man.getMainAttributes();
+        if (attr != null) {
+            if (specTitle == null) {
+                specTitle = attr.getValue(Name.SPECIFICATION_TITLE);
+            }
+            if (specVersion == null) {
+                specVersion = attr.getValue(Name.SPECIFICATION_VERSION);
+            }
+            if (specVendor == null) {
+                specVendor = attr.getValue(Name.SPECIFICATION_VENDOR);
+            }
+            if (implTitle == null) {
+                implTitle = attr.getValue(Name.IMPLEMENTATION_TITLE);
+            }
+            if (implVersion == null) {
+                implVersion = attr.getValue(Name.IMPLEMENTATION_VERSION);
+            }
+            if (implVendor == null) {
+                implVendor = attr.getValue(Name.IMPLEMENTATION_VENDOR);
+            }
+            if (sealed == null) {
+                sealed = attr.getValue(Name.SEALED);
+            }
+        }
+        if ("true".equalsIgnoreCase(sealed)) {
+            sealBase = url;
+        }
+        pkgName = name;
+        this.specTitle = specTitle;
+        this.specVersion = specVersion;
+        this.specVendor = specVendor;
+        this.implTitle = implTitle;
+        this.implVersion = implVersion;
+        this.implVendor = implVendor;
+        this.sealBase = sealBase;
+        this.loader = loader;
+    }
+
+    /*
+     * Returns the loaded system package for the specified name.
+     */
+    static Package getSystemPackage(String name) {
+        synchronized (pkgs) {
+            Package pkg = pkgs.get(name);
+            if (pkg == null) {
+                name = name.replace('.', '/').concat("/");
+                String fn = getSystemPackage0(name);
+                if (fn != null) {
+                    pkg = defineSystemPackage(name, fn);
+                }
+            }
+            return pkg;
+        }
+    }
+
+    /*
+     * Return an array of loaded system packages.
+     */
+    static Package[] getSystemPackages() {
+        // First, update the system package map with new package names
+        String[] names = getSystemPackages0();
+        synchronized (pkgs) {
+            for (int i = 0; i < names.length; i++) {
+                defineSystemPackage(names[i], getSystemPackage0(names[i]));
+            }
+            return pkgs.values().toArray(new Package[pkgs.size()]);
+        }
+    }
+
+    private static Package defineSystemPackage(final String iname,
+                                               final String fn)
+    {
+        return AccessController.doPrivileged(new PrivilegedAction<Package>() {
+            public Package run() {
+                String name = iname;
+                // Get the cached code source url for the file name
+                URL url = urls.get(fn);
+                if (url == null) {
+                    // URL not found, so create one
+                    File file = new File(fn);
+                    try {
+                        url = ParseUtil.fileToEncodedURL(file);
+                    } catch (MalformedURLException e) {
+                    }
+                    if (url != null) {
+                        urls.put(fn, url);
+                        // If loading a JAR file, then also cache the manifest
+                        if (file.isFile()) {
+                            mans.put(fn, loadManifest(fn));
+                        }
+                    }
+                }
+                // Convert to "."-separated package name
+                name = name.substring(0, name.length() - 1).replace('/', '.');
+                Package pkg;
+                Manifest man = mans.get(fn);
+                if (man != null) {
+                    pkg = new Package(name, man, url, null);
+                } else {
+                    pkg = new Package(name, null, null, null,
+                                      null, null, null, null, null);
+                }
+                pkgs.put(name, pkg);
+                return pkg;
+            }
+        });
+    }
+
+    /*
+     * Returns the Manifest for the specified JAR file name.
+     */
+    private static Manifest loadManifest(String fn) {
+        try (FileInputStream fis = new FileInputStream(fn);
+             JarInputStream jis = new JarInputStream(fis, false))
+        {
+            return jis.getManifest();
+        } catch (IOException e) {
+            return null;
+        }
+    }
+
+    // The map of loaded system packages
+    private static Map<String, Package> pkgs = new HashMap<>(31);
+
+    // Maps each directory or zip file name to its corresponding url
+    private static Map<String, URL> urls = new HashMap<>(10);
+
+    // Maps each code source url for a jar file to its manifest
+    private static Map<String, Manifest> mans = new HashMap<>(10);
+
+    private static native String getSystemPackage0(String name);
+    private static native String[] getSystemPackages0();
+
+    /*
+     * Private storage for the package name and attributes.
+     */
+    private final String pkgName;
+    private final String specTitle;
+    private final String specVersion;
+    private final String specVendor;
+    private final String implTitle;
+    private final String implVersion;
+    private final String implVendor;
+    private final URL sealBase;
+    private transient final ClassLoader loader;
+    private transient Class packageInfo;
+}
diff --git a/external/ikvm/openjdk/java/lang/System.java b/external/ikvm/openjdk/java/lang/System.java
index e6f4d3c..e74187b 100644
--- a/external/ikvm/openjdk/java/lang/System.java
+++ b/external/ikvm/openjdk/java/lang/System.java
@@ -33,7 +33,7 @@ import java.security.PrivilegedAction;
 import java.security.AllPermission;
 import java.nio.channels.Channel;
 import java.nio.channels.spi.SelectorProvider;
-
+import sun.reflect.CallerSensitive;
 import sun.reflect.Reflection;
 import sun.security.util.SecurityConstants;
 
@@ -1105,9 +1105,9 @@ public final class System {
      * @see        java.lang.Runtime#load(java.lang.String)
      * @see        java.lang.SecurityManager#checkLink(java.lang.String)
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static void load(String filename) {
-        Runtime.getRuntime().load0(Reflection.getCallerClass(2), filename);
+        Runtime.getRuntime().load0(Reflection.getCallerClass(), filename);
     }
 
     /**
@@ -1131,9 +1131,9 @@ public final class System {
      * @see        java.lang.Runtime#loadLibrary(java.lang.String)
      * @see        java.lang.SecurityManager#checkLink(java.lang.String)
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static void loadLibrary(String libname) {
-        Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(2), libname);
+        Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);
     }
 
     /**
@@ -1160,7 +1160,6 @@ public final class System {
             return "lib" + libname + ".so";
         }
     }
-
     /* returns the class of the caller. */
     static Class<?> getCallerClass() {
         // NOTE use of more generic Reflection.getCallerClass()
diff --git a/external/ikvm/openjdk/java/lang/Thread.java b/external/ikvm/openjdk/java/lang/Thread.java
index 3de50ff..e8f57d0 100644
--- a/external/ikvm/openjdk/java/lang/Thread.java
+++ b/external/ikvm/openjdk/java/lang/Thread.java
@@ -37,6 +37,8 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.locks.LockSupport;
 import sun.nio.ch.Interruptible;
+import sun.reflect.CallerSensitive;
+import sun.reflect.Reflection;
 import sun.security.util.SecurityConstants;
 
 
@@ -169,7 +171,7 @@ class Thread implements Runnable {
     private cli.System.Threading.Thread nativeThread;
     private Throwable stillborn;
     private boolean running;    // used only for coordination with stop0(), is never set to false
-    private boolean interruptPending;
+    private volatile boolean interruptPending;
     private volatile boolean nativeInterruptPending;
     private volatile boolean interruptableWait;
     private boolean timedWait;
@@ -1228,7 +1230,12 @@ class Thread implements Runnable {
      * @revised 6.0
      */
     public static boolean interrupted() {
-        return currentThread().isInterrupted(true);
+        Thread current = currentThread();
+        if (!current.interruptPending) {
+            return false;
+        }
+        current.interruptPending = false;
+        return true;
     }
 
     /**
@@ -1245,22 +1252,7 @@ class Thread implements Runnable {
      * @revised 6.0
      */
     public boolean isInterrupted() {
-        return isInterrupted(false);
-    }
-
-    /**
-     * Tests if some Thread has been interrupted.  The interrupted state
-     * is reset or not based on the value of ClearInterrupted that is
-     * passed.
-     */
-    private boolean isInterrupted(boolean ClearInterrupted) {
-        synchronized (lock) {
-            boolean b = interruptPending;
-            if (ClearInterrupted) {
-                interruptPending = false;
-            }
-            return b;
-        }
+        return interruptPending;
     }
 
     /**
@@ -1723,19 +1715,18 @@ class Thread implements Runnable {
      *
      * @since 1.2
      */
+    @CallerSensitive
     public ClassLoader getContextClassLoader() {
         if (contextClassLoader == ClassLoader.DUMMY) {
             contextClassLoader = ClassLoader.getSystemClassLoader();
         }
         if (contextClassLoader == null)
             return null;
+
         SecurityManager sm = System.getSecurityManager();
         if (sm != null) {
-            ClassLoader ccl = ClassLoader.getCallerClassLoader();
-            if (ccl != null && ccl != contextClassLoader &&
-                    !contextClassLoader.isAncestor(ccl)) {
-                sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
-            }
+            ClassLoader.checkClassLoaderPermission(contextClassLoader,
+                                                   Reflection.getCallerClass());
         }
         return contextClassLoader;
     }
diff --git a/external/ikvm/openjdk/java/lang/invoke/MethodHandles.java b/external/ikvm/openjdk/java/lang/invoke/MethodHandles.java
index 710d6ab..6f0db40 100644
--- a/external/ikvm/openjdk/java/lang/invoke/MethodHandles.java
+++ b/external/ikvm/openjdk/java/lang/invoke/MethodHandles.java
@@ -33,11 +33,10 @@ import sun.invoke.util.Wrapper;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Arrays;
+import sun.reflect.CallerSensitive;
 import sun.reflect.Reflection;
 import static java.lang.invoke.MethodHandleStatics.*;
 import static java.lang.invoke.MethodHandleNatives.Constants.*;
-import ikvm.internal.CallerID;
-import ikvm.internal.HasCallerID;
 
 /**
  * This class consists exclusively of static methods that operate on or return
@@ -68,9 +67,9 @@ public class MethodHandles {
      * This lookup object is a <em>capability</em> which may be delegated to trusted agents.
      * Do not store it in place where untrusted code can access it.
      */
-    @HasCallerID
+    @CallerSensitive
     public static Lookup lookup() {
-        return new Lookup(CallerID.getCallerID());
+        return new Lookup(Reflection.getCallerClass());
     }
 
     /**
@@ -412,14 +411,9 @@ public class MethodHandles {
          * Also, don't make it private, lest javac interpose
          * an access$N method.
          */
-        Lookup(CallerID caller) {
-            this(caller.getCallerClass(), ALL_MODES);
-            // make sure we haven't accidentally picked up a privileged class:
-            checkUnprivilegedlookupClass(lookupClass);
-        }
-
         Lookup(Class<?> lookupClass) {
             this(lookupClass, ALL_MODES);
+            checkUnprivilegedlookupClass(lookupClass);
         }
 
         private Lookup(Class<?> lookupClass, int allowedModes) {
diff --git a/external/ikvm/openjdk/java/lang/reflect/Constructor.java b/external/ikvm/openjdk/java/lang/reflect/Constructor.java
index e62e877..b13d30a 100644
--- a/external/ikvm/openjdk/java/lang/reflect/Constructor.java
+++ b/external/ikvm/openjdk/java/lang/reflect/Constructor.java
@@ -25,6 +25,7 @@
 
 package java.lang.reflect;
 
+import sun.reflect.CallerSensitive;
 import sun.reflect.ConstructorAccessor;
 import sun.reflect.Reflection;
 import sun.reflect.generics.repository.ConstructorRepository;
@@ -501,15 +502,14 @@ public final
      * @exception ExceptionInInitializerError if the initialization provoked
      *              by this method fails.
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public T newInstance(Object ... initargs)
         throws InstantiationException, IllegalAccessException,
                IllegalArgumentException, InvocationTargetException
     {
         if (!override) {
             if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
-                Class<?> caller = Reflection.getCallerClass(2);
-
+                Class<?> caller = Reflection.getCallerClass();
                 checkAccess(caller, clazz, null, modifiers);
             }
         }
diff --git a/external/ikvm/openjdk/java/lang/reflect/Field.java b/external/ikvm/openjdk/java/lang/reflect/Field.java
index c796d20..b2cb46b 100644
--- a/external/ikvm/openjdk/java/lang/reflect/Field.java
+++ b/external/ikvm/openjdk/java/lang/reflect/Field.java
@@ -25,6 +25,7 @@
 
 package java.lang.reflect;
 
+import sun.reflect.CallerSensitive;
 import sun.reflect.FieldAccessor;
 import sun.reflect.Reflection;
 import sun.reflect.generics.repository.FieldRepository;
@@ -34,7 +35,6 @@ import sun.reflect.generics.scope.ClassScope;
 import java.lang.annotation.Annotation;
 import java.util.Map;
 import sun.reflect.annotation.AnnotationParser;
-import ikvm.internal.CallerID;
 
 
 /**
@@ -365,11 +365,16 @@ class Field extends AccessibleObject implements Member {
      * @exception ExceptionInInitializerError if the initialization provoked
      *              by this method fails.
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Object get(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).get(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).get(obj);
     }
 
     /**
@@ -394,11 +399,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#get
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public boolean getBoolean(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).getBoolean(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).getBoolean(obj);
     }
 
     /**
@@ -423,11 +433,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#get
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public byte getByte(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).getByte(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).getByte(obj);
     }
 
     /**
@@ -454,11 +469,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see Field#get
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public char getChar(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).getChar(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).getChar(obj);
     }
 
     /**
@@ -485,11 +505,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#get
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public short getShort(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).getShort(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).getShort(obj);
     }
 
     /**
@@ -516,11 +541,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#get
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public int getInt(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).getInt(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).getInt(obj);
     }
 
     /**
@@ -547,11 +577,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#get
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public long getLong(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).getLong(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).getLong(obj);
     }
 
     /**
@@ -578,11 +613,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see Field#get
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public float getFloat(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).getFloat(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).getFloat(obj);
     }
 
     /**
@@ -609,11 +649,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#get
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public double getDouble(Object obj)
         throws IllegalArgumentException, IllegalAccessException
     {
-        return getFieldAccessor(obj, CallerID.getCallerID()).getDouble(obj);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        return getFieldAccessor(obj).getDouble(obj);
     }
 
     /**
@@ -682,11 +727,16 @@ class Field extends AccessibleObject implements Member {
      * @exception ExceptionInInitializerError if the initialization provoked
      *              by this method fails.
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void set(Object obj, Object value)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).set(obj, value);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).set(obj, value);
     }
 
     /**
@@ -713,11 +763,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#set
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void setBoolean(Object obj, boolean z)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).setBoolean(obj, z);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).setBoolean(obj, z);
     }
 
     /**
@@ -744,11 +799,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#set
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void setByte(Object obj, byte b)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).setByte(obj, b);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).setByte(obj, b);
     }
 
     /**
@@ -775,11 +835,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#set
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void setChar(Object obj, char c)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).setChar(obj, c);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).setChar(obj, c);
     }
 
     /**
@@ -806,11 +871,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#set
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void setShort(Object obj, short s)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).setShort(obj, s);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).setShort(obj, s);
     }
 
     /**
@@ -837,11 +907,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#set
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void setInt(Object obj, int i)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).setInt(obj, i);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).setInt(obj, i);
     }
 
     /**
@@ -868,11 +943,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#set
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void setLong(Object obj, long l)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).setLong(obj, l);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).setLong(obj, l);
     }
 
     /**
@@ -899,11 +979,16 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#set
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void setFloat(Object obj, float f)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).setFloat(obj, f);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).setFloat(obj, f);
     }
 
     /**
@@ -930,21 +1015,25 @@ class Field extends AccessibleObject implements Member {
      *              by this method fails.
      * @see       Field#set
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public void setDouble(Object obj, double d)
         throws IllegalArgumentException, IllegalAccessException
     {
-        getFieldAccessor(obj, CallerID.getCallerID()).setDouble(obj, d);
+        if (!override) {
+            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
+                checkAccess(Reflection.getCallerClass(), clazz, obj, modifiers);
+            }
+        }
+        getFieldAccessor(obj).setDouble(obj, d);
     }
 
-    // Convenience routine which performs security checks
-    private FieldAccessor getFieldAccessor(Object obj, CallerID callerID)
+    // security check is done before calling this method
+    private FieldAccessor getFieldAccessor(Object obj)
         throws IllegalAccessException
     {
-        doSecurityCheck(obj, callerID);
         boolean ov = override;
-        FieldAccessor a = (ov)? overrideFieldAccessor : fieldAccessor;
-        return (a != null)? a : acquireFieldAccessor(ov);
+        FieldAccessor a = (ov) ? overrideFieldAccessor : fieldAccessor;
+        return (a != null) ? a : acquireFieldAccessor(ov);
     }
 
     // NOTE that there is no synchronization used here. It is correct
@@ -989,19 +1078,6 @@ class Field extends AccessibleObject implements Member {
         }
     }
 
-    // NOTE: be very careful if you change the stack depth of this
-    // routine. The depth of the "getCallerClass" call is hardwired so
-    // that the compiler can have an easier time if this gets inlined.
-    private void doSecurityCheck(Object obj, CallerID callerID) throws IllegalAccessException {
-        if (!override) {
-            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
-                Class<?> caller = callerID.getCallerClass();
-
-                checkAccess(caller, clazz, obj, modifiers);
-            }
-        }
-    }
-
     /*
      * Utility routine to paper over array type names
      */
diff --git a/external/ikvm/openjdk/java/lang/reflect/Method.java b/external/ikvm/openjdk/java/lang/reflect/Method.java
index b1548d6..dce789a 100644
--- a/external/ikvm/openjdk/java/lang/reflect/Method.java
+++ b/external/ikvm/openjdk/java/lang/reflect/Method.java
@@ -26,6 +26,7 @@
 package java.lang.reflect;
 
 import ikvm.internal.CallerID;
+import sun.reflect.CallerSensitive;
 import sun.reflect.MethodAccessor;
 import sun.reflect.Reflection;
 import sun.reflect.generics.repository.MethodRepository;
@@ -578,15 +579,14 @@ public final
      * @exception ExceptionInInitializerError if the initialization
      * provoked by this method fails.
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public Object invoke(Object obj, Object... args)
         throws IllegalAccessException, IllegalArgumentException,
            InvocationTargetException
     {
         if (!override) {
             if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
-                Class<?> caller = CallerID.getCallerID().getCallerClass();
-
+                Class<?> caller = Reflection.getCallerClass();
                 checkAccess(caller, clazz, obj, modifiers);
             }
         }
diff --git a/external/ikvm/openjdk/java/lang/reflect/Proxy.java b/external/ikvm/openjdk/java/lang/reflect/Proxy.java
index d4a391f..3d9850e 100644
--- a/external/ikvm/openjdk/java/lang/reflect/Proxy.java
+++ b/external/ikvm/openjdk/java/lang/reflect/Proxy.java
@@ -27,6 +27,9 @@ package java.lang.reflect;
 
 import java.lang.ref.Reference;
 import java.lang.ref.WeakReference;
+import java.security.AccessController;
+import java.security.Permission;
+import java.security.PrivilegedAction;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -36,6 +39,10 @@ import java.util.Set;
 import java.util.List;
 import java.util.WeakHashMap;
 import sun.misc.ProxyGenerator;
+import sun.reflect.CallerSensitive;
+import sun.reflect.Reflection;
+import sun.reflect.misc.ReflectUtil;
+import sun.security.util.SecurityConstants;
 
 /**
  * {@code Proxy} provides static methods for creating dynamic proxy
@@ -265,9 +272,67 @@ public class Proxy implements java.io.Serializable {
      * @param   h the invocation handler for this proxy instance
      */
     protected Proxy(InvocationHandler h) {
+        doNewInstanceCheck();
         this.h = h;
     }
 
+    private static class ProxyAccessHelper {
+        // The permission is implementation specific.
+        static final Permission PROXY_PERMISSION =
+            new ReflectPermission("proxyConstructorNewInstance");
+        // These system properties are defined to provide a short-term
+        // workaround if customers need to disable the new security checks.
+        static final boolean allowNewInstance;
+        static final boolean allowNullLoader;
+        static {
+            allowNewInstance = getBooleanProperty("sun.reflect.proxy.allowsNewInstance");
+            allowNullLoader = getBooleanProperty("sun.reflect.proxy.allowsNullLoader");
+        }
+
+        private static boolean getBooleanProperty(final String key) {
+            String s = AccessController.doPrivileged(new PrivilegedAction<String>() {
+                public String run() {
+                    return System.getProperty(key);
+                }
+            });
+            return Boolean.valueOf(s);
+        }
+
+        static boolean needsNewInstanceCheck(Class<?> proxyClass) {
+            if (!Proxy.isProxyClass(proxyClass) || allowNewInstance) {
+                return false;
+            }
+
+            if (ReflectUtil.isNonPublicProxyClass(proxyClass)) {
+                for (Class<?> intf : proxyClass.getInterfaces()) {
+                    if (!Modifier.isPublic(intf.getModifiers())) {
+                        return true;
+                    }
+                }
+            }
+            return false;
+        }
+    }
+
+    /*
+     * Access check on a proxy class that implements any non-public interface.
+     *
+     * @throws  SecurityException if a security manager exists, and
+     *          the caller does not have the permission.
+     */
+    private void doNewInstanceCheck() {
+        SecurityManager sm = System.getSecurityManager();
+        Class<?> proxyClass = this.getClass();
+        if (sm != null && ProxyAccessHelper.needsNewInstanceCheck(proxyClass)) {
+            try {
+                sm.checkPermission(ProxyAccessHelper.PROXY_PERMISSION);
+            } catch (SecurityException e) {
+                throw new SecurityException("Not allowed to construct a Proxy "
+                        + "instance that implements a non-public interface", e);
+            }
+        }
+    }
+
     /**
      * Returns the {@code java.lang.Class} object for a proxy class
      * given a class loader and an array of interfaces.  The proxy class
@@ -342,10 +407,59 @@ public class Proxy implements java.io.Serializable {
      * @throws  NullPointerException if the {@code interfaces} array
      *          argument or any of its elements are {@code null}
      */
+    @CallerSensitive
     public static Class<?> getProxyClass(ClassLoader loader,
                                          Class<?>... interfaces)
         throws IllegalArgumentException
     {
+        SecurityManager sm = System.getSecurityManager();
+        if (sm != null) {
+            checkProxyAccess(Reflection.getCallerClass(), loader, interfaces);
+        }
+
+        return getProxyClass0(loader, interfaces);
+    }
+
+    /*
+     * Check permissions required to create a Proxy class.
+     *
+     * To define a proxy class, it performs the access checks as in
+     * Class.forName (VM will invoke ClassLoader.checkPackageAccess):
+     * 1. "getClassLoader" permission check if loader == null
+     * 2. checkPackageAccess on the interfaces it implements
+     *
+     * To get a constructor and new instance of a proxy class, it performs
+     * the package access check on the interfaces it implements
+     * as in Class.getConstructor.
+     *
+     * If an interface is non-public, the proxy class must be defined by
+     * the defining loader of the interface.  If the caller's class loader
+     * is not the same as the defining loader of the interface, the VM
+     * will throw IllegalAccessError when the generated proxy class is
+     * being defined via the defineClass0 method.
+     */
+    private static void checkProxyAccess(Class<?> caller,
+                                         ClassLoader loader,
+                                         Class<?>... interfaces)
+    {
+        SecurityManager sm = System.getSecurityManager();
+        if (sm != null) {
+            ClassLoader ccl = caller.getClassLoader();
+            if (loader == null && ccl != null) {
+                if (!ProxyAccessHelper.allowNullLoader) {
+                    sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
+                }
+            }
+            ReflectUtil.checkProxyPackageAccess(ccl, interfaces);
+        }
+    }
+
+    /**
+     * Generate a proxy class.  Must call the checkProxyAccess method
+     * to perform permission checks before calling this.
+     */
+    private static Class<?> getProxyClass0(ClassLoader loader,
+                                           Class<?>... interfaces) {
         if (interfaces.length > 65535) {
             throw new IllegalArgumentException("interface limit exceeded");
         }
@@ -497,8 +611,9 @@ public class Proxy implements java.io.Serializable {
                 }
             }
 
-            if (proxyPkg == null) {     // if no non-public proxy interfaces,
-                proxyPkg = "";          // use the unnamed package
+            if (proxyPkg == null) {
+                // if no non-public proxy interfaces, use com.sun.proxy package
+                proxyPkg = ReflectUtil.PROXY_PACKAGE + ".";
             }
 
 generate:   do
@@ -592,6 +707,7 @@ generate:   do
      *          if the invocation handler, {@code h}, is
      *          {@code null}
      */
+    @CallerSensitive
     public static Object newProxyInstance(ClassLoader loader,
                                           Class<?>[] interfaces,
                                           InvocationHandler h)
@@ -601,25 +717,50 @@ generate:   do
             throw new NullPointerException();
         }
 
+        final SecurityManager sm = System.getSecurityManager();
+        if (sm != null) {
+            checkProxyAccess(Reflection.getCallerClass(), loader, interfaces);
+        }
+
         /*
          * Look up or generate the designated proxy class.
          */
-        Class<?> cl = getProxyClass(loader, interfaces);
+        Class<?> cl = getProxyClass0(loader, interfaces);
 
         /*
          * Invoke its constructor with the designated invocation handler.
          */
         try {
-            Constructor cons = cl.getConstructor(constructorParams);
-            return cons.newInstance(new Object[] { h });
+            final Constructor<?> cons = cl.getConstructor(constructorParams);
+            final InvocationHandler ih = h;
+            if (sm != null && ProxyAccessHelper.needsNewInstanceCheck(cl)) {
+                // create proxy instance with doPrivilege as the proxy class may
+                // implement non-public interfaces that requires a special permission
+                return AccessController.doPrivileged(new PrivilegedAction<Object>() {
+                    public Object run() {
+                        return newInstance(cons, ih);
+                    }
+                });
+            } else {
+                return newInstance(cons, ih);
+            }
         } catch (NoSuchMethodException e) {
             throw new InternalError(e.toString());
-        } catch (IllegalAccessException e) {
-            throw new InternalError(e.toString());
-        } catch (InstantiationException e) {
+        }
+    }
+
+    private static Object newInstance(Constructor<?> cons, InvocationHandler h) {
+        try {
+            return cons.newInstance(new Object[] {h} );
+        } catch (IllegalAccessException | InstantiationException e) {
             throw new InternalError(e.toString());
         } catch (InvocationTargetException e) {
-            throw new InternalError(e.toString());
+            Throwable t = e.getCause();
+            if (t instanceof RuntimeException) {
+                throw (RuntimeException) t;
+            } else {
+                throw new InternalError(t.toString());
+            }
         }
     }
 
diff --git a/external/ikvm/openjdk/java/net/DefaultDatagramSocketImplFactory.java b/external/ikvm/openjdk/java/net/DefaultDatagramSocketImplFactory.java
index c08fba3..7d4f8ed 100644
--- a/external/ikvm/openjdk/java/net/DefaultDatagramSocketImplFactory.java
+++ b/external/ikvm/openjdk/java/net/DefaultDatagramSocketImplFactory.java
@@ -56,20 +56,34 @@ class DefaultDatagramSocketImplFactory
     /* If the version supports a dual stack TCP implementation */
     private static boolean useDualStackImpl = false;
 
+    /* sun.net.useExclusiveBind */
+    private static String exclBindProp;
+
+    /* True if exclusive binding is on for Windows */
+    private static boolean exclusiveBind = true;
+
+
     static {
         // Determine Windows Version.
-        java.security.AccessController.doPrivileged( new PrivilegedAction<Object>() {
-                public Object run() {
-                    version = 0;
-                    try {
-                        version = Float.parseFloat(System.getProperties().getProperty("os.version"));
-                        preferIPv4Stack = Boolean.parseBoolean(
-                                          System.getProperties().getProperty("java.net.preferIPv4Stack"));
-                    } catch (NumberFormatException e ) {
-                        assert false : e;
+        java.security.AccessController.doPrivileged(
+                new PrivilegedAction<Object>() {
+                    public Object run() {
+                        version = 0;
+                        try {
+                            version = Float.parseFloat(System.getProperties()
+                                    .getProperty("os.version"));
+                            preferIPv4Stack = Boolean.parseBoolean(
+                                              System.getProperties()
+                                              .getProperty(
+                                                   "java.net.preferIPv4Stack"));
+                            exclBindProp = System.getProperty(
+                                    "sun.net.useExclusiveBind");
+                        } catch (NumberFormatException e ) {
+                            assert false : e;
+                        }
+                        return null; // nothing to return
                     }
-                    return null; // nothing to return
-                } });
+                });
 
         String ipv6 = ikvm.internal.Util.SafeGetEnvironmentVariable("IKVM_IPV6");
         if (ipv6 != null) {
@@ -87,7 +101,14 @@ class DefaultDatagramSocketImplFactory
 
         // (version >= 6.0) implies Vista or greater.
         if (version >= 6.0 && !preferIPv4Stack) {
-            useDualStackImpl = true;
+                useDualStackImpl = true;
+        }
+        if (exclBindProp != null) {
+            // sun.net.useExclusiveBind is true
+            exclusiveBind = exclBindProp.length() == 0 ? true
+                    : Boolean.parseBoolean(exclBindProp);
+        } else if (version < 6.0) {
+            exclusiveBind = false;
         }
 
         // impl.prefix
@@ -119,10 +140,12 @@ class DefaultDatagramSocketImplFactory
                 throw new SocketException("can't instantiate DatagramSocketImpl");
             }
         } else {
+            if (isMulticast)
+                exclusiveBind = false;
             if (useDualStackImpl && !isMulticast)
-                return new DualStackPlainDatagramSocketImpl();
+                return new DualStackPlainDatagramSocketImpl(exclusiveBind);
             else
-                return new TwoStacksPlainDatagramSocketImpl();
+                return new TwoStacksPlainDatagramSocketImpl(exclusiveBind);
         }
     }
 }
diff --git a/external/ikvm/openjdk/java/net/DualStackPlainDatagramSocketImpl.java b/external/ikvm/openjdk/java/net/DualStackPlainDatagramSocketImpl.java
index dddc50c..1d74e28 100644
--- a/external/ikvm/openjdk/java/net/DualStackPlainDatagramSocketImpl.java
+++ b/external/ikvm/openjdk/java/net/DualStackPlainDatagramSocketImpl.java
@@ -42,6 +42,22 @@ import java.io.IOException;
 class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
 {
 
+    // true if this socket is exclusively bound
+    private final boolean exclusiveBind;
+
+    /*
+     * Set to true if SO_REUSEADDR is set after the socket is bound to
+     * indicate SO_REUSEADDR is being emulated
+     */
+    private boolean reuseAddressEmulated;
+
+    // emulates SO_REUSEADDR when exclusiveBind is true and socket is bound
+    private boolean isReuseAddress;
+
+    DualStackPlainDatagramSocketImpl(boolean exclBind) {
+        exclusiveBind = exclBind;
+    }
+
     protected void datagramSocketCreate() throws SocketException {
         if (fd == null)
             throw new SocketException("Socket closed");
@@ -58,7 +74,7 @@ class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
         if (laddr == null)
             throw new NullPointerException("argument address");
 
-        socketBind(nativefd, laddr, lport);
+        socketBind(nativefd, laddr, lport, exclusiveBind);
         if (lport == 0) {
             localPort = socketLocalPort(nativefd);
         } else {
@@ -138,6 +154,7 @@ class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
         fd.setSocket(null);
     }
 
+    @SuppressWarnings("fallthrough")
     protected void socketSetOption(int opt, Object val) throws SocketException {
         cli.System.Net.Sockets.Socket nativefd = checkAndReturnNativeFD();
 
@@ -150,6 +167,13 @@ class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
                 optionValue = ((Integer)val).intValue();
                 break;
             case SO_REUSEADDR :
+                if (exclusiveBind && localPort != 0)  {
+                    // socket already bound, emulate SO_REUSEADDR
+                    reuseAddressEmulated = true;
+                    isReuseAddress = (Boolean)val;
+                    return;
+                }
+                //Intentional fallthrough
             case SO_BROADCAST :
                 optionValue = ((Boolean)val).booleanValue() ? 1 : 0;
                 break;
@@ -167,6 +191,8 @@ class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
         if (opt == SO_BINDADDR) {
             return socketLocalAddress(nativefd);
         }
+        if (opt == SO_REUSEADDR && reuseAddressEmulated)
+            return isReuseAddress;
 
         int value = socketGetIntOption(nativefd, opt);
         Object returnValue = null;
@@ -237,10 +263,10 @@ class DualStackPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
         return ret;
     }
 
-    private static void socketBind(cli.System.Net.Sockets.Socket fd, InetAddress localAddress, int localport)
-        throws SocketException {
+    private static void socketBind(cli.System.Net.Sockets.Socket fd, InetAddress localAddress,
+            int localport, boolean exclBind) throws SocketException {
         ikvm.internal.JNI.JNIEnv env = new ikvm.internal.JNI.JNIEnv();
-        DualStackPlainDatagramSocketImpl_c.socketBind(env, fd, localAddress, localport);
+        DualStackPlainDatagramSocketImpl_c.socketBind(env, fd, localAddress, localport, exclBind);
         env.ThrowPendingException();
     }
 
diff --git a/external/ikvm/openjdk/java/net/DualStackPlainDatagramSocketImpl_c.java b/external/ikvm/openjdk/java/net/DualStackPlainDatagramSocketImpl_c.java
index 5abb110..1f4ed69 100644
--- a/external/ikvm/openjdk/java/net/DualStackPlainDatagramSocketImpl_c.java
+++ b/external/ikvm/openjdk/java/net/DualStackPlainDatagramSocketImpl_c.java
@@ -127,7 +127,7 @@ static cli.System.Net.Sockets.Socket socketCreate
  * Signature: (ILjava/net/InetAddress;I)V
  */
 static void socketBind
-  (JNIEnv env, cli.System.Net.Sockets.Socket fd, InetAddress iaObj, int port) {
+  (JNIEnv env, cli.System.Net.Sockets.Socket fd, InetAddress iaObj, int port, boolean exclBind) {
     SOCKETADDRESS sa;
     sa = new SOCKETADDRESS();
     int rv;
@@ -136,8 +136,7 @@ static void socketBind
                                  JNI_TRUE) != 0) {
         return;
     }
-
-    rv = bind(fd, sa);
+    rv = NET_WinBind(fd, sa, exclBind);
 
     if (rv == SOCKET_ERROR) {
         if (WSAGetLastError() == WSAEACCES) {
@@ -275,7 +274,7 @@ static int socketReceiveOrPeekData
         }
         fullPacket = (char *)malloc(packetBufferLen);
         if (!fullPacket) {
-            JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
+            JNU_ThrowOutOfMemoryError(env, "Native heap allocation failed");
             return -1;
         }
     } else {
@@ -424,7 +423,7 @@ static void socketSend
         }
         fullPacket = (char *)malloc(length);
         if (!fullPacket) {
-            JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
+            JNU_ThrowOutOfMemoryError(env, "Native heap allocation failed");
             return;
         }
     } else {
diff --git a/external/ikvm/openjdk/java/net/DualStackPlainSocketImpl.java b/external/ikvm/openjdk/java/net/DualStackPlainSocketImpl.java
index 4f35a6c..a3584d8 100644
--- a/external/ikvm/openjdk/java/net/DualStackPlainSocketImpl.java
+++ b/external/ikvm/openjdk/java/net/DualStackPlainSocketImpl.java
@@ -34,15 +34,25 @@ import java.io.FileDescriptor;
  * single file descriptor.
  *
  * @author Chris Hegarty
- * @author Jeroen Frijters
  */
 
 class DualStackPlainSocketImpl extends AbstractPlainSocketImpl
 {
-    public DualStackPlainSocketImpl() {}
 
-    public DualStackPlainSocketImpl(FileDescriptor fd) {
+
+    // true if this socket is exclusively bound
+    private final boolean exclusiveBind;
+
+    // emulates SO_REUSEADDR when exclusiveBind is true
+    private boolean isReuseAddress;
+
+    public DualStackPlainSocketImpl(boolean exclBind) {
+        exclusiveBind = exclBind;
+    }
+
+    public DualStackPlainSocketImpl(FileDescriptor fd, boolean exclBind) {
         this.fd = fd;
+        exclusiveBind = exclBind;
     }
 
     void socketCreate(boolean stream) throws IOException {
@@ -90,7 +100,7 @@ class DualStackPlainSocketImpl extends AbstractPlainSocketImpl
         if (address == null)
             throw new NullPointerException("inet address argument is null.");
 
-        bind0(nativefd, address, port);
+        bind0(nativefd, address, port, exclusiveBind);
         if (port == 0) {
             localport = localPort0(nativefd);
         } else {
@@ -158,6 +168,8 @@ class DualStackPlainSocketImpl extends AbstractPlainSocketImpl
         shutdown0(nativefd, howto);
     }
 
+    // Intentional fallthrough after SO_REUSEADDR
+    @SuppressWarnings("fallthrough")
     void socketSetOption(int opt, boolean on, Object value)
         throws SocketException {
         cli.System.Net.Sockets.Socket nativefd = checkAndReturnNativeFD();
@@ -169,10 +181,16 @@ class DualStackPlainSocketImpl extends AbstractPlainSocketImpl
         int optionValue = 0;
 
         switch(opt) {
+            case SO_REUSEADDR :
+                if (exclusiveBind) {
+                    // SO_REUSEADDR emulated when using exclusive bind
+                    isReuseAddress = on;
+                    return;
+                }
+                // intentional fallthrough
             case TCP_NODELAY :
             case SO_OOBINLINE :
             case SO_KEEPALIVE :
-            case SO_REUSEADDR :
                 optionValue = on ? 1 : 0;
                 break;
             case SO_SNDBUF :
@@ -203,6 +221,10 @@ class DualStackPlainSocketImpl extends AbstractPlainSocketImpl
             return 0;  // return value doesn't matter.
         }
 
+        // SO_REUSEADDR emulated when using exclusive bind
+        if (opt == SO_REUSEADDR && exclusiveBind)
+            return isReuseAddress? 1 : -1;
+
         int value = getIntOption(nativefd, opt);
 
         switch (opt) {
@@ -238,10 +260,11 @@ class DualStackPlainSocketImpl extends AbstractPlainSocketImpl
         return ret;
     }
 
-    static void bind0(cli.System.Net.Sockets.Socket fd, InetAddress localAddress, int localport)
+    static void bind0(cli.System.Net.Sockets.Socket fd, InetAddress localAddress, int localport,
+                             boolean exclBind)
         throws IOException {
         ikvm.internal.JNI.JNIEnv env = new ikvm.internal.JNI.JNIEnv();
-        DualStackPlainSocketImpl_c.bind0(env, fd, localAddress, localport);
+        DualStackPlainSocketImpl_c.bind0(env, fd, localAddress, localport, exclBind);
         env.ThrowPendingException();
     }
 
diff --git a/external/ikvm/openjdk/java/net/DualStackPlainSocketImpl_c.java b/external/ikvm/openjdk/java/net/DualStackPlainSocketImpl_c.java
index b5b856d..15c2a18 100644
--- a/external/ikvm/openjdk/java/net/DualStackPlainSocketImpl_c.java
+++ b/external/ikvm/openjdk/java/net/DualStackPlainSocketImpl_c.java
@@ -97,7 +97,9 @@ static cli.System.Net.Sockets.Socket socket0
  * Signature: (ILjava/net/InetAddress;I)V
  */
 static void bind0
-  (JNIEnv env, cli.System.Net.Sockets.Socket fd, InetAddress iaObj, int port) {
+  (JNIEnv env, cli.System.Net.Sockets.Socket fd, InetAddress iaObj, int port,
+   boolean exclBind)
+{
     SOCKETADDRESS sa;
     sa = new SOCKETADDRESS();
     int rv;
@@ -107,7 +109,7 @@ static void bind0
       return;
     }
 
-    rv = NET_Bind(fd, sa);
+    rv = NET_WinBind(fd, sa, exclBind);
 
     if (rv == SOCKET_ERROR)
         NET_ThrowNew(env, WSAGetLastError(), "JVM_Bind");
diff --git a/external/ikvm/openjdk/java/net/PlainSocketImpl.java b/external/ikvm/openjdk/java/net/PlainSocketImpl.java
index d67825b..5b7f850 100644
--- a/external/ikvm/openjdk/java/net/PlainSocketImpl.java
+++ b/external/ikvm/openjdk/java/net/PlainSocketImpl.java
@@ -54,6 +54,12 @@ class PlainSocketImpl extends AbstractPlainSocketImpl
     /* If the version supports a dual stack TCP implementation */
     private static boolean useDualStackImpl = false;
 
+    /* sun.net.useExclusiveBind */
+    private static String exclBindProp;
+
+    /* True if exclusive binding is on for Windows */
+    private static boolean exclusiveBind = true;
+
     static {
         java.security.AccessController.doPrivileged( new PrivilegedAction<Object>() {
                 public Object run() {
@@ -62,6 +68,7 @@ class PlainSocketImpl extends AbstractPlainSocketImpl
                         version = Float.parseFloat(System.getProperties().getProperty("os.version"));
                         preferIPv4Stack = Boolean.parseBoolean(
                                           System.getProperties().getProperty("java.net.preferIPv4Stack"));
+                        exclBindProp = System.getProperty("sun.net.useExclusiveBind");
                     } catch (NumberFormatException e ) {
                         assert false : e;
                     }
@@ -84,7 +91,15 @@ class PlainSocketImpl extends AbstractPlainSocketImpl
 
         // (version >= 6.0) implies Vista or greater.
         if (version >= 6.0 && !preferIPv4Stack) {
-            useDualStackImpl = true;
+                useDualStackImpl = true;
+        }
+
+        if (exclBindProp != null) {
+            // sun.net.useExclusiveBind is true
+            exclusiveBind = exclBindProp.length() == 0 ? true
+                    : Boolean.parseBoolean(exclBindProp);
+        } else if (version < 6.0) {
+            exclusiveBind = false;
         }
     }
 
@@ -93,9 +108,9 @@ class PlainSocketImpl extends AbstractPlainSocketImpl
      */
     PlainSocketImpl() {
         if (useDualStackImpl) {
-            impl = new DualStackPlainSocketImpl();
+            impl = new DualStackPlainSocketImpl(exclusiveBind);
         } else {
-            impl = new TwoStacksPlainSocketImpl();
+            impl = new TwoStacksPlainSocketImpl(exclusiveBind);
         }
     }
 
@@ -104,9 +119,9 @@ class PlainSocketImpl extends AbstractPlainSocketImpl
      */
     PlainSocketImpl(FileDescriptor fd) {
         if (useDualStackImpl) {
-            impl = new DualStackPlainSocketImpl(fd);
+            impl = new DualStackPlainSocketImpl(fd, exclusiveBind);
         } else {
-            impl = new TwoStacksPlainSocketImpl(fd);
+            impl = new TwoStacksPlainSocketImpl(fd, exclusiveBind);
         }
     }
 
diff --git a/external/ikvm/openjdk/java/net/SocketInputStream.java b/external/ikvm/openjdk/java/net/SocketInputStream.java
index 830fa51..161947c 100644
--- a/external/ikvm/openjdk/java/net/SocketInputStream.java
+++ b/external/ikvm/openjdk/java/net/SocketInputStream.java
@@ -32,6 +32,7 @@ import java.nio.channels.FileChannel;
 import static ikvm.internal.Winsock.*;
 import static java.net.net_util_md.*;
 
+import sun.misc.IoTrace;
 import sun.net.ConnectionResetException;
 
 /**
@@ -41,7 +42,6 @@ import sun.net.ConnectionResetException;
  *
  * @author      Jonathan Payne
  * @author      Arthur van Hoff
- * @author      Jeroen Frijters
  */
 class SocketInputStream extends FileInputStream
 {
@@ -182,7 +182,7 @@ class SocketInputStream extends FileInputStream
     }
 
     int read(byte b[], int off, int length, int timeout) throws IOException {
-        int n;
+        int n = 0;
 
         // EOF already encountered
         if (eof) {
@@ -204,6 +204,7 @@ class SocketInputStream extends FileInputStream
 
         boolean gotReset = false;
 
+        Object traceContext = IoTrace.socketReadBegin();
         // acquire file descriptor and do the read
         FileDescriptor fd = impl.acquireFD();
         try {
@@ -215,6 +216,8 @@ class SocketInputStream extends FileInputStream
             gotReset = true;
         } finally {
             impl.releaseFD();
+            IoTrace.socketReadEnd(traceContext, impl.address, impl.port,
+                                  timeout, n > 0 ? n : 0);
         }
 
         /*
@@ -222,6 +225,7 @@ class SocketInputStream extends FileInputStream
          * buffered on the socket
          */
         if (gotReset) {
+            traceContext = IoTrace.socketReadBegin();
             impl.setConnectionResetPending();
             impl.acquireFD();
             try {
@@ -232,6 +236,8 @@ class SocketInputStream extends FileInputStream
             } catch (ConnectionResetException rstExc) {
             } finally {
                 impl.releaseFD();
+                IoTrace.socketReadEnd(traceContext, impl.address, impl.port,
+                                      timeout, n > 0 ? n : 0);
             }
         }
 
diff --git a/external/ikvm/openjdk/java/net/SocketOutputStream.java b/external/ikvm/openjdk/java/net/SocketOutputStream.java
index 9e6be01..fd6e2c4 100644
--- a/external/ikvm/openjdk/java/net/SocketOutputStream.java
+++ b/external/ikvm/openjdk/java/net/SocketOutputStream.java
@@ -32,6 +32,8 @@ import java.nio.channels.FileChannel;
 import static ikvm.internal.Winsock.*;
 import static java.net.net_util_md.*;
 
+import sun.misc.IoTrace;
+
 /**
  * This stream extends FileOutputStream to implement a
  * SocketOutputStream. Note that this class should <b>NOT</b> be
@@ -39,7 +41,6 @@ import static java.net.net_util_md.*;
  *
  * @author      Jonathan Payne
  * @author      Arthur van Hoff
- * @author      Jeroen Frijters
  */
 class SocketOutputStream extends FileOutputStream
 {
@@ -176,9 +177,12 @@ class SocketOutputStream extends FileOutputStream
             throw new ArrayIndexOutOfBoundsException();
         }
 
+        Object traceContext = IoTrace.socketWriteBegin();
+        int bytesWritten = 0;
         FileDescriptor fd = impl.acquireFD();
         try {
             socketWrite0(fd, b, off, len);
+            bytesWritten = len;
         } catch (SocketException se) {
             if (se instanceof sun.net.ConnectionResetException) {
                 impl.setConnectionResetPending();
@@ -191,6 +195,7 @@ class SocketOutputStream extends FileOutputStream
             }
         } finally {
             impl.releaseFD();
+            IoTrace.socketWriteEnd(traceContext, impl.address, impl.port, bytesWritten);
         }
     }
 
diff --git a/external/ikvm/openjdk/java/net/TwoStacksPlainDatagramSocketImpl.java b/external/ikvm/openjdk/java/net/TwoStacksPlainDatagramSocketImpl.java
index a119c4b..2b2bde1 100644
--- a/external/ikvm/openjdk/java/net/TwoStacksPlainDatagramSocketImpl.java
+++ b/external/ikvm/openjdk/java/net/TwoStacksPlainDatagramSocketImpl.java
@@ -38,7 +38,6 @@ import sun.net.ResourceManager;
  * during socket creation.
  *
  * @author Chris Hegarty
- * @author Jeroen Frijters
  */
 
 class TwoStacksPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
@@ -63,6 +62,22 @@ class TwoStacksPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
      */
     cli.System.Net.Sockets.Socket lastfd=null;
 
+    // true if this socket is exclusively bound
+    private final boolean exclusiveBind;
+
+    /*
+     * Set to true if SO_REUSEADDR is set after the socket is bound to
+     * indicate SO_REUSEADDR is being emulated
+     */
+    private boolean reuseAddressEmulated;
+
+    // emulates SO_REUSEADDR when exclusiveBind is true and socket is bound
+    private boolean isReuseAddress;
+
+    TwoStacksPlainDatagramSocketImpl(boolean exclBind) {
+        exclusiveBind = exclBind;
+    }
+
     protected synchronized void create() throws SocketException {
         fd1 = new FileDescriptor();
         try {
@@ -81,6 +96,14 @@ class TwoStacksPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
         }
     }
 
+    @Override
+    protected synchronized void bind0(int lport, InetAddress laddr)
+        throws SocketException
+    {
+        bind0(lport, laddr, exclusiveBind);
+
+    }
+
     protected synchronized void receive(DatagramPacket p)
         throws IOException {
         try {
@@ -100,8 +123,24 @@ class TwoStacksPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
                 return anyLocalBoundAddr;
             }
             return socketGetOption(optID);
-        } else
+        } else if (optID == SO_REUSEADDR && reuseAddressEmulated) {
+            return isReuseAddress;
+        } else {
             return super.getOption(optID);
+        }
+    }
+
+    protected void socketSetOption(int opt, Object val)
+        throws SocketException
+    {
+        if (opt == SO_REUSEADDR && exclusiveBind && localPort != 0)  {
+            // socket already bound, emulate
+            reuseAddressEmulated = true;
+            isReuseAddress = (Boolean)val;
+        } else {
+            socketNativeSetOption(opt, val);
+        }
+
     }
 
     protected boolean isClosed() {
@@ -119,9 +158,10 @@ class TwoStacksPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
 
     /* Native methods */
 
-    protected synchronized void bind0(int lport, InetAddress laddr) throws SocketException {
+    protected synchronized void bind0(int lport, InetAddress laddr,
+                                             boolean exclBind) throws SocketException {
         ikvm.internal.JNI.JNIEnv env = new ikvm.internal.JNI.JNIEnv();
-        TwoStacksPlainDatagramSocketImpl_c.bind0(env, this, lport, laddr);
+        TwoStacksPlainDatagramSocketImpl_c.bind0(env, this, lport, laddr, exclBind);
         env.ThrowPendingException();
     }
 
@@ -199,9 +239,9 @@ class TwoStacksPlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
         TwoStacksPlainDatagramSocketImpl_c.datagramSocketClose(this);
     }
 
-    protected void socketSetOption(int opt, Object val) throws SocketException {
+    protected void socketNativeSetOption(int opt, Object val) throws SocketException {
         ikvm.internal.JNI.JNIEnv env = new ikvm.internal.JNI.JNIEnv();
-        TwoStacksPlainDatagramSocketImpl_c.socketSetOption(env, this, opt, val);
+        TwoStacksPlainDatagramSocketImpl_c.socketNativeSetOption(env, this, opt, val);
         env.ThrowPendingException();
     }
 
diff --git a/external/ikvm/openjdk/java/net/TwoStacksPlainDatagramSocketImpl_c.java b/external/ikvm/openjdk/java/net/TwoStacksPlainDatagramSocketImpl_c.java
index 8f7e164..26f78ad 100644
--- a/external/ikvm/openjdk/java/net/TwoStacksPlainDatagramSocketImpl_c.java
+++ b/external/ikvm/openjdk/java/net/TwoStacksPlainDatagramSocketImpl_c.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -282,7 +282,7 @@ jboolean exceedSizeLimit(JNIEnv *env, jint fd, jint addr, jint size)
                                 addrList = curr;
                             }
                             LeaveCriticalSection(&sizeCheckLock);
-                            JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
+                            JNU_ThrowOutOfMemoryError(env, "Native heap allocation failed");
                             return JNI_TRUE;
                         }
                         curr->addr = htonl((*addrp)->S_un.S_addr);
@@ -447,7 +447,9 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
 }
 */
 
-static void bind0(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, int port, InetAddress addressObj) {
+static void bind0(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this,
+                                           int port, InetAddress addressObj,
+                                           boolean exclBind) {
     FileDescriptor fdObj = _this.fd;
     FileDescriptor fd1Obj = _this.fd1;
 
@@ -459,12 +461,7 @@ static void bind0(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, int port,
     SOCKETADDRESS lcladdr;
     lcladdr = new SOCKETADDRESS();
 
-    if (IS_NULL(addressObj)) {
-        JNU_ThrowNullPointerException(env, "argument address");
-        return;
-    }
-
-    family = addressObj.family;
+    family = getInetAddress_family(env, addressObj);
     if (family == IPv6 && !ipv6_supported) {
         JNU_ThrowByName(env, JNU_JAVANETPKG+"SocketException",
                         "Protocol family not supported");
@@ -494,7 +491,7 @@ static void bind0(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, int port,
         v6bind.addr = lcladdr;
         v6bind.ipv4_fd = fd;
         v6bind.ipv6_fd = fd1;
-        if (NET_BindV6(v6bind) != -1) {
+        if (NET_BindV6(v6bind, exclBind) != -1) {
             /* check if the fds have changed */
             if (v6bind.ipv4_fd != fd) {
                 fd = v6bind.ipv4_fd;
@@ -521,7 +518,7 @@ static void bind0(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, int port,
             return;
         }
     } else {
-        if (bind(fd, lcladdr) == -1) {
+        if (NET_WinBind(fd, lcladdr, exclBind) == -1) {
             if (WSAGetLastError() == WSAEACCES) {
                 WSASetLastError(WSAEADDRINUSE);
             }
@@ -582,9 +579,9 @@ static void connect0(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, InetAdd
         return;
     }
 
-    addr = address.address;
+    addr = getInetAddress_addr(env, address);
 
-    family = address.family;
+    family = getInetAddress_family(env, address);
     if (family == IPv6 && !ipv6_supported) {
         JNU_ThrowByName(env, JNU_JAVANETPKG+"SocketException",
                         "Protocol family not supported");
@@ -686,7 +683,7 @@ static void send(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, DatagramPac
         return;
     }
 
-    family = iaObj.family;
+    family = getInetAddress_family(env, iaObj);
     if (family == IPv4) {
         fdObj = _this.fd;
     } else {
@@ -730,7 +727,7 @@ static void send(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, DatagramPac
         if (!w2k_or_later) { /* avoid this check on Win 2K or better. Does not work with IPv6.
                       * Check is not necessary on these OSes *-/
             if (connected) {
-                address = (*env)->GetIntField(env, iaObj, ia_addressID);
+                address = getInetAddress_addr(env, iaObj);
             } else {
                 address = ntohl(rmtaddr.him4.sin_addr.s_addr);
             }
@@ -756,7 +753,7 @@ static void send(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, DatagramPac
          *-/
         fullPacket = (char *)malloc(packetBufferLen);
         if (!fullPacket) {
-            JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
+            JNU_ThrowOutOfMemoryError(env, "Send buf native heap allocation failed");
             return;
         }
     } else {
@@ -830,7 +827,7 @@ static int peek(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, InetAddress
         JNU_ThrowNullPointerException(env, "Null address in peek()");
         return -1;
     } else {
-        address = addressObj.address;
+        address = getInetAddress_addr(env, addressObj);
         /* We only handle IPv4 for now. Will support IPv6 once its in the os */
         family = AF_INET;
     }
@@ -1009,7 +1006,7 @@ static int peekData(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, Datagram
          *-/
         fullPacket = (char *)malloc(packetBufferLen);
         if (!fullPacket) {
-            JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
+            JNU_ThrowOutOfMemoryError(env, "Native heap allocation failed");
             return -1;
         }
     } else {
@@ -1275,7 +1272,7 @@ static void receive0(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, Datagra
          *-/
         fullPacket = (char *)malloc(packetBufferLen);
         if (!fullPacket) {
-            JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
+            JNU_ThrowOutOfMemoryError(env, "Receive buf native heap allocation failed");
             return;
         }
     } else {
@@ -1549,7 +1546,7 @@ private static int getInetAddrFromIf (JNIEnv env, int family, NetworkInterface n
     for (i=0; i<len; i++) {
         int fam;
         addr = addrArray[i];
-        fam = addr.family;
+        fam = getInetAddress_family(env, addr);
         if (fam == family) {
             iaddr[0] = addr;
             return 0;
@@ -1567,7 +1564,7 @@ private static int getInet4AddrFromIf (JNIEnv env, NetworkInterface nif, in_addr
         return -1;
     }
 
-    iaddr.s_addr = htonl(addr[0].address);
+    iaddr.s_addr = htonl(getInetAddress_addr(env, addr[0]));
     return 0;
 }
 
@@ -1660,7 +1657,7 @@ private static void setMulticastInterface(JNIEnv env, TwoStacksPlainDatagramSock
         } else {
             in_addr in = new in_addr();
 
-            in.s_addr = htonl(((InetAddress)value).address);
+            in.s_addr = htonl(getInetAddress_addr(env, (InetAddress)value));
 
             if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
                                in) < 0) {
@@ -1734,10 +1731,10 @@ private static void setMulticastInterface(JNIEnv env, TwoStacksPlainDatagramSock
 
 /*
  * Class:     java_net_TwoStacksPlainDatagramSocketImpl
- * Method:    socketSetOption
+ * Method:    socketNativeSetOption
  * Signature: (ILjava/lang/Object;)V
  */
-static void socketSetOption(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, int opt, Object value) {
+static void socketNativeSetOption(JNIEnv env, TwoStacksPlainDatagramSocketImpl _this, int opt, Object value) {
     cli.System.Net.Sockets.Socket fd = null;
     cli.System.Net.Sockets.Socket fd1 = null;
     int[] levelv4 = new int[1];
diff --git a/external/ikvm/openjdk/java/net/TwoStacksPlainSocketImpl.java b/external/ikvm/openjdk/java/net/TwoStacksPlainSocketImpl.java
index 4179078..12c1794 100644
--- a/external/ikvm/openjdk/java/net/TwoStacksPlainSocketImpl.java
+++ b/external/ikvm/openjdk/java/net/TwoStacksPlainSocketImpl.java
@@ -66,10 +66,20 @@ class TwoStacksPlainSocketImpl extends AbstractPlainSocketImpl
      */
     cli.System.Net.Sockets.Socket lastfd = null;
 
-    public TwoStacksPlainSocketImpl() {}
+    // true if this socket is exclusively bound
+    private final boolean exclusiveBind;
 
-    public TwoStacksPlainSocketImpl(FileDescriptor fd) {
+    // emulates SO_REUSEADDR when exclusiveBind is true
+    private boolean isReuseAddress;
+
+
+    public TwoStacksPlainSocketImpl(boolean exclBind) {
+        exclusiveBind = exclBind;
+    }
+
+    public TwoStacksPlainSocketImpl(FileDescriptor fd, boolean exclBind) {
         this.fd = fd;
+        exclusiveBind = exclBind;
     }
 
     /**
@@ -112,13 +122,33 @@ class TwoStacksPlainSocketImpl extends AbstractPlainSocketImpl
             InetAddressContainer in = new InetAddressContainer();
             socketGetOption(opt, in);
             return in.addr;
+        } else if (opt == SO_REUSEADDR && exclusiveBind) {
+            // SO_REUSEADDR emulated when using exclusive bind
+            return isReuseAddress;
         } else
             return super.getOption(opt);
     }
 
+    @Override
+    void socketBind(InetAddress address, int port) throws IOException {
+        socketBind(address, port, exclusiveBind);
+    }
+
+    @Override
+    void socketSetOption(int opt, boolean on, Object value)
+        throws SocketException
+    {
+        // SO_REUSEADDR emulated when using exclusive bind
+        if (opt == SO_REUSEADDR && exclusiveBind)
+            isReuseAddress = on;
+        else
+            socketNativeSetOption(opt, on, value);
+    }
+
     /**
      * Closes the socket.
      */
+    @Override
     protected void close() throws IOException {
         synchronized(fdLock) {
             if (fd != null || fd1 != null) {
@@ -151,6 +181,7 @@ class TwoStacksPlainSocketImpl extends AbstractPlainSocketImpl
         }
     }
 
+    @Override
     void reset() throws IOException {
         if (fd != null || fd1 != null) {
             socketClose();
@@ -163,6 +194,7 @@ class TwoStacksPlainSocketImpl extends AbstractPlainSocketImpl
     /*
      * Return true if already closed or close is pending
      */
+    @Override
     public boolean isClosedOrPending() {
         /*
          * Lock on fdLock to ensure that we wait if a
@@ -191,9 +223,9 @@ class TwoStacksPlainSocketImpl extends AbstractPlainSocketImpl
         env.ThrowPendingException();
     }
     
-    void socketBind(InetAddress address, int localport) throws IOException {
+    void socketBind(InetAddress address, int localport, boolean exclBind) throws IOException {
         ikvm.internal.JNI.JNIEnv env = new ikvm.internal.JNI.JNIEnv();
-        TwoStacksPlainSocketImpl_c.socketBind(env, this, address, localport);
+        TwoStacksPlainSocketImpl_c.socketBind(env, this, address, localport, exclBind);
         env.ThrowPendingException();
     }
     
@@ -228,9 +260,9 @@ class TwoStacksPlainSocketImpl extends AbstractPlainSocketImpl
         env.ThrowPendingException();
     }
 
-    void socketSetOption(int cmd, boolean on, Object value) throws SocketException {
+    void socketNativeSetOption(int cmd, boolean on, Object value) throws SocketException {
         ikvm.internal.JNI.JNIEnv env = new ikvm.internal.JNI.JNIEnv();
-        TwoStacksPlainSocketImpl_c.socketSetOption(env, this, cmd, on, value);
+        TwoStacksPlainSocketImpl_c.socketNativeSetOption(env, this, cmd, on, value);
         env.ThrowPendingException();
     }
 
diff --git a/external/ikvm/openjdk/java/net/TwoStacksPlainSocketImpl_c.java b/external/ikvm/openjdk/java/net/TwoStacksPlainSocketImpl_c.java
index f6296bd..d86e84d 100644
--- a/external/ikvm/openjdk/java/net/TwoStacksPlainSocketImpl_c.java
+++ b/external/ikvm/openjdk/java/net/TwoStacksPlainSocketImpl_c.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -416,7 +416,9 @@ static void socketConnect(JNIEnv env, TwoStacksPlainSocketImpl _this, InetAddres
  * Method:    socketBind
  * Signature: (Ljava/net/InetAddress;I)V
  */
-static void socketBind(JNIEnv env, TwoStacksPlainSocketImpl _this, InetAddress iaObj, int localport) {
+static void socketBind(JNIEnv env, TwoStacksPlainSocketImpl _this,
+                                         InetAddress iaObj, int localport,
+                                         boolean exclBind) {
     FileDescriptor fdObj = _this.fd;
     FileDescriptor fd1Obj = _this.fd1;
     cli.System.Net.Sockets.Socket fd = null;
@@ -430,7 +432,7 @@ static void socketBind(JNIEnv env, TwoStacksPlainSocketImpl _this, InetAddress i
     SOCKETADDRESS him;
     him = new SOCKETADDRESS();
 
-    family = iaObj.family;
+    family = getInetAddress_family(env, iaObj);
 
     if (family == IPv6 && !ipv6_supported) {
         JNU_ThrowByName(env, JNU_JAVANETPKG+"SocketException",
@@ -457,13 +459,12 @@ static void socketBind(JNIEnv env, TwoStacksPlainSocketImpl _this, InetAddress i
                           him, JNI_FALSE) != 0) {
       return;
     }
-
     if (ipv6_supported) {
         ipv6bind v6bind = new ipv6bind();
         v6bind.addr = him;
         v6bind.ipv4_fd = fd;
         v6bind.ipv6_fd = fd1;
-        rv = NET_BindV6(v6bind);
+        rv = NET_BindV6(v6bind, exclBind);
         if (rv != -1) {
             /* check if the fds have changed */
             if (v6bind.ipv4_fd != fd) {
@@ -488,7 +489,7 @@ static void socketBind(JNIEnv env, TwoStacksPlainSocketImpl _this, InetAddress i
             }
         }
     } else {
-        rv = NET_Bind(fd, him);
+        rv = NET_WinBind(fd, him, exclBind);
     }
 
     if (rv == -1) {
@@ -787,10 +788,10 @@ static void socketClose0(JNIEnv env, TwoStacksPlainSocketImpl _this, boolean use
  *
  *
  * Class:     java_net_TwoStacksPlainSocketImpl
- * Method:    socketSetOption
+ * Method:    socketNativeSetOption
  * Signature: (IZLjava/lang/Object;)V
  */
-static void socketSetOption(JNIEnv env, TwoStacksPlainSocketImpl _this, int cmd, boolean on, Object value) {
+static void socketNativeSetOption(JNIEnv env, TwoStacksPlainSocketImpl _this, int cmd, boolean on, Object value) {
     cli.System.Net.Sockets.Socket fd, fd1;
     int[] level = new int[1];
     int[] optname = new int[1];
diff --git a/external/ikvm/openjdk/java/net/net_util_md.java b/external/ikvm/openjdk/java/net/net_util_md.java
index d913235..724ba4c 100644
--- a/external/ikvm/openjdk/java/net/net_util_md.java
+++ b/external/ikvm/openjdk/java/net/net_util_md.java
@@ -271,6 +271,17 @@ final class net_util_md
             optval = tos;
         }
 
+        if (optname == SO_REUSEADDR) {
+            /*
+             * Do not set SO_REUSEADDE if SO_EXCLUSIVEADDUSE is already set
+             */
+            int[] parg = new int[1];
+            rv = NET_GetSockOpt(s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, parg);
+            if (rv == 0 && parg[0] == 1) {
+                return rv;
+            }
+        }
+
         rv = setsockopt(s, level, optname, optval);
 
         if (rv == SOCKET_ERROR) {
@@ -330,6 +341,18 @@ final class net_util_md
     }
 
     /*
+     * Sets SO_ECLUSIVEADDRUSE if SO_REUSEADDR is not already set.
+     */
+    static void setExclusiveBind(cli.System.Net.Sockets.Socket fd) {
+        int[] parg = new int[1];
+        int rv = 0;
+        rv = NET_GetSockOpt(fd, SOL_SOCKET, SO_REUSEADDR, parg);
+        if (rv == 0 && parg[0] == 0) {
+            rv = NET_SetSockOpt(fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, 1);
+        }
+    }
+
+    /*
      * Wrapper for bind winsock call - transparent converts an
      * error related to binding to a port that has exclusive access
      * into an error indicating the port is in use (facilitates
@@ -337,7 +360,8 @@ final class net_util_md
      */
     static int NET_Bind(cli.System.Net.Sockets.Socket s, SOCKETADDRESS him)
     {
-        int rv = bind(s, him);
+        int rv;
+        rv = bind(s, him);
 
         if (rv == SOCKET_ERROR) {
             /*
@@ -352,6 +376,17 @@ final class net_util_md
         return rv;
     }
 
+    /*
+     * Wrapper for NET_Bind call. Sets SO_EXCLUSIVEADDRUSE
+     * if required, and then calls NET_BIND
+     */
+    static int NET_WinBind(cli.System.Net.Sockets.Socket s, SOCKETADDRESS him, boolean exclBind)
+    {
+        if (exclBind == JNI_TRUE)
+            setExclusiveBind(s);
+        return NET_Bind(s, him);
+    }
+
     static int NET_SocketClose(cli.System.Net.Sockets.Socket fd) {
         linger l = new linger();
         int ret;
@@ -470,7 +505,7 @@ final class net_util_md
         return SOCKET_ERROR;
     }
 
-    static int NET_BindV6(ipv6bind b) {
+    static int NET_BindV6(ipv6bind b, boolean exclBind) {
         cli.System.Net.Sockets.Socket fd = null;
         cli.System.Net.Sockets.Socket ofd = null;
         int rv;
@@ -487,7 +522,7 @@ final class net_util_md
         if (family == AF_INET && (b.addr.him4.sin_addr.s_addr != INADDR_ANY)) {
             /* bind to v4 only */
             int ret;
-            ret = NET_Bind (b.ipv4_fd, b.addr);
+            ret = NET_WinBind (b.ipv4_fd, b.addr, exclBind);
             if (ret == SOCKET_ERROR) {
                 return CLOSE_SOCKETS_AND_RETURN(fd, ofd, close_fd, close_ofd, b);
             }
@@ -498,7 +533,7 @@ final class net_util_md
         if (family == AF_INET6 && (!IN6ADDR_ISANY(b.addr))) {
             /* bind to v6 only */
             int ret;
-            ret = NET_Bind (b.ipv6_fd, b.addr);
+            ret = NET_WinBind (b.ipv6_fd, b.addr, exclBind);
             if (ret == SOCKET_ERROR) {
                 return CLOSE_SOCKETS_AND_RETURN(fd, ofd, close_fd, close_ofd, b);
             }
@@ -523,7 +558,7 @@ final class net_util_md
             oaddr.set(new IPEndPoint(IPAddress.Any, htons(port)));
         }
 
-        rv = NET_Bind (fd, b.addr);
+        rv = NET_WinBind (fd, b.addr, exclBind);
         if (rv == SOCKET_ERROR) {
             return CLOSE_SOCKETS_AND_RETURN(fd, ofd, close_fd, close_ofd, b);
         }
@@ -568,7 +603,8 @@ final class net_util_md
 
                 /* bind random port on first socket */
                 oaddr.sin_port = 0;
-                rv = NET_Bind (ofd, oaddr);
+                rv = NET_WinBind (ofd, oaddr,
+                                  exclBind);
                 if (rv == SOCKET_ERROR) {
                     return CLOSE_SOCKETS_AND_RETURN(fd, ofd, close_fd, close_ofd, b);
                 }
@@ -583,7 +619,8 @@ final class net_util_md
                 }
                 bound_port = oaddr.sin_port;
                 b.addr.sin_port = bound_port;
-                rv = NET_Bind (fd, b.addr);
+                rv = NET_WinBind (fd, b.addr,
+                                  exclBind);
 
                 if (rv != SOCKET_ERROR) {
                     if (family == AF_INET) {
@@ -836,4 +873,12 @@ final class net_util_md
         }
         return sock;
     }
+
+    static int getInetAddress_addr(JNIEnv env, InetAddress iaObj) {
+        return iaObj.address;
+    }
+
+    static int getInetAddress_family(JNIEnv env, InetAddress iaObj) {
+        return iaObj.family;
+    }
 }
diff --git a/external/ikvm/openjdk/java/security/AccessController.java b/external/ikvm/openjdk/java/security/AccessController.java
index 60b7722..19d4af9 100644
--- a/external/ikvm/openjdk/java/security/AccessController.java
+++ b/external/ikvm/openjdk/java/security/AccessController.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,8 @@ package java.security;
 import ikvm.internal.CallerID;
 import sun.misc.Unsafe;
 import sun.security.util.Debug;
+import sun.reflect.CallerSensitive;
+import sun.reflect.Reflection;
 
 /**
  * <p> The AccessController class is used for access control operations
@@ -317,7 +319,7 @@ public final class AccessController {
      * @see java.security.DomainCombiner
      */
 
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static <T> T doPrivileged(PrivilegedAction<T> action) {
         return (T)doPrivileged(action, null, CallerID.getCallerID());
     }
@@ -344,14 +346,14 @@ public final class AccessController {
      *
      * @since 1.6
      */
+    @CallerSensitive
     public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action) {
-
-        DomainCombiner dc = null;
         AccessControlContext acc = getStackAccessControlContext();
-        if (acc == null || (dc = acc.getAssignedCombiner()) == null) {
+        if (acc == null) {
             return AccessController.doPrivileged(action);
         }
-        return AccessController.doPrivileged(action, preserveCombiner(dc));
+        DomainCombiner dc = acc.getAssignedCombiner();
+        return AccessController.doPrivileged(action, preserveCombiner(dc, Reflection.getCallerClass()));
     }
 
 
@@ -382,7 +384,7 @@ public final class AccessController {
      * @see #doPrivileged(PrivilegedAction)
      * @see #doPrivileged(PrivilegedExceptionAction,AccessControlContext)
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static <T> T doPrivileged(PrivilegedAction<T> action,
                                      AccessControlContext context) {
         return (T)doPrivileged(action, context, CallerID.getCallerID());
@@ -412,7 +414,7 @@ public final class AccessController {
      * @see #doPrivilegedWithCombiner(PrivilegedExceptionAction)
      * @see java.security.DomainCombiner
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static <T> T
         doPrivileged(PrivilegedExceptionAction<T> action)
         throws PrivilegedActionException {
@@ -445,41 +447,39 @@ public final class AccessController {
      *
      * @since 1.6
      */
+    @CallerSensitive
     public static <T> T doPrivilegedWithCombiner
         (PrivilegedExceptionAction<T> action) throws PrivilegedActionException {
 
-        DomainCombiner dc = null;
         AccessControlContext acc = getStackAccessControlContext();
-        if (acc == null || (dc = acc.getAssignedCombiner()) == null) {
+        if (acc == null) {
             return AccessController.doPrivileged(action);
         }
-        return AccessController.doPrivileged(action, preserveCombiner(dc));
+        DomainCombiner dc = acc.getAssignedCombiner();
+        return AccessController.doPrivileged(action, preserveCombiner(dc, Reflection.getCallerClass()));
     }
 
     /**
      * preserve the combiner across the doPrivileged call
      */
-    private static AccessControlContext preserveCombiner
-                                        (DomainCombiner combiner) {
-
-        /**
-         * callerClass[0] = Reflection.getCallerClass
-         * callerClass[1] = AccessController.preserveCombiner
-         * callerClass[2] = AccessController.doPrivileged
-         * callerClass[3] = caller
-         */
-        final Class callerClass = sun.reflect.Reflection.getCallerClass(3);
+    private static AccessControlContext preserveCombiner(DomainCombiner combiner,
+                                                         final Class<?> caller) {
         ProtectionDomain callerPd = doPrivileged
             (new PrivilegedAction<ProtectionDomain>() {
             public ProtectionDomain run() {
-                return callerClass.getProtectionDomain();
+                return caller.getProtectionDomain();
             }
         });
 
         // perform 'combine' on the caller of doPrivileged,
         // even if the caller is from the bootclasspath
         ProtectionDomain[] pds = new ProtectionDomain[] {callerPd};
-        return new AccessControlContext(combiner.combine(pds, null), combiner);
+        if (combiner == null) {
+            return new AccessControlContext(pds);
+        } else {
+            return new AccessControlContext(combiner.combine(pds, null),
+                                            combiner);
+        }
     }
 
 
@@ -512,7 +512,7 @@ public final class AccessController {
      * @see #doPrivileged(PrivilegedAction)
      * @see #doPrivileged(PrivilegedExceptionAction,AccessControlContext)
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static <T> T
         doPrivileged(PrivilegedExceptionAction<T> action,
                      AccessControlContext context)
diff --git a/external/ikvm/openjdk/java/sql/DriverManager.java b/external/ikvm/openjdk/java/sql/DriverManager.java
index 9e357f4..8698345 100644
--- a/external/ikvm/openjdk/java/sql/DriverManager.java
+++ b/external/ikvm/openjdk/java/sql/DriverManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,13 +25,13 @@
 
 package java.sql;
 
-import ikvm.internal.CallerID;
 import java.util.Iterator;
-import java.sql.Driver;
 import java.util.ServiceLoader;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
-
+import java.util.concurrent.CopyOnWriteArrayList;
+import sun.reflect.CallerSensitive;
+import sun.reflect.Reflection;
 
 /**
  * <P>The basic service for managing a set of JDBC drivers.<br>
@@ -80,6 +80,27 @@ import java.security.PrivilegedAction;
 public class DriverManager {
 
 
+    // List of registered JDBC drivers
+    private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<DriverInfo>();
+    private static volatile int loginTimeout = 0;
+    private static volatile java.io.PrintWriter logWriter = null;
+    private static volatile java.io.PrintStream logStream = null;
+    // Used in println() to synchronize logWriter
+    private final static  Object logSync = new Object();
+
+    /* Prevent the DriverManager class from being instantiated. */
+    private DriverManager(){}
+
+
+    /**
+     * Load the initial JDBC drivers by checking the System property
+     * jdbc.properties and then use the {@code ServiceLoader} mechanism
+     */
+    static {
+        loadInitialDrivers();
+        println("JDBC DriverManager initialized");
+    }
+
     /**
      * The <code>SQLPermission</code> constant that allows the
      * setting of the logging stream.
@@ -160,15 +181,10 @@ public class DriverManager {
      * @return a Connection to the URL
      * @exception SQLException if a database access error occurs
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static Connection getConnection(String url,
         java.util.Properties info) throws SQLException {
-
-        // Gets the classloader of the code that called this method, may
-        // be null.
-        ClassLoader callerCL = CallerID.getCallerID().getCallerClassLoader();
-
-        return (getConnection(url, info, callerCL));
+        return (getConnection(url, info, Reflection.getCallerClass()));
     }
 
     /**
@@ -184,15 +200,11 @@ public class DriverManager {
      * @return a connection to the URL
      * @exception SQLException if a database access error occurs
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static Connection getConnection(String url,
         String user, String password) throws SQLException {
         java.util.Properties info = new java.util.Properties();
 
-        // Gets the classloader of the code that called this method, may
-        // be null.
-        ClassLoader callerCL = CallerID.getCallerID().getCallerClassLoader();
-
         if (user != null) {
             info.put("user", user);
         }
@@ -200,7 +212,7 @@ public class DriverManager {
             info.put("password", password);
         }
 
-        return (getConnection(url, info, callerCL));
+        return (getConnection(url, info, Reflection.getCallerClass()));
     }
 
     /**
@@ -213,17 +225,12 @@ public class DriverManager {
      * @return a connection to the URL
      * @exception SQLException if a database access error occurs
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static Connection getConnection(String url)
         throws SQLException {
 
         java.util.Properties info = new java.util.Properties();
-
-        // Gets the classloader of the code that called this method, may
-        // be null.
-        ClassLoader callerCL = CallerID.getCallerID().getCallerClassLoader();
-
-        return (getConnection(url, info, callerCL));
+        return (getConnection(url, info, Reflection.getCallerClass()));
     }
 
     /**
@@ -237,47 +244,34 @@ public class DriverManager {
      * that can connect to the given URL
      * @exception SQLException if a database access error occurs
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static Driver getDriver(String url)
         throws SQLException {
-        java.util.Vector drivers = null;
 
         println("DriverManager.getDriver(\"" + url + "\")");
 
-        if (!initialized) {
-            initialize();
-        }
+        Class<?> callerClass = Reflection.getCallerClass();
 
-        synchronized (DriverManager.class){
-            // use the read copy of the drivers vector
-            drivers = readDrivers;
-        }
-
-        // Gets the classloader of the code that called this method, may
-        // be null.
-        ClassLoader callerCL = CallerID.getCallerID().getCallerClassLoader();
-
-        // Walk through the loaded drivers attempting to locate someone
+        // Walk through the loaded registeredDrivers attempting to locate someone
         // who understands the given URL.
-        for (int i = 0; i < drivers.size(); i++) {
-            DriverInfo di = (DriverInfo)drivers.elementAt(i);
+        for (DriverInfo aDriver : registeredDrivers) {
             // If the caller does not have permission to load the driver then
             // skip it.
-            if ( getCallerClass(callerCL, di.driverClassName ) !=
-                 di.driverClass ) {
-                println("    skipping: " + di);
-                continue;
-            }
-            try {
-                println("    trying " + di);
-                if (di.driver.acceptsURL(url)) {
-                    // Success!
-                    println("getDriver returning " + di);
-                    return (di.driver);
+            if(isDriverAllowed(aDriver.driver, callerClass)) {
+                try {
+                    if(aDriver.driver.acceptsURL(url)) {
+                        // Success!
+                        println("getDriver returning " + aDriver.driver.getClass().getName());
+                    return (aDriver.driver);
+                    }
+
+                } catch(SQLException sqe) {
+                    // Drop through and try the next driver.
                 }
-            } catch (SQLException ex) {
-                // Drop through and try the next driver.
+            } else {
+                println("    skipping: " + aDriver.driver.getClass().getName());
             }
+
         }
 
         println("getDriver: no suitable driver");
@@ -297,23 +291,16 @@ public class DriverManager {
      */
     public static synchronized void registerDriver(java.sql.Driver driver)
         throws SQLException {
-        if (!initialized) {
-            initialize();
-        }
-
-        DriverInfo di = new DriverInfo();
 
-        di.driver = driver;
-        di.driverClass = driver.getClass();
-        di.driverClassName = di.driverClass.getName();
-
-        // Not Required -- drivers.addElement(di);
-
-        writeDrivers.addElement(di);
-        println("registerDriver: " + di);
+        /* Register the driver if it has not already been added to our list */
+        if(driver != null) {
+            registeredDrivers.addIfAbsent(new DriverInfo(driver));
+        } else {
+            // This is for compatibility with the original DriverManager
+            throw new NullPointerException();
+        }
 
-        /* update the read copy of drivers vector */
-        readDrivers = (java.util.Vector) writeDrivers.clone();
+        println("registerDriver: " + driver);
 
     }
 
@@ -324,40 +311,27 @@ public class DriverManager {
      * @param driver the JDBC Driver to drop
      * @exception SQLException if a database access error occurs
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static synchronized void deregisterDriver(Driver driver)
         throws SQLException {
-        // Gets the classloader of the code that called this method,
-        // may be null.
-        ClassLoader callerCL = CallerID.getCallerID().getCallerClassLoader();
+        if (driver == null) {
+            return;
+        }
+
         println("DriverManager.deregisterDriver: " + driver);
 
-        // Walk through the loaded drivers.
-        int i;
-        DriverInfo di = null;
-        for (i = 0; i < writeDrivers.size(); i++) {
-            di = (DriverInfo)writeDrivers.elementAt(i);
-            if (di.driver == driver) {
-                break;
+        DriverInfo aDriver = new DriverInfo(driver);
+        if(registeredDrivers.contains(aDriver)) {
+            if (isDriverAllowed(driver, Reflection.getCallerClass())) {
+                 registeredDrivers.remove(aDriver);
+            } else {
+                // If the caller does not have permission to load the driver then
+                // throw a SecurityException.
+                throw new SecurityException();
             }
-        }
-        // If we can't find the driver just return.
-        if (i >= writeDrivers.size()) {
+        } else {
             println("    couldn't find driver to unload");
-            return;
-        }
-
-        // If the caller does not have permission to load the driver then
-        // throw a security exception.
-        if (getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {
-            throw new SecurityException();
         }
-
-        // Remove the driver.  Other entries in drivers get shuffled down.
-        writeDrivers.removeElementAt(i);
-
-        /* update the read copy of drivers vector */
-        readDrivers = (java.util.Vector) writeDrivers.clone();
     }
 
     /**
@@ -369,36 +343,22 @@ public class DriverManager {
      *
      * @return the list of JDBC Drivers loaded by the caller's class loader
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static java.util.Enumeration<Driver> getDrivers() {
         java.util.Vector<Driver> result = new java.util.Vector<Driver>();
-        java.util.Vector drivers = null;
-
-        if (!initialized) {
-            initialize();
-        }
-
-        synchronized (DriverManager.class){
-            // use the readcopy of drivers
-            drivers  = readDrivers;
-       }
 
-        // Gets the classloader of the code that called this method, may
-        // be null.
-        ClassLoader callerCL = CallerID.getCallerID().getCallerClassLoader();
+        Class<?> callerClass = Reflection.getCallerClass();
 
-        // Walk through the loaded drivers.
-        for (int i = 0; i < drivers.size(); i++) {
-            DriverInfo di = (DriverInfo)drivers.elementAt(i);
+        // Walk through the loaded registeredDrivers.
+        for(DriverInfo aDriver : registeredDrivers) {
             // If the caller does not have permission to load the driver then
             // skip it.
-            if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {
-                println("    skipping: " + di);
-                continue;
+            if(isDriverAllowed(aDriver.driver, callerClass)) {
+                result.addElement(aDriver.driver);
+            } else {
+                println("    skipping: " + aDriver.getClass().getName());
             }
-            result.addElement(di.driver);
         }
-
         return (result.elements());
     }
 
@@ -488,28 +448,34 @@ public class DriverManager {
 
     //------------------------------------------------------------------------
 
-    // Returns the class object that would be created if the code calling the
-    // driver manager had loaded the driver class, or null if the class
-    // is inaccessible.
-    private static Class getCallerClass(ClassLoader callerClassLoader,
-                                        String driverClassName) {
-        Class callerC = null;
+    // Indicates whether the class object that would be created if the code calling
+    // DriverManager is accessible.
+    private static boolean isDriverAllowed(Driver driver, Class<?> caller) {
+        ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
+        return isDriverAllowed(driver, callerCL);
+    }
 
-        try {
-            callerC = Class.forName(driverClassName, true, callerClassLoader);
-        }
-        catch (Exception ex) {
-            callerC = null;           // being very careful
+    private static boolean isDriverAllowed(Driver driver, ClassLoader classLoader) {
+        boolean result = false;
+        if(driver != null) {
+            Class<?> aClass = null;
+            try {
+                aClass =  Class.forName(driver.getClass().getName(), true, classLoader);
+            } catch (Exception ex) {
+                result = false;
+            }
+
+             result = ( aClass == driver.getClass() ) ? true : false;
         }
 
-        return callerC;
+        return result;
     }
 
     private static void loadInitialDrivers() {
         String drivers;
         try {
-            drivers = (String)  AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
+            drivers = AccessController.doPrivileged(new PrivilegedAction<String>() {
+                public String run() {
                     return System.getProperty("jdbc.drivers");
                 }
             });
@@ -521,8 +487,8 @@ public class DriverManager {
         // exposed as a java.sql.Driver.class service.
         // ServiceLoader.load() replaces the sun.misc.Providers()
 
-        AccessController.doPrivileged(new PrivilegedAction() {
-            public Object run() {
+        AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            public Void run() {
 
                 ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
                 Iterator driversIterator = loadedDrivers.iterator();
@@ -541,7 +507,7 @@ public class DriverManager {
                  */
                 try{
                     while(driversIterator.hasNext()) {
-                        println(" Loading done by the java.util.ServiceLoader :  "+driversIterator.next());
+                        driversIterator.next();
                     }
                 } catch(Throwable t) {
                 // Do nothing
@@ -551,26 +517,17 @@ public class DriverManager {
         });
 
         println("DriverManager.initialize: jdbc.drivers = " + drivers);
-        if (drivers == null) {
+
+        if (drivers == null || drivers.equals("")) {
             return;
         }
-        while (drivers.length() != 0) {
-            int x = drivers.indexOf(':');
-            String driver;
-            if (x < 0) {
-                driver = drivers;
-                drivers = "";
-            } else {
-                driver = drivers.substring(0, x);
-                drivers = drivers.substring(x+1);
-            }
-            if (driver.length() == 0) {
-                continue;
-            }
+        String[] driversList = drivers.split(":");
+        println("number of Drivers:" + driversList.length);
+        for (String aDriver : driversList) {
             try {
-                println("DriverManager.Initialize: loading " + driver);
-                Class.forName(driver, true,
-                              ClassLoader.getSystemClassLoader());
+                println("DriverManager.Initialize: loading " + aDriver);
+                Class.forName(aDriver, true,
+                        ClassLoader.getSystemClassLoader());
             } catch (Exception ex) {
                 println("DriverManager.Initialize: load failed: " + ex);
             }
@@ -580,19 +537,19 @@ public class DriverManager {
 
     //  Worker method called by the public getConnection() methods.
     private static Connection getConnection(
-        String url, java.util.Properties info, ClassLoader callerCL) throws SQLException {
-        java.util.Vector drivers = null;
+        String url, java.util.Properties info, Class<?> caller) throws SQLException {
         /*
          * When callerCl is null, we should check the application's
          * (which is invoking this class indirectly)
          * classloader, so that the JDBC driver class outside rt.jar
          * can be loaded from here.
          */
-        synchronized(DriverManager.class) {
-          // synchronize loading of the correct classloader.
-          if(callerCL == null) {
-              callerCL = Thread.currentThread().getContextClassLoader();
-           }
+        ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
+        synchronized (DriverManager.class) {
+            // synchronize loading of the correct classloader.
+            if (callerCL == null) {
+                callerCL = Thread.currentThread().getContextClassLoader();
+            }
         }
 
         if(url == null) {
@@ -601,40 +558,32 @@ public class DriverManager {
 
         println("DriverManager.getConnection(\"" + url + "\")");
 
-        if (!initialized) {
-            initialize();
-        }
-
-        synchronized (DriverManager.class){
-            // use the readcopy of drivers
-            drivers = readDrivers;
-        }
-
-        // Walk through the loaded drivers attempting to make a connection.
+        // Walk through the loaded registeredDrivers attempting to make a connection.
         // Remember the first exception that gets raised so we can reraise it.
         SQLException reason = null;
-        for (int i = 0; i < drivers.size(); i++) {
-            DriverInfo di = (DriverInfo)drivers.elementAt(i);
 
+        for(DriverInfo aDriver : registeredDrivers) {
             // If the caller does not have permission to load the driver then
             // skip it.
-            if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {
-                println("    skipping: " + di);
-                continue;
-            }
-            try {
-                println("    trying " + di);
-                Connection result = di.driver.connect(url, info);
-                if (result != null) {
-                    // Success!
-                    println("getConnection returning " + di);
-                    return (result);
-                }
-            } catch (SQLException ex) {
-                if (reason == null) {
-                    reason = ex;
+            if(isDriverAllowed(aDriver.driver, callerCL)) {
+                try {
+                    println("    trying " + aDriver.driver.getClass().getName());
+                    Connection con = aDriver.driver.connect(url, info);
+                    if (con != null) {
+                        // Success!
+                        println("getConnection returning " + aDriver.driver.getClass().getName());
+                        return (con);
+                    }
+                } catch (SQLException ex) {
+                    if (reason == null) {
+                        reason = ex;
+                    }
                 }
+
+            } else {
+                println("    skipping: " + aDriver.getClass().getName());
             }
+
         }
 
         // if we got here nobody could connect.
@@ -646,43 +595,30 @@ public class DriverManager {
         println("getConnection: no suitable driver found for "+ url);
         throw new SQLException("No suitable driver found for "+ url, "08001");
     }
+}
 
+/*
+ * Wrapper class for registered Drivers in order to not expose Driver.equals()
+ * to avoid the capture of the Driver it being compared to as it might not
+ * normally have access.
+ */
+class DriverInfo {
 
-    // Class initialization.
-    static void initialize() {
-        if (initialized) {
-            return;
-        }
-        initialized = true;
-        loadInitialDrivers();
-        println("JDBC DriverManager initialized");
+    final Driver driver;
+    DriverInfo(Driver driver) {
+        this.driver = driver;
     }
 
-    /* Prevent the DriverManager class from being instantiated. */
-    private DriverManager(){}
-
-    /* write copy of the drivers vector */
-    private static java.util.Vector writeDrivers = new java.util.Vector();
-
-    /* write copy of the drivers vector */
-    private static java.util.Vector readDrivers = new java.util.Vector();
-
-    private static int loginTimeout = 0;
-    private static java.io.PrintWriter logWriter = null;
-    private static java.io.PrintStream logStream = null;
-    private static boolean initialized = false;
-
-    private static Object logSync = new Object();
-
-}
+    public boolean equals(Object other) {
+        return (other instanceof DriverInfo)
+                && this.driver == ((DriverInfo) other).driver;
+    }
 
-// DriverInfo is a package-private support class.
-class DriverInfo {
-    Driver         driver;
-    Class          driverClass;
-    String         driverClassName;
+    public int hashCode() {
+        return driver.hashCode();
+    }
 
     public String toString() {
-        return ("driver[className=" + driverClassName + "," + driver + "]");
+        return ("driver[className="  + driver + "]");
     }
 }
diff --git a/external/ikvm/openjdk/java/util/ResourceBundle.java b/external/ikvm/openjdk/java/util/ResourceBundle.java
index b572875..98ee3c5 100644
--- a/external/ikvm/openjdk/java/util/ResourceBundle.java
+++ b/external/ikvm/openjdk/java/util/ResourceBundle.java
@@ -55,6 +55,8 @@ import java.security.PrivilegedExceptionAction;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.jar.JarEntry;
+
+import sun.reflect.CallerSensitive;
 import sun.reflect.Reflection;
 import sun.util.locale.BaseLocale;
 import sun.util.locale.LocaleObjectCache;
@@ -412,11 +414,10 @@ public abstract class ResourceBundle {
 
     /*
      * Automatic determination of the ClassLoader to be used to load
-     * resources on behalf of the client.  N.B. The client is getLoader's
-     * caller's caller.
+     * resources on behalf of the client.
      */
-    private static ClassLoader getLoader(Class c) {
-        ClassLoader cl = (c == null) ? null : c.getClassLoader();
+    private static ClassLoader getLoader(Class<?> caller) {
+        ClassLoader cl = caller == null ? null : caller.getClassLoader();
         if (cl == null) {
             // When the caller's loader is the boot class loader, cl is null
             // here. In that case, ClassLoader.getSystemClassLoader() may
@@ -714,12 +715,12 @@ public abstract class ResourceBundle {
      *     if no resource bundle for the specified base name can be found
      * @return a resource bundle for the given base name and the default locale
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static final ResourceBundle getBundle(String baseName)
     {
         return getBundleImpl(baseName, Locale.getDefault(),
                              /* must determine loader here, else we break stack invariant */
-                             getLoader(Reflection.getCallerClass(2)),
+                             getLoader(Reflection.getCallerClass()),
                              Control.INSTANCE);
     }
 
@@ -757,12 +758,12 @@ public abstract class ResourceBundle {
      *        needed.
      * @since 1.6
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static final ResourceBundle getBundle(String baseName,
                                                  Control control) {
         return getBundleImpl(baseName, Locale.getDefault(),
                              /* must determine loader here, else we break stack invariant */
-                             getLoader(Reflection.getCallerClass(2)),
+                             getLoader(Reflection.getCallerClass()),
                              control);
     }
 
@@ -787,13 +788,13 @@ public abstract class ResourceBundle {
      *        if no resource bundle for the specified base name can be found
      * @return a resource bundle for the given base name and locale
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static final ResourceBundle getBundle(String baseName,
                                                  Locale locale)
     {
         return getBundleImpl(baseName, locale,
                              /* must determine loader here, else we break stack invariant */
-                             getLoader(Reflection.getCallerClass(2)),
+                             getLoader(Reflection.getCallerClass()),
                              Control.INSTANCE);
     }
 
@@ -834,12 +835,12 @@ public abstract class ResourceBundle {
      *        needed.
      * @since 1.6
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static final ResourceBundle getBundle(String baseName, Locale targetLocale,
                                                  Control control) {
         return getBundleImpl(baseName, targetLocale,
                              /* must determine loader here, else we break stack invariant */
-                             getLoader(Reflection.getCallerClass(2)),
+                             getLoader(Reflection.getCallerClass()),
                              control);
     }
 
@@ -1675,9 +1676,9 @@ public abstract class ResourceBundle {
      * @since 1.6
      * @see ResourceBundle.Control#getTimeToLive(String,Locale)
      */
-    @ikvm.internal.HasCallerID
+    @CallerSensitive
     public static final void clearCache() {
-        clearCache(getLoader(Reflection.getCallerClass(2)));
+        clearCache(getLoader(Reflection.getCallerClass()));
     }
 
     /**
diff --git a/external/ikvm/openjdk/java/util/TimeZone.java b/external/ikvm/openjdk/java/util/TimeZone.java
index e3b7cbd..63f1028 100644
--- a/external/ikvm/openjdk/java/util/TimeZone.java
+++ b/external/ikvm/openjdk/java/util/TimeZone.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -43,7 +43,8 @@ import java.lang.ref.SoftReference;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.concurrent.ConcurrentHashMap;
-import sun.awt.AppContextDC;
+import sun.misc.SharedSecrets;
+import sun.misc.JavaAWTAccess;
 import sun.security.action.GetPropertyAction;
 import sun.util.TimeZoneNameUtility;
 import sun.util.calendar.ZoneInfo;
@@ -718,15 +719,27 @@ abstract public class TimeZone implements Serializable, Cloneable {
      * Returns the default TimeZone in an AppContext if any AppContext
      * has ever used. null is returned if any AppContext hasn't been
      * used or if the AppContext doesn't have the default TimeZone.
-     */
-    private synchronized static TimeZone getDefaultInAppContext() {
-        if (!hasSetInAppContext) {
-            return null;
-        }
-
-        AppContextDC ac = AppContextDC.getAppContext();
-        if (ac != null && !ac.isDisposed()) {
-            return (TimeZone) ac.get(TimeZone.class);
+     *
+     * Note that javaAWTAccess may be null if sun.awt.AppContext class hasn't
+     * been loaded. If so, it implies that AWTSecurityManager is not our
+     * SecurityManager and we can use a local static variable.
+     * This works around a build time issue.
+     */
+    private static TimeZone getDefaultInAppContext() {
+        // JavaAWTAccess provides access implementation-private methods without using reflection.
+        JavaAWTAccess javaAWTAccess = SharedSecrets.getJavaAWTAccess();
+        if (javaAWTAccess == null) {
+            return mainAppContextDefault;
+        } else {
+            if (!javaAWTAccess.isDisposed()) {
+                TimeZone tz = (TimeZone)
+                    javaAWTAccess.get(TimeZone.class);
+                if (tz == null && javaAWTAccess.isMainAppContext()) {
+                    return mainAppContextDefault;
+                } else {
+                    return tz;
+                }
+            }
         }
         return null;
     }
@@ -736,19 +749,23 @@ abstract public class TimeZone implements Serializable, Cloneable {
      * tz. null is handled special: do nothing if any AppContext
      * hasn't been used, remove the default TimeZone in the
      * AppContext otherwise.
-     */
-    private synchronized static void setDefaultInAppContext(TimeZone tz) {
-        if (!hasSetInAppContext && tz == null) {
-            return;
-        }
-
-        AppContextDC ac = AppContextDC.getAppContext();
-        if (ac != null && !ac.isDisposed()) {
-            if (tz != null) {
-                ac.put(TimeZone.class, tz);
-                hasSetInAppContext = true;
-            } else {
-                ac.remove(TimeZone.class);
+     *
+     * Note that javaAWTAccess may be null if sun.awt.AppContext class hasn't
+     * been loaded. If so, it implies that AWTSecurityManager is not our
+     * SecurityManager and we can use a local static variable.
+     * This works around a build time issue.
+     */
+    private static void setDefaultInAppContext(TimeZone tz) {
+        // JavaAWTAccess provides access implementation-private methods without using reflection.
+        JavaAWTAccess javaAWTAccess = SharedSecrets.getJavaAWTAccess();
+        if (javaAWTAccess == null) {
+            mainAppContextDefault = tz;
+        } else {
+            if (!javaAWTAccess.isDisposed()) {
+                javaAWTAccess.put(TimeZone.class, tz);
+                if (javaAWTAccess.isMainAppContext()) {
+                    mainAppContextDefault = null;
+                }
             }
         }
     }
@@ -804,8 +821,8 @@ abstract public class TimeZone implements Serializable, Cloneable {
     static final String         GMT_ID        = "GMT";
     private static final int    GMT_ID_LENGTH = 3;
 
-    // true if the default TimeZone has been set in any AppContext
-    private static boolean hasSetInAppContext;
+    // a static TimeZone we can reference if no AppContext is in place
+    private static volatile TimeZone mainAppContextDefault;
 
     /**
      * Parses a custom time zone identifier and returns a corresponding zone.
diff --git a/external/ikvm/openjdk/map.xml b/external/ikvm/openjdk/map.xml
index 5bc4cd4..33393ac 100644
--- a/external/ikvm/openjdk/map.xml
+++ b/external/ikvm/openjdk/map.xml
@@ -228,6 +228,9 @@
             <attribute type="IKVM.Attributes.SignatureAttribute" sig="(Ljava.lang.String;)V">
                 <parameter>Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/lang/String;>;Ljava/lang/CharSequence;</parameter>
             </attribute>
+            <attribute type="IKVM.Attributes.NonNestedInnerClassAttribute" sig="(Ljava.lang.String;)V">
+                <parameter>java.lang.String$CaseInsensitiveComparator</parameter>
+            </attribute>
             <field name="serialVersionUID" sig="J" modifiers="private static final" constant="-6849794470754667710" />
             <constructor sig="()V" modifiers="public">
                 <alternateBody>
@@ -895,7 +898,7 @@
             <attribute type="System.SerializableAttribute" sig="()V" />
             <field name="serialVersionUID" sig="J" modifiers="private static final" constant="-3042686055658047285" />
             <field name="serialPersistentFields" sig="[Ljava.io.ObjectStreamField;" modifiers="private static final" />
-            <field name="suppressFillInStackTrace" sig="Z" modifiers="private static">
+            <field name="suppressFillInStackTrace" sig="Z" modifiers="static">
                 <attribute type="System.ThreadStaticAttribute" sig="()V" />
             </field>
             <field name="UNASSIGNED_STACK" sig="[Ljava.lang.StackTraceElement;" modifiers="static final" />
@@ -1669,23 +1672,6 @@
                 </body>
             </method>
         </class>
-        <class name="java.lang.Package">
-            <method name="getSystemPackage" sig="(Ljava.lang.String;)Ljava.lang.Package;">
-                <body>
-                    <ldsfld class="java.lang.Package" name="pkgs" sig="Ljava.util.Map;" />
-                    <ldarg_0 />
-                    <call class="java.lang.LangHelper" name="getSystemPackage" sig="(Ljava.util.Map;Ljava.lang.String;)Ljava.lang.Package;" />
-                    <ret />
-                </body>
-            </method>
-            <method name="getSystemPackages" sig="()[Ljava.lang.Package;">
-                <body>
-                    <ldsfld class="java.lang.Package" name="pkgs" sig="Ljava.util.Map;" />
-                    <call class="java.lang.LangHelper" name="getSystemPackages" sig="(Ljava.util.Map;)[Ljava.lang.Package;" />
-                    <ret />
-                </body>
-            </method>
-        </class>
         <!-- This is where the "native" helper methods start -->
         <class name="ikvm.lang.CIL">
             <method name="unbox_byte" sig="(Ljava.lang.Object;)B">
@@ -2732,7 +2718,7 @@
                 </attribute>
                 <body>
                     <ldarg_0 />
-                    <call type="IKVM.NativeCode.sun.reflect.Reflection" name="getCallerClass" sig="(I)Ljava.lang.Object;" />
+                    <call type="Java_sun_reflect_Reflection" name="getCallerClass" sig="(I)Ljava.lang.Object;" />
                     <stloc name="class" class="java.lang.Object" />
                     <!-- "leave" is to thwart tail-call optimization -->
                     <leave name="x" />
diff --git a/external/ikvm/openjdk/response.txt b/external/ikvm/openjdk/response.txt
index 9dca143..f7d9471 100644
--- a/external/ikvm/openjdk/response.txt
+++ b/external/ikvm/openjdk/response.txt
@@ -1,5 +1,5 @@
 #
-#  Copyright (C) 2002-2012 Jeroen Frijters
+#  Copyright (C) 2002-2013 Jeroen Frijters
 #
 #  This software is provided 'as-is', without any express or implied
 #  warranty.  In no event will the authors be held liable for any damages
@@ -27,9 +27,9 @@ assembly.class
     -baseaddress:0x56000000
     -remap:map.xml
     -exclude:exclude.lst
+    -resource:META-INF/MANIFEST.MF=MANIFEST.MF
     -resource:java/lang/uniName.dat=@OPENJDK7@/build/linux-amd64/classes/java/lang/uniName.dat
-    -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/META-INF/MANIFEST.MF
-    -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/sun/net/idn/uidna.spp
+    -resource:sun/net/idn/uidna.spp=@OPENJDK7@/build/linux-amd64/classes/sun/net/idn/uidna.spp
     ikvm/internal/*.class
     java/io/*.class
     java/lang/*.class
@@ -42,7 +42,6 @@ assembly.class
     java/util/*.class
     java/util/concurrent/locks/*.class
     gnu/java/util/*.class
-    sun/awt/AppContextDC.class
     sun/misc/*.class
     sun/net/sdp/*.class
     sun/net/www/protocol/file/*.class
@@ -52,6 +51,7 @@ assembly.class
     sun/nio/cs/*.class
     sun/nio/fs/*.class
     sun/reflect/*.class
+    sun/reflect/misc/*.class
     ../classpath/gnu/java/net/protocol/ikvmres/*.class
     ../classpath/ikvm/extensions/*.class
     ../classpath/ikvm/internal/*.class
@@ -428,7 +428,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.XML.Bind.dll
-    -baseaddress:0x582E0000
+    -baseaddress:0x582B0000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/javax/xml/bind/*
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/xml/internal/bind/*
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/xml/internal/fastinfoset/*
@@ -487,7 +487,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.XML.WebServices.dll
-    -baseaddress:0x58670000
+    -baseaddress:0x58610000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/xml/internal/messaging/*
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/xml/internal/ws/*
     @OPENJDK7@/build/linux-amd64/impsrc/com/sun/org/glassfish/external/amx/*.class
@@ -607,7 +607,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.XML.Crypto.dll
-    -baseaddress:0x58BE0000
+    -baseaddress:0x58B80000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/org/apache/xml/internal/security/*
     @OPENJDK7@/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/*.class
     @OPENJDK7@/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/*.class
@@ -643,7 +643,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.SwingAWT.dll
-    -baseaddress:0x58D30000
+    -baseaddress:0x58CD0000
     -remap:swingawt.xml
     -resource:META-INF/services/sun.java2d.pipe.RenderingEngine=resources/META-INF/services/sun.java2d.pipe.RenderingEngine
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/META-INF/services/sun.java2d.cmm.PCMM
@@ -743,7 +743,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Charsets.dll
-    -baseaddress:0x59F30000
+    -baseaddress:0x59E70000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/charsets.jar/sun/nio/cs/ext/sjis0213.dat
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/charsets.jar/META-INF/services/java.nio.charset.spi.CharsetProvider
     @OPENJDK7@/build/linux-amd64/gensrc/sun/nio/cs/ext/*.class
@@ -752,7 +752,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Util.dll
-    -baseaddress:0x5A5C0000
+    -baseaddress:0x5A500000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/java/util/jar/pack/intrinsic.properties
     -recurse:resources.zip/sun/launcher/resources/*
     -resource:META-INF/services/java.nio.file.spi.FileSystemProvider=@OPENJDK7@/jdk/src/share/demo/nio/zipfs/src/META-INF/services/java.nio.file.spi.FileSystemProvider
@@ -775,7 +775,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Text.dll
-    -baseaddress:0x5AB90000
+    -baseaddress:0x5AAD0000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/sun/text/*
     @OPENJDK7@/build/linux-amd64/j2re-image/lib/ext/localedata.jar
     @OPENJDK7@/jdk/src/share/classes/java/text/*.class
@@ -787,7 +787,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Security.dll
-    -baseaddress:0x5AE00000
+    -baseaddress:0x5AD40000
     -remap:security.xml
     sun/security/jgss/wrapper/*.class
     @OPENJDK7@/jdk/src/share/classes/com/sun/crypto/provider/*.class
@@ -858,7 +858,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Management.dll
-    -baseaddress:0x5B610000
+    -baseaddress:0x5B550000
     com/sun/management/*.class
     java/lang/management/*.class
     sun/management/*.class
@@ -892,7 +892,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Misc.dll
-    -baseaddress:0x5B970000
+    -baseaddress:0x5B8B0000
     -resource:com/sun/servicetag/resources/javase_5_swordfish.properties=@OPENJDK7@/jdk/src/share/classes/com/sun/servicetag/resources/javase_5_swordfish.properties
     -resource:com/sun/servicetag/resources/javase_6_swordfish.properties=@OPENJDK7@/jdk/src/share/classes/com/sun/servicetag/resources/javase_6_swordfish.properties
     -resource:com/sun/servicetag/resources/javase_7_swordfish.properties=@OPENJDK7@/jdk/src/share/classes/com/sun/servicetag/resources/javase_7_swordfish.properties
@@ -993,7 +993,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Naming.dll
-    -baseaddress:0x5BA90000
+    -baseaddress:0x5B9D0000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/jndi/ldap/jndiprovider.properties
     -resource:META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor=@OPENJDK7@/jdk/src/share/classes/sun/net/spi/nameservice/dns/META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor
     sun/net/dns/*.class
@@ -1019,7 +1019,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Jdbc.dll
-    -baseaddress:0x5BBE0000
+    -baseaddress:0x5BB20000
     -resource:META-INF/services/java.sql.Driver=resources/META-INF/services/java.sql.Driver
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/rowset/*
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/javax/sql/*
@@ -1037,7 +1037,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Remoting.dll
-    -baseaddress:0x5BD30000
+    -baseaddress:0x5BC70000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/sun/rmi/*
     @OPENJDK7@/build/linux-amd64/classes/sun/rmi/registry/*.class
     @OPENJDK7@/build/linux-amd64/classes/sun/rmi/server/*.class
@@ -1063,7 +1063,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Beans.dll
-    -baseaddress:0x5BE50000
+    -baseaddress:0x5BD90000
     @OPENJDK7@/build/linux-amd64/impsrc/com/sun/activation/registries/*.class
     @OPENJDK7@/build/linux-amd64/impsrc/javax/activation/*.class
     @OPENJDK7@/jdk/src/share/classes/com/sun/beans/*.class
@@ -1076,7 +1076,7 @@ assembly.class
 }
 {
     -out:IKVM.OpenJDK.Media.dll
-    -baseaddress:0x5BF10000
+    -baseaddress:0x5BE50000
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/META-INF/services/javax.print.*
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/META-INF/services/javax.sound.*
     -recurse:@OPENJDK7@/build/linux-amd64/j2re-image/lib/resources.jar/com/sun/imageio/plugins/common/iio-plugin.properties
diff --git a/external/ikvm/openjdk/sun/awt/AppContext.java b/external/ikvm/openjdk/sun/awt/AppContext.java
index be6734e..23c86c9 100644
--- a/external/ikvm/openjdk/sun/awt/AppContext.java
+++ b/external/ikvm/openjdk/sun/awt/AppContext.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,6 +46,7 @@ import sun.util.logging.PlatformLogger;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * The AppContext is a table referenced by ThreadGroup which stores
@@ -129,7 +130,7 @@ import java.util.concurrent.locks.ReentrantLock;
  * @author  Thomas Ball
  * @author  Fred Ecks
  */
-public final class AppContext extends AppContextDC {
+public final class AppContext {
     private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.AppContext");
 
     /* Since the contents of an AppContext are unique to each Java
@@ -161,8 +162,9 @@ public final class AppContext extends AppContextDC {
     }
 
     /* The main "system" AppContext, used by everything not otherwise
-       contained in another AppContext.
-     */
+       contained in another AppContext. It is implicitly created for
+       standalone apps only (i.e. not applets)
+    */
     private static volatile AppContext mainAppContext = null;
 
     /*
@@ -188,31 +190,16 @@ public final class AppContext extends AppContextDC {
     public static final String DISPOSED_PROPERTY_NAME = "disposed";
     public static final String GUI_DISPOSED = "guidisposed";
 
-    private volatile boolean isDisposed = false; // true if AppContext is disposed
+    private enum State {
+        VALID,
+        BEING_DISPOSED,
+        DISPOSED
+    };
 
-    public boolean isDisposed() {
-        return isDisposed;
-    }
+    private volatile State state = State.VALID;
 
-    static {
-        // On the main Thread, we get the ThreadGroup, make a corresponding
-        // AppContext, and instantiate the Java EventQueue.  This way, legacy
-        // code is unaffected by the move to multiple AppContext ability.
-        AccessController.doPrivileged(new PrivilegedAction() {
-            public Object run() {
-                ThreadGroup currentThreadGroup =
-                        Thread.currentThread().getThreadGroup();
-                ThreadGroup parentThreadGroup = currentThreadGroup.getParent();
-                while (parentThreadGroup != null) {
-                    // Find the root ThreadGroup to construct our main AppContext
-                    currentThreadGroup = parentThreadGroup;
-                    parentThreadGroup = currentThreadGroup.getParent();
-                }
-                mainAppContext = new AppContext(currentThreadGroup);
-                numAppContexts = 1;
-                return mainAppContext;
-            }
-        });
+    public boolean isDisposed() {
+        return state == State.DISPOSED;
     }
 
     /*
@@ -222,7 +209,7 @@ public final class AppContext extends AppContextDC {
      * number is 1.  If so, it returns the sole AppContext without
      * checking Thread.currentThread().
      */
-    private static volatile int numAppContexts;
+    private static final AtomicInteger numAppContexts = new AtomicInteger(0);
 
     /*
      * The context ClassLoader that was used to create this AppContext.
@@ -243,7 +230,7 @@ public final class AppContext extends AppContextDC {
      * @since   1.2
      */
     AppContext(ThreadGroup threadGroup) {
-        numAppContexts++;
+        numAppContexts.incrementAndGet();
 
         this.threadGroup = threadGroup;
         threadGroup2appContext.put(threadGroup, this);
@@ -266,6 +253,27 @@ public final class AppContext extends AppContextDC {
     private static final ThreadLocal<AppContext> threadAppContext =
             new ThreadLocal<AppContext>();
 
+    private final static void initMainAppContext() {
+        // On the main Thread, we get the ThreadGroup, make a corresponding
+        // AppContext, and instantiate the Java EventQueue.  This way, legacy
+        // code is unaffected by the move to multiple AppContext ability.
+        AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            public Void run() {
+                ThreadGroup currentThreadGroup =
+                        Thread.currentThread().getThreadGroup();
+                ThreadGroup parentThreadGroup = currentThreadGroup.getParent();
+                while (parentThreadGroup != null) {
+                    // Find the root ThreadGroup to construct our main AppContext
+                    currentThreadGroup = parentThreadGroup;
+                    parentThreadGroup = currentThreadGroup.getParent();
+                }
+
+                mainAppContext = SunToolkit.createNewAppContext(currentThreadGroup);
+                return null;
+            }
+        });
+    }
+
     /**
      * Returns the appropriate AppContext for the caller,
      * as determined by its ThreadGroup.  If the main "system" AppContext
@@ -278,8 +286,10 @@ public final class AppContext extends AppContextDC {
      * @since   1.2
      */
     public final static AppContext getAppContext() {
-        if (numAppContexts == 1)   // If there's only one system-wide,
-            return mainAppContext; // return the main system AppContext.
+        // we are standalone app, return the main app context
+        if (numAppContexts.get() == 1 && mainAppContext != null) {
+            return mainAppContext;
+        }
 
         AppContext appContext = threadAppContext.get();
 
@@ -293,29 +303,37 @@ public final class AppContext extends AppContextDC {
                     // when new AppContext objects are created.
                     ThreadGroup currentThreadGroup = Thread.currentThread().getThreadGroup();
                     ThreadGroup threadGroup = currentThreadGroup;
+
+                    // Special case: we implicitly create the main app context
+                    // if no contexts have been created yet. This covers standalone apps
+                    // and excludes applets because by the time applet starts
+                    // a number of contexts have already been created by the plugin.
+                    if (numAppContexts.get() == 0) {
+                        // This check is not necessary, its purpose is to help
+                        // Plugin devs to catch all the cases of main AC creation.
+                        if (System.getProperty("javaplugin.version") == null &&
+                                System.getProperty("javawebstart.version") == null) {
+                            initMainAppContext();
+                        }
+                    }
+
                     AppContext context = threadGroup2appContext.get(threadGroup);
                     while (context == null) {
                         threadGroup = threadGroup.getParent();
                         if (threadGroup == null) {
-                            // If we get here, we're running under a ThreadGroup that
-                            // has no AppContext associated with it.  This should never
-                            // happen, because createNewContext() should be used by the
-                            // toolkit to create the ThreadGroup that everything runs
-                            // under.
-                            throw new RuntimeException("Invalid ThreadGroup");
+                            return null;
                         }
                         context = threadGroup2appContext.get(threadGroup);
                     }
+
                     // In case we did anything in the above while loop, we add
                     // all the intermediate ThreadGroups to threadGroup2appContext
                     // so we won't spin again.
                     for (ThreadGroup tg = currentThreadGroup; tg != threadGroup; tg = tg.getParent()) {
                         threadGroup2appContext.put(tg, context);
                     }
+
                     // Now we're done, so we cache the latest key/value pair.
-                    // (we do this before checking with any AWTSecurityManager, so if
-                    // this Thread equates with the main AppContext in the cache, it
-                    // still will)
                     threadAppContext.set(context);
 
                     return context;
@@ -323,33 +341,30 @@ public final class AppContext extends AppContextDC {
             });
         }
 
-        if (appContext == mainAppContext)  {
-            // Before we return the main "system" AppContext, check to
-            // see if there's an AWTSecurityManager installed.  If so,
-            // allow it to choose the AppContext to return.
-            SecurityManager securityManager = System.getSecurityManager();
-            if ((securityManager != null) &&
-                (securityManager instanceof AWTSecurityManager))
-            {
-                AWTSecurityManager awtSecMgr = (AWTSecurityManager)securityManager;
-                AppContext secAppContext = awtSecMgr.getAppContext();
-                if (secAppContext != null)  {
-                    appContext = secAppContext; // Return what we're told
-                }
-            }
-        }
-
         return appContext;
     }
 
     /**
-     * Returns the main ("system") AppContext.
+     * Returns true if the specified AppContext is the main AppContext.
      *
-     * @return  the main AppContext
+     * @param   ctx the context to compare with the main context
+     * @return  true if the specified AppContext is the main AppContext.
      * @since   1.8
      */
-    final static AppContext getMainAppContext() {
-        return mainAppContext;
+    public final static boolean isMainContext(AppContext ctx) {
+        return (ctx != null && ctx == mainAppContext);
+    }
+
+    private final static AppContext getExecutionAppContext() {
+        SecurityManager securityManager = System.getSecurityManager();
+        if ((securityManager != null) &&
+            (securityManager instanceof AWTSecurityManager))
+        {
+            AWTSecurityManager awtSecMgr = (AWTSecurityManager) securityManager;
+            AppContext secAppContext = awtSecMgr.getAppContext();
+            return secAppContext; // Return what we're told
+        }
+        return null;
     }
 
     private long DISPOSAL_TIMEOUT = 5000;  // Default to 5-second timeout
@@ -383,10 +398,11 @@ public final class AppContext extends AppContextDC {
         }
 
         synchronized(this) {
-            if (this.isDisposed) {
-                return; // If already disposed, bail.
+            if (this.state != State.VALID) {
+                return; // If already disposed or being disposed, bail.
             }
-            this.isDisposed = true;
+
+            this.state = State.BEING_DISPOSED;
         }
 
         final PropertyChangeSupport changeSupport = this.changeSupport;
@@ -401,6 +417,27 @@ public final class AppContext extends AppContextDC {
 
         Runnable runnable = new Runnable() {
             public void run() {
+                Window[] windowsToDispose = Window.getOwnerlessWindows();
+                for (Window w : windowsToDispose) {
+                    try {
+                        w.dispose();
+                    } catch (Throwable t) {
+                        log.finer("exception occured while disposing app context", t);
+                    }
+                }
+                AccessController.doPrivileged(new PrivilegedAction() {
+                        public Object run() {
+                            if (!GraphicsEnvironment.isHeadless() && SystemTray.isSupported())
+                            {
+                                SystemTray systemTray = SystemTray.getSystemTray();
+                                TrayIcon[] trayIconsToDispose = systemTray.getTrayIcons();
+                                for (TrayIcon ti : trayIconsToDispose) {
+                                    systemTray.remove(ti);
+                                }
+                            }
+                            return null;
+                        }
+                    });
                 // Alert PropertyChangeListeners that the GUI has been disposed.
                 if (changeSupport != null) {
                     changeSupport.firePropertyChange(GUI_DISPOSED, false, true);
@@ -435,6 +472,11 @@ public final class AppContext extends AppContextDC {
             } catch (InterruptedException e) { }
         }
 
+        // We are done with posting events, so change the state to disposed
+        synchronized(this) {
+            this.state = State.DISPOSED;
+        }
+
         // Next, we interrupt all Threads in the ThreadGroup
         this.threadGroup.interrupt();
             // Note, the EventDispatchThread we've interrupted may dump an
@@ -492,7 +534,7 @@ public final class AppContext extends AppContextDC {
             this.table.clear(); // Clear out the Hashtable to ease garbage collection
         }
 
-        numAppContexts--;
+        numAppContexts.decrementAndGet();
 
         mostRecentKeyValue = null;
     }
@@ -766,6 +808,50 @@ public final class AppContext extends AppContextDC {
         }
         return changeSupport.getPropertyChangeListeners(propertyName);
     }
+
+    // Set up JavaAWTAccess in SharedSecrets
+    static {
+        sun.misc.SharedSecrets.setJavaAWTAccess(new sun.misc.JavaAWTAccess() {
+            public Object get(Object key) {
+                AppContext ac = getAppContext();
+                return (ac == null) ? null : ac.get(key);
+            }
+            public void put(Object key, Object value) {
+                AppContext ac = getAppContext();
+                if (ac != null) {
+                    ac.put(key, value);
+                }
+            }
+            public void remove(Object key) {
+                AppContext ac = getAppContext();
+                if (ac != null) {
+                    ac.remove(key);
+                }
+            }
+            public boolean isDisposed() {
+                AppContext ac = getAppContext();
+                return (ac == null) ? true : ac.isDisposed();
+            }
+            public boolean isMainAppContext() {
+                return (numAppContexts.get() == 1 && mainAppContext != null);
+            }
+            public Object getContext() {
+                return getAppContext();
+            }
+            public Object getExecutionContext() {
+                return getExecutionAppContext();
+            }
+            public Object get(Object context, Object key) {
+                return ((AppContext)context).get(key);
+            }
+            public void put(Object context, Object key, Object value) {
+                ((AppContext)context).put(key, value);
+            }
+            public void remove(Object context, Object key) {
+                ((AppContext)context).remove(key);
+            }
+        });
+    }
 }
 
 final class MostRecentKeyValue {
diff --git a/external/ikvm/openjdk/sun/awt/AppContextDC.java b/external/ikvm/openjdk/sun/awt/AppContextDC.java
deleted file mode 100644
index 47e71d6..0000000
--- a/external/ikvm/openjdk/sun/awt/AppContextDC.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-  Copyright (C) 2012 Jeroen Frijters
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  Jeroen Frijters
-  jeroen at frijters.net
-  
-*/
-package sun.awt;
-
-/* This class exists to decouple java.util.TimeZone from sun.awt.AppContext */
-public abstract class AppContextDC
-{
-    public abstract boolean isDisposed();
-    public abstract Object get(Object key);
-    public abstract Object put(Object key, Object value);
-    public abstract Object remove(Object key);
-
-    public static AppContextDC getAppContext()
-    {
-        try
-        {
-            return (AppContextDC)Class.forName("sun.awt.AppContext").getMethod("getAppContext").invoke(null);
-        }
-        catch (Exception _)
-        {
-            return null;
-        }
-    }
-}
diff --git a/external/ikvm/openjdk/sun/awt/SunToolkit.java b/external/ikvm/openjdk/sun/awt/SunToolkit.java
index fa457d5..11612ec 100644
--- a/external/ikvm/openjdk/sun/awt/SunToolkit.java
+++ b/external/ikvm/openjdk/sun/awt/SunToolkit.java
@@ -64,7 +64,7 @@ public abstract class SunToolkit extends Toolkit
     implements WindowClosingSupport, WindowClosingListener,
     ComponentFactory, InputMethodSupport, KeyboardFocusManagerPeerProvider {
 
-    private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.SunToolkit");
+    // 8014736: logging has been removed from SunToolkit
 
     /**
      * Special mask for the UngrabEvent events, in addition to the
@@ -97,6 +97,14 @@ public abstract class SunToolkit extends Toolkit
      */
     public final static int MAX_BUTTONS_SUPPORTED = 20;
 
+    /**
+     * Creates and initializes EventQueue instance for the specified
+     * AppContext.
+     * Note that event queue must be created from createNewAppContext()
+     * only in order to ensure that EventQueue constructor obtains
+     * the correct AppContext.
+     * @param appContext AppContext to associate with the event queue
+     */
     private static void initEQ(AppContext appContext) {
         EventQueue eventQueue;
 
@@ -117,8 +125,6 @@ public abstract class SunToolkit extends Toolkit
     }
 
     public SunToolkit() {
-        // 7122796: Always create an EQ for the main AppContext
-        initEQ(AppContext.getMainAppContext());
     }
 
     public boolean useBufferPerWindow() {
@@ -277,11 +283,14 @@ public abstract class SunToolkit extends Toolkit
      */
     public static AppContext createNewAppContext() {
         ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
+        return createNewAppContext(threadGroup);
+    }
+
+    static final AppContext createNewAppContext(ThreadGroup threadGroup) {
         // Create appContext before initialization of EventQueue, so all
         // the calls to AppContext.getAppContext() from EventQueue ctor
         // return correct values
         AppContext appContext = new AppContext(threadGroup);
-
         initEQ(appContext);
 
         return appContext;
@@ -512,10 +521,6 @@ public abstract class SunToolkit extends Toolkit
         // otherwise have to be modified to precisely identify
         // system-generated events.
         setSystemGenerated(event);
-        AppContext eventContext = targetToAppContext(event.getSource());
-        if (eventContext != null && !eventContext.equals(appContext)) {
-            log.fine("Event posted on wrong app context : " + event);
-        }
         PostEventQueue postEventQueue =
             (PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY);
         if (postEventQueue != null) {
@@ -544,20 +549,28 @@ public abstract class SunToolkit extends Toolkit
      * EventQueue yet.
      */
     public static void flushPendingEvents()  {
+        AppContext appContext = AppContext.getAppContext();
+        flushPendingEvents(appContext);
+    }
+
+    public static void flushPendingEvents(AppContext appContext)  {
         flushLock.lock();
         try {
             // Don't call flushPendingEvents() recursively
             if (!isFlushingPendingEvents) {
                 isFlushingPendingEvents = true;
-                AppContext appContext = AppContext.getAppContext();
-                PostEventQueue postEventQueue =
-                    (PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY);
-                if (postEventQueue != null) {
-                    postEventQueue.flush();
+                try {
+                    PostEventQueue postEventQueue =
+                        (PostEventQueue)appContext.get(POST_EVENT_QUEUE_KEY);
+                    if (postEventQueue != null) {
+                        postEventQueue.flush();
+                    }
+                }
+                finally {
+                    isFlushingPendingEvents = false;
                 }
             }
         } finally {
-            isFlushingPendingEvents = false;
             flushLock.unlock();
         }
     }
@@ -798,10 +811,6 @@ public abstract class SunToolkit extends Toolkit
             //with scale factors x1, x3/4, x2/3, xN, x1/N.
             Image im = i.next();
             if (im == null) {
-                if (log.isLoggable(PlatformLogger.FINER)) {
-                    log.finer("SunToolkit.getScaledIconImage: " +
-                              "Skipping the image passed into Java because it's null.");
-                }
                 continue;
             }
             if (im instanceof ToolkitImage) {
@@ -814,10 +823,6 @@ public abstract class SunToolkit extends Toolkit
                 iw = im.getWidth(null);
                 ih = im.getHeight(null);
             } catch (Exception e){
-                if (log.isLoggable(PlatformLogger.FINER)) {
-                    log.finer("SunToolkit.getScaledIconImage: " +
-                              "Perhaps the image passed into Java is broken. Skipping this icon.");
-                }
                 continue;
             }
             if (iw > 0 && ih > 0) {
@@ -889,14 +894,6 @@ public abstract class SunToolkit extends Toolkit
         try {
             int x = (width - bestWidth) / 2;
             int y = (height - bestHeight) / 2;
-            if (log.isLoggable(PlatformLogger.FINER)) {
-                log.finer("WWindowPeer.getScaledIconData() result : " +
-                        "w : " + width + " h : " + height +
-                        " iW : " + bestImage.getWidth(null) + " iH : " + bestImage.getHeight(null) +
-                        " sim : " + bestSimilarity + " sf : " + bestScaleFactor +
-                        " adjW : " + bestWidth + " adjH : " + bestHeight +
-                        " x : " + x + " y : " + y);
-            }
             g.drawImage(bestImage, x, y, bestWidth, bestHeight, null);
         } finally {
             g.dispose();
@@ -907,10 +904,6 @@ public abstract class SunToolkit extends Toolkit
     public static DataBufferInt getScaledIconData(java.util.List<Image> imageList, int width, int height) {
         BufferedImage bimage = getScaledIconImage(imageList, width, height);
         if (bimage == null) {
-             if (log.isLoggable(PlatformLogger.FINER)) {
-                 log.finer("SunToolkit.getScaledIconData: " +
-                           "Perhaps the image passed into Java is broken. Skipping this icon.");
-             }
             return null;
         }
         Raster raster = bimage.getRaster();
@@ -1768,25 +1761,6 @@ public abstract class SunToolkit extends Toolkit
         return (Window)comp;
     }
 
-    /**
-     * Returns the value of the system property indicated by the specified key.
-     */
-    public static String getSystemProperty(final String key) {
-        return (String)AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return System.getProperty(key);
-                }
-            });
-    }
-
-    /**
-     * Returns the boolean value of the system property indicated by the specified key.
-     */
-    protected static Boolean getBooleanSystemProperty(String key) {
-        return Boolean.valueOf(AccessController.
-                   doPrivileged(new GetBooleanAction(key)));
-    }
-
     private static Boolean sunAwtDisableMixing = null;
 
     /**
@@ -1795,7 +1769,8 @@ public abstract class SunToolkit extends Toolkit
      */
     public synchronized static boolean getSunAwtDisableMixing() {
         if (sunAwtDisableMixing == null) {
-            sunAwtDisableMixing = getBooleanSystemProperty("sun.awt.disableMixing");
+            sunAwtDisableMixing = AccessController.doPrivileged(
+                                      new GetBooleanAction("sun.awt.disableMixing"));
         }
         return sunAwtDisableMixing.booleanValue();
     }
@@ -1809,6 +1784,28 @@ public abstract class SunToolkit extends Toolkit
         return false;
     }
 
+    private static final Object DEACTIVATION_TIMES_MAP_KEY = new Object();
+
+    public synchronized void setWindowDeactivationTime(Window w, long time) {
+        AppContext ctx = getAppContext(w);
+        WeakHashMap<Window, Long> map = (WeakHashMap<Window, Long>)ctx.get(DEACTIVATION_TIMES_MAP_KEY);
+        if (map == null) {
+            map = new WeakHashMap<Window, Long>();
+            ctx.put(DEACTIVATION_TIMES_MAP_KEY, map);
+        }
+        map.put(w, time);
+    }
+
+    public synchronized long getWindowDeactivationTime(Window w) {
+        AppContext ctx = getAppContext(w);
+        WeakHashMap<Window, Long> map = (WeakHashMap<Window, Long>)ctx.get(DEACTIVATION_TIMES_MAP_KEY);
+        if (map == null) {
+            return -1;
+        }
+        Long time = map.get(w);
+        return time == null ? -1 : time;
+    }
+
     // Cosntant alpha
     public boolean isWindowOpacitySupported() {
         return false;
@@ -1829,6 +1826,13 @@ public abstract class SunToolkit extends Toolkit
     }
 
     /**
+     * Returns true if swing backbuffer should be translucent.
+     */
+    public boolean isSwingBackbufferTranslucencySupported() {
+        return false;
+    }
+
+    /**
      * Returns whether or not a containing top level window for the passed
      * component is
      * {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT PERPIXEL_TRANSLUCENT}.
@@ -1949,25 +1953,41 @@ class PostEventQueue {
     private EventQueueItem queueTail = null;
     private final EventQueue eventQueue;
 
+    // For the case when queue is cleared but events are not posted
+    private volatile boolean isFlushing = false;
+
     PostEventQueue(EventQueue eq) {
         eventQueue = eq;
     }
 
     public synchronized boolean noEvents() {
-        return queueHead == null;
+        return queueHead == null && !isFlushing;
     }
 
     /*
      * Continually post pending AWTEvents to the Java EventQueue. The method
      * is synchronized to ensure the flush is completed before a new event
      * can be posted to this queue.
+     *
+     * 7177040: The method couldn't be wholly synchronized because of calls
+     * of EventQueue.postEvent() that uses pushPopLock, otherwise it could
+     * potentially lead to deadlock
      */
-    public synchronized void flush() {
-        EventQueueItem tempQueue = queueHead;
-        queueHead = queueTail = null;
-        while (tempQueue != null) {
-            eventQueue.postEvent(tempQueue.event);
-            tempQueue = tempQueue.next;
+    public void flush() {
+        EventQueueItem tempQueue;
+        synchronized (this) {
+            tempQueue = queueHead;
+            queueHead = queueTail = null;
+            isFlushing = (tempQueue != null);
+        }
+        try {
+            while (tempQueue != null) {
+                eventQueue.postEvent(tempQueue.event);
+                tempQueue = tempQueue.next;
+            }
+        }
+        finally {
+            isFlushing = false;
         }
     }
 
diff --git a/external/ikvm/openjdk/sun/awt/image/ByteComponentRaster.java b/external/ikvm/openjdk/sun/awt/image/ByteComponentRaster.java
deleted file mode 100644
index 912542a..0000000
--- a/external/ikvm/openjdk/sun/awt/image/ByteComponentRaster.java
+++ /dev/null
@@ -1,919 +0,0 @@
-/*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.awt.image;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-import java.awt.image.RasterFormatException;
-import java.awt.image.SampleModel;
-import java.awt.image.ComponentSampleModel;
-import java.awt.image.SinglePixelPackedSampleModel;
-import java.awt.image.DataBuffer;
-import java.awt.image.DataBufferByte;
-import java.awt.Rectangle;
-import java.awt.Point;
-
-/**
- * This class defines a Raster with pixels consisting of one or more 8-bit
- * data elements stored in close proximity to each other in a single byte
- * array.
- * The bit precision per data element is that
- * of the data type (that is, the bit precision for this Raster is 8).
- * There is only one pixel stride and one scanline stride for all
- * bands.  This type of Raster can be used with a
- * ComponentColorModel if there are multiple bands, or an
- * IndexColorModel if there is only one band.
- * <p>
- * For example, 3-3-2 RGB image data can be represented by a
- * ByteComponentRaster using a SinglePixelPackedSampleModel and
- * a ComponentColorModel.
- *
- */
-public class ByteComponentRaster extends SunWritableRaster {
-
-    /** private band offset for use by native code */
-    protected int bandOffset;
-
-    /** Data offsets for each band of image data. */
-    protected int[]         dataOffsets;
-
-    /** Scanline stride of the image data contained in this Raster. */
-    protected int           scanlineStride;
-
-    /** Pixel stride of the image data contained in this Raster. */
-    protected int           pixelStride;
-
-    /** The image data array. */
-    protected byte[]        data;
-
-    int type;
-
-    /** A cached copy of minX + width for use in bounds checks. */
-    private int maxX;
-
-    /** A cached copy of minY + height for use in bounds checks. */
-    private int maxY;
-
-    /**
-     * Constructs a ByteComponentRaster with the given SampleModel.
-     * The Raster's upper left corner is origin and it is the same
-     * size as the SampleModel.  A DataBuffer large enough to describe the
-     * Raster is automatically created.  SampleModel must be of type
-     * SinglePixelPackedSampleModel or ComponentSampleModel.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param origin          The Point that specified the origin.
-     */
-    public ByteComponentRaster(SampleModel sampleModel, Point origin) {
-        this(sampleModel,
-             sampleModel.createDataBuffer(),
-             new Rectangle(origin.x,
-                           origin.y,
-                           sampleModel.getWidth(),
-                           sampleModel.getHeight()),
-             origin,
-             null);
-    }
-
-    /**
-     * Constructs a ByteComponentRaster with the given SampleModel
-     * and DataBuffer.  The Raster's upper left corner is origin and
-     * it is the same size as the SampleModel.  The DataBuffer is not
-     * initialized and must be a DataBufferByte compatible with SampleModel.
-     * SampleModel must be of type SinglePixelPackedSampleModel
-     * or ComponentSampleModel.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param dataBuffer      The DataBufferShort that contains the image data.
-     * @param origin          The Point that specifies the origin.
-     */
-    public ByteComponentRaster(SampleModel sampleModel,
-                                  DataBuffer dataBuffer,
-                                  Point origin) {
-        this(sampleModel,
-             dataBuffer,
-             new Rectangle(origin.x,
-                           origin.y,
-                           sampleModel.getWidth(),
-                           sampleModel.getHeight()),
-             origin,
-             null);
-    }
-
-    /**
-     * Constructs a ByteComponentRaster with the given SampleModel,
-     * DataBuffer, and parent.  DataBuffer must be a DataBufferByte and
-     * SampleModel must be of type SinglePixelPackedSampleModel
-     * or ComponentSampleModel.
-     * When translated into the base Raster's
-     * coordinate system, aRegion must be contained by the base Raster.
-     * Origin is the coordinate in the new Raster's coordinate system of
-     * the origin of the base Raster.  (The base Raster is the Raster's
-     * ancestor which has no parent.)
-     *
-     * Note that this constructor should generally be called by other
-     * constructors or create methods, it should not be used directly.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param dataBuffer      The DataBufferShort that contains the image data.
-     * @param aRegion         The Rectangle that specifies the image area.
-     * @param origin          The Point that specifies the origin.
-     * @param parent          The parent (if any) of this raster.
-     */
-    public ByteComponentRaster(SampleModel sampleModel,
-                                  DataBuffer dataBuffer,
-                                  Rectangle aRegion,
-                                  Point origin,
-                                  ByteComponentRaster parent) {
-        super(sampleModel, dataBuffer, aRegion, origin, parent);
-        this.maxX = minX + width;
-        this.maxY = minY + height;
-
-        if (!(dataBuffer instanceof DataBufferByte)) {
-            throw new RasterFormatException("ByteComponentRasters must have " +
-                                            "byte DataBuffers");
-        }
-
-        DataBufferByte dbb = (DataBufferByte)dataBuffer;
-        this.data = stealData(dbb, 0);
-        if (dbb.getNumBanks() != 1) {
-            throw new
-                RasterFormatException("DataBuffer for ByteComponentRasters"+
-                                      " must only have 1 bank.");
-        }
-        int dbOffset = dbb.getOffset();
-
-        if (sampleModel instanceof ComponentSampleModel) {
-            ComponentSampleModel ism = (ComponentSampleModel)sampleModel;
-            this.type = IntegerComponentRaster.TYPE_BYTE_SAMPLES;
-            this.scanlineStride = ism.getScanlineStride();
-            this.pixelStride = ism.getPixelStride();
-            this.dataOffsets = ism.getBandOffsets();
-            int xOffset = aRegion.x - origin.x;
-            int yOffset = aRegion.y - origin.y;
-            for (int i = 0; i < getNumDataElements(); i++) {
-                dataOffsets[i] += dbOffset +
-                    xOffset*pixelStride+yOffset*scanlineStride;
-            }
-        } else if (sampleModel instanceof SinglePixelPackedSampleModel) {
-            SinglePixelPackedSampleModel sppsm =
-                    (SinglePixelPackedSampleModel)sampleModel;
-            this.type = IntegerComponentRaster.TYPE_BYTE_PACKED_SAMPLES;
-            this.scanlineStride = sppsm.getScanlineStride();
-            this.pixelStride    = 1;
-            this.dataOffsets = new int[1];
-            this.dataOffsets[0] = dbOffset;
-            int xOffset = aRegion.x - origin.x;
-            int yOffset = aRegion.y - origin.y;
-            dataOffsets[0] += xOffset*pixelStride+yOffset*scanlineStride;
-        } else {
-            throw new RasterFormatException("IntegerComponentRasters must " +
-                "have ComponentSampleModel or SinglePixelPackedSampleModel");
-        }
-        this.bandOffset = this.dataOffsets[0];
-
-        verify(false);
-    }
-
-    /**
-     * Returns a copy of the data offsets array. For each band the data offset
-     * is the index into the band's data array, of the first sample of the
-     * band.
-     */
-    public int[] getDataOffsets() {
-        return (int[]) dataOffsets.clone();
-    }
-
-    /**
-     * Returns the data offset for the specified band.  The data offset
-     * is the index into the data array
-     * in which the first sample of the first scanline is stored.
-     * @param band  The band whose offset is returned.
-     */
-    public int getDataOffset(int band) {
-        return dataOffsets[band];
-    }
-
-    /**
-     * Returns the scanline stride -- the number of data array elements between
-     * a given sample and the sample in the same column of the next row in the
-     * same band.
-     */
-    public int getScanlineStride() {
-        return scanlineStride;
-    }
-
-    /**
-     * Returns pixel stride -- the number of data array elements between two
-     * samples for the same band on the same scanline.
-     */
-    public int getPixelStride() {
-        return pixelStride;
-    }
-
-    /**
-     * Returns a reference to the data array.
-     */
-    public byte[] getDataStorage() {
-        return data;
-    }
-
-    /**
-     * Returns the data elements for all bands at the specified
-     * location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinate is out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * @param x        The X coordinate of the pixel location.
-     * @param y        The Y coordinate of the pixel location.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length getNumDataElements().
-     *                 If null an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the request pixel data.
-     */
-    public Object getDataElements(int x, int y, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x >= this.maxX) || (y >= this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        byte outData[];
-        if (obj == null) {
-            outData = new byte[numDataElements];
-        } else {
-            outData = (byte[])obj;
-        }
-        int off = (y-minY)*scanlineStride +
-                  (x-minX)*pixelStride;
-
-        for (int band = 0; band < numDataElements; band++) {
-            outData[band] = data[dataOffsets[band] + off];
-        }
-
-        return outData;
-    }
-
-    /**
-     * Returns an array of data elements from the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * <pre>
-     *       byte[] bandData = (byte[])raster.getDataElements(x, y, w, h, null);
-     *       int numDataElements = raster.getNumDataElements();
-     *       byte[] pixel = new byte[numDataElements];
-     *       // To find a data element at location (x2, y2)
-     *       System.arraycopy(bandData, ((y2-y)*w + (x2-x))*numDataElements,
-     *                        pixel, 0, numDataElements);
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements().
-     *                 If null an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the request pixel data.
-     */
-    public Object getDataElements(int x, int y, int w, int h, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        byte outData[];
-        if (obj == null) {
-            outData = new byte[w*h*numDataElements];
-        } else {
-            outData = (byte[])obj;
-        }
-
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    outData[off++] = data[dataOffsets[c] + xoff];
-                }
-            }
-        }
-
-        return outData;
-    }
-
-    /**
-     * Returns a byte array of data elements from the specified rectangular
-     * region for the specified band.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * <pre>
-     *       byte[] bandData = raster.getByteData(x, y, w, h, null);
-     *       // To find the data element at location (x2, y2)
-     *       byte bandElement = bandData[((y2-y)*w + (x2-x))];
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param band     The band to return.
-     * @param outData  If non-null, data elements for all bands
-     *                 at the specified location are returned in this array.
-     * @return         Data array with data elements for all bands.
-     */
-    public byte[] getByteData(int x, int y, int w, int h,
-                              int band, byte[] outData) {
-        // Bounds check for 'band' will be performed automatically
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        if (outData == null) {
-            outData = new byte[scanlineStride*h];
-        }
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride + dataOffsets[band];
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        if (pixelStride == 1) {
-            if (scanlineStride == w) {
-                System.arraycopy(data, yoff, outData, 0, w*h);
-            }
-            else {
-                for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                    System.arraycopy(data, yoff, outData, off, w);
-                    off += w;
-                }
-            }
-        }
-        else {
-            for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                xoff = yoff;
-                for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                    outData[off++] = data[xoff];
-                }
-            }
-        }
-
-        return outData;
-    }
-
-    /**
-     * Returns a byte array of data elements from the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * <pre>
-     *       byte[] bandData = raster.getByteData(x, y, w, h, null);
-     *       int numDataElements = raster.getnumDataElements();
-     *       byte[] pixel = new byte[numDataElements];
-     *       // To find a data element at location (x2, y2)
-     *       System.arraycopy(bandData, ((y2-y)*w + (x2-x))*numDataElements,
-     *                        pixel, 0, numDataElements);
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param outData  If non-null, data elements for all bands
-     *                 at the specified location are returned in this array.
-     * @return         Data array with data elements for all bands.
-     */
-    public byte[] getByteData(int x, int y, int w, int h, byte[] outData) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        if (outData == null) {
-            outData = new byte[numDataElements*scanlineStride*h];
-        }
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        // REMIND: Should keep track if dataOffsets are in a nice order
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    outData[off++] = data[dataOffsets[c] + xoff];
-                }
-            }
-        }
-
-        return outData;
-    }
-
-    /**
-     * Stores the data elements for all bands at the specified location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinate is out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * @param x        The X coordinate of the pixel location.
-     * @param y        The Y coordinate of the pixel location.
-     * @param inData   An object reference to an array of type defined by
-     *                 getTransferType() and length getNumDataElements()
-     *                 containing the pixel data to place at x,y.
-     */
-    public void setDataElements(int x, int y, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x >= this.maxX) || (y >= this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        byte inData[] = (byte[])obj;
-        int off = (y-minY)*scanlineStride +
-                  (x-minX)*pixelStride;
-
-        for (int i = 0; i < numDataElements; i++) {
-            data[dataOffsets[i] + off] = inData[i];
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Stores the Raster data at the specified location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * @param x          The X coordinate of the pixel location.
-     * @param y          The Y coordinate of the pixel location.
-     * @param inRaster   Raster of data to place at x,y location.
-     */
-    public void setDataElements(int x, int y, Raster inRaster) {
-        int dstOffX = inRaster.getMinX() + x;
-        int dstOffY = inRaster.getMinY() + y;
-        int width  = inRaster.getWidth();
-        int height = inRaster.getHeight();
-        if ((dstOffX < this.minX) || (dstOffY < this.minY) ||
-            (dstOffX + width > this.maxX) || (dstOffY + height > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-
-        setDataElements(dstOffX, dstOffY, width, height, inRaster);
-    }
-
-    /**
-     * Stores the Raster data at the specified location.
-     * @param dstX The absolute X coordinate of the destination pixel
-     * that will receive a copy of the upper-left pixel of the
-     * inRaster
-     * @param dstY The absolute Y coordinate of the destination pixel
-     * that will receive a copy of the upper-left pixel of the
-     * inRaster
-     * @param width      The number of pixels to store horizontally
-     * @param height     The number of pixels to store vertically
-     * @param inRaster   Raster of data to place at x,y location.
-     */
-    private void setDataElements(int dstX, int dstY,
-                                 int width, int height,
-                                 Raster inRaster) {
-        // Assume bounds checking has been performed previously
-        if (width <= 0 || height <= 0) {
-            return;
-        }
-
-        int srcOffX = inRaster.getMinX();
-        int srcOffY = inRaster.getMinY();
-        Object tdata = null;
-
-        if (inRaster instanceof ByteComponentRaster) {
-            ByteComponentRaster bct = (ByteComponentRaster) inRaster;
-            byte[] bdata = bct.getDataStorage();
-            // REMIND: Do something faster!
-            if (numDataElements == 1) {
-                int toff = bct.getDataOffset(0);
-                int tss  = bct.getScanlineStride();
-
-                int srcOffset = toff;
-                int dstOffset = dataOffsets[0]+(dstY-minY)*scanlineStride+
-                                               (dstX-minX);
-
-
-                if (pixelStride == bct.getPixelStride()) {
-                    width *= pixelStride;
-                    for (int tmpY=0; tmpY < height; tmpY++) {
-                        System.arraycopy(bdata, srcOffset,
-                                         data, dstOffset, width);
-                        srcOffset += tss;
-                        dstOffset += scanlineStride;
-                    }
-                    markDirty();
-                    return;
-                }
-            }
-        }
-
-        for (int startY=0; startY < height; startY++) {
-            // Grab one scanline at a time
-            tdata = inRaster.getDataElements(srcOffX, srcOffY+startY,
-                                             width, 1, tdata);
-            setDataElements(dstX, dstY+startY, width, 1, tdata);
-        }
-    }
-
-    /**
-     * Stores an array of data elements into the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * for the nth band at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))*numDataElements + n]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param inData   An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements()
-     *                 containing the pixel data to place between x,y and
-     *                 x+h, y+h.
-     */
-    public void setDataElements(int x, int y, int w, int h, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        byte inData[] = (byte[])obj;
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        if (numDataElements == 1) {
-            int srcOffset = 0;
-            int dstOffset = yoff + dataOffsets[0];
-            for (ystart=0; ystart < h; ystart++) {
-                xoff = yoff;
-                System.arraycopy(inData, srcOffset,
-                                 data, dstOffset, w);
-
-                srcOffset += w;
-                dstOffset += scanlineStride;
-            }
-            markDirty();
-            return;
-        }
-
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    data[dataOffsets[c] + xoff] = inData[off++];
-                }
-            }
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Stores a byte array of data elements into the specified rectangular
-     * region for the specified band.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x)) + n]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param band     The band to set.
-     * @param inData   The data elements to be stored.
-     */
-    public void putByteData(int x, int y, int w, int h,
-                            int band, byte[] inData) {
-        // Bounds check for 'band' will be performed automatically
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride + dataOffsets[band];
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        if (pixelStride == 1) {
-            if (scanlineStride == w) {
-                System.arraycopy(inData, 0, data, yoff, w*h);
-            }
-            else {
-                for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                    System.arraycopy(inData, off, data, yoff, w);
-                    off += w;
-                }
-            }
-        }
-        else {
-            for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                xoff = yoff;
-                for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                    data[xoff] = inData[off++];
-                }
-            }
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Stores a byte array of data elements into the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * for the nth band at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))*numDataElements + n]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param inData   The data elements to be stored.
-     */
-    public void putByteData(int x, int y, int w, int h, byte[] inData) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        if (numDataElements == 1) {
-            yoff += dataOffsets[0];
-            if (pixelStride == 1) {
-                if (scanlineStride == w) {
-                    System.arraycopy(inData, 0, data, yoff, w*h);
-                }
-                else {
-                    for (ystart=0; ystart < h; ystart++) {
-                        System.arraycopy(inData, off, data, yoff, w);
-                        off += w;
-                        yoff += scanlineStride;
-                    }
-                }
-            }
-            else {
-                for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                    xoff = yoff;
-                    for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                        data[xoff] = inData[off++];
-                    }
-                }
-            }
-        }
-        else {
-            for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                xoff = yoff;
-                for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                    for (int c = 0; c < numDataElements; c++) {
-                        data[dataOffsets[c] + xoff] = inData[off++];
-                    }
-                }
-            }
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Creates a subraster given a region of the raster.  The x and y
-     * coordinates specify the horizontal and vertical offsets
-     * from the upper-left corner of this raster to the upper-left corner
-     * of the subraster.  A subset of the bands of the parent Raster may
-     * be specified.  If this is null, then all the bands are present in the
-     * subRaster. A translation to the subRaster may also be specified.
-     * Note that the subraster will reference the same
-     * DataBuffer as the parent raster, but using different offsets.
-     * @param x               X offset.
-     * @param y               Y offset.
-     * @param width           Width (in pixels) of the subraster.
-     * @param height          Height (in pixels) of the subraster.
-     * @param x0              Translated X origin of the subraster.
-     * @param y0              Translated Y origin of the subraster.
-     * @param bandList        Array of band indices.
-     * @exception RasterFormatException
-     *            if the specified bounding box is outside of the parent raster.
-     */
-    public Raster createChild(int x, int y,
-                              int width, int height,
-                              int x0, int y0, int[] bandList) {
-        WritableRaster newRaster = createWritableChild(x, y,
-                                                       width, height,
-                                                       x0, y0,
-                                                       bandList);
-        return (Raster) newRaster;
-    }
-
-    /**
-     * Creates a Writable subRaster given a region of the Raster. The x and y
-     * coordinates specify the horizontal and vertical offsets
-     * from the upper-left corner of this Raster to the upper-left corner
-     * of the subRaster.  A subset of the bands of the parent Raster may
-     * be specified.  If this is null, then all the bands are present in the
-     * subRaster. A translation to the subRaster may also be specified.
-     * Note that the subRaster will reference the same
-     * DataBuffer as the parent Raster, but using different offsets.
-     * @param x               X offset.
-     * @param y               Y offset.
-     * @param width           Width (in pixels) of the subraster.
-     * @param height          Height (in pixels) of the subraster.
-     * @param x0              Translated X origin of the subraster.
-     * @param y0              Translated Y origin of the subraster.
-     * @param bandList        Array of band indices.
-     * @exception RasterFormatException
-     *            if the specified bounding box is outside of the parent Raster.
-     */
-    public WritableRaster createWritableChild(int x, int y,
-                                              int width, int height,
-                                              int x0, int y0,
-                                              int[] bandList) {
-        if (x < this.minX) {
-            throw new RasterFormatException("x lies outside the raster");
-        }
-        if (y < this.minY) {
-            throw new RasterFormatException("y lies outside the raster");
-        }
-        if ((x+width < x) || (x+width > this.minX + this.width)) {
-            throw new RasterFormatException("(x + width) is outside of Raster");
-        }
-        if ((y+height < y) || (y+height > this.minY + this.height)) {
-            throw new RasterFormatException("(y + height) is outside of Raster");
-        }
-
-        SampleModel sm;
-
-        if (bandList != null)
-            sm = sampleModel.createSubsetSampleModel(bandList);
-        else
-            sm = sampleModel;
-
-        int deltaX = x0 - x;
-        int deltaY = y0 - y;
-
-        return new ByteComponentRaster(sm,
-                                       dataBuffer,
-                                       new Rectangle(x0, y0, width, height),
-                                       new Point(sampleModelTranslateX+deltaX,
-                                                 sampleModelTranslateY+deltaY),
-                                       this);
-    }
-
-    /**
-     * Creates a Raster with the same layout but using a different
-     * width and height, and with new zeroed data arrays.
-     */
-    public WritableRaster createCompatibleWritableRaster(int w, int h) {
-        if (w <= 0 || h <=0) {
-            throw new RasterFormatException("negative "+
-                                          ((w <= 0) ? "width" : "height"));
-        }
-
-        SampleModel sm = sampleModel.createCompatibleSampleModel(w, h);
-
-        return new ByteComponentRaster(sm , new Point(0,0));
-
-    }
-
-    /**
-     * Creates a Raster with the same layout and the same
-     * width and height, and with new zeroed data arrays.  If
-     * the Raster is a subRaster, this will call
-     * createCompatibleRaster(width, height).
-     */
-    public WritableRaster createCompatibleWritableRaster() {
-        return createCompatibleWritableRaster(width,height);
-    }
-
-    /**
-     * Verify that the layout parameters are consistent with
-     * the data.  If strictCheck
-     * is false, this method will check for ArrayIndexOutOfBounds conditions.  If
-     * strictCheck is true, this method will check for additional error
-     * conditions such as line wraparound (width of a line greater than
-     * the scanline stride).
-     * @return   String   Error string, if the layout is incompatible with
-     *                    the data.  Otherwise returns null.
-     */
-    private void verify (boolean strictCheck) {
-        // Make sure data for Raster is in a legal range
-        for (int i=0; i < dataOffsets.length; i++) {
-            if (dataOffsets[i] < 0) {
-                throw new RasterFormatException("Data offsets for band "+i+
-                                                "("+dataOffsets[i]+
-                                                ") must be >= 0");
-            }
-        }
-
-        int maxSize = 0;
-        int size;
-
-        for (int i=0; i < numDataElements; i++) {
-            size = (height-1)*scanlineStride + (width-1)*pixelStride +
-                dataOffsets[i];
-            if (size > maxSize) {
-                maxSize = size;
-            }
-        }
-        if (data.length < maxSize) {
-            throw new RasterFormatException("Data array too small (should be "+
-                                          maxSize+" )");
-        }
-    }
-
-    public String toString() {
-        return new String ("ByteComponentRaster: width = "+width+" height = "
-                           + height
-                           +" #numDataElements "+numDataElements
-                           //  +" xOff = "+xOffset+" yOff = "+yOffset
-                           +" dataOff[0] = "+dataOffsets[0]);
-    }
-
-//    /**
-//     * For debugging...  prints a region of a one-band ByteComponentRaster
-//     */
-//    public void print(int x, int y, int w, int h) {
-//        // REMIND:  Only works for 1 band!
-//        System.out.println(this);
-//        int offset = dataOffsets[0] + y*scanlineStride + x*pixelStride;
-//        int off;
-//        for (int yoff=0; yoff < h; yoff++, offset += scanlineStride) {
-//            off = offset;
-//            System.out.print("Line "+(y+yoff)+": ");
-//            for (int xoff = 0; xoff < w; xoff++, off+= pixelStride) {
-//                String s = Integer.toHexString(data[off]);
-//                if (s.length() == 8) {
-//                    s = s.substring(6,8);
-//                }
-//                System.out.print(s+" ");
-//            }
-//            System.out.println("");
-//        }
-//    }
-
-
-}
diff --git a/external/ikvm/openjdk/sun/awt/image/BytePackedRaster.java b/external/ikvm/openjdk/sun/awt/image/BytePackedRaster.java
deleted file mode 100644
index 25c84f4..0000000
--- a/external/ikvm/openjdk/sun/awt/image/BytePackedRaster.java
+++ /dev/null
@@ -1,1389 +0,0 @@
-/*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.awt.image;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-import java.awt.image.RasterFormatException;
-import java.awt.image.SampleModel;
-import java.awt.image.MultiPixelPackedSampleModel;
-import java.awt.image.DataBuffer;
-import java.awt.image.DataBufferByte;
-import java.awt.Rectangle;
-import java.awt.Point;
-
-/**
- * This class is useful for describing 1, 2, or 4 bit image data
- * elements.  This raster has one band whose pixels are packed
- * together into individual bytes in a single byte array.  This type
- * of raster can be used with an IndexColorModel. This raster uses a
- * MultiPixelPackedSampleModel.
- *
- */
-public class BytePackedRaster extends SunWritableRaster {
-
-    /** The data bit offset for each pixel. */
-    int           dataBitOffset;
-
-    /** Scanline stride of the image data contained in this Raster. */
-    int           scanlineStride;
-
-    /**
-     * The bit stride of a pixel, equal to the total number of bits
-     * required to store a pixel.
-     */
-    int           pixelBitStride;
-
-    /** The bit mask for extracting the pixel. */
-    int           bitMask;
-
-    /** The image data array. */
-    byte[]        data;
-
-    /** 8 minus the pixel bit stride. */
-    int shiftOffset;
-
-    int type;
-
-    /** A cached copy of minX + width for use in bounds checks. */
-    private int maxX;
-
-    /** A cached copy of minY + height for use in bounds checks. */
-    private int maxY;
-
-    /**
-     * Constructs a BytePackedRaster with the given SampleModel.
-     * The Raster's upper left corner is origin and it is the same
-     * size as the SampleModel.  A DataBuffer large enough to describe the
-     * Raster is automatically created.  SampleModel must be of type
-     * MultiPixelPackedSampleModel.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param origin          The Point that specified the origin.
-     */
-    public BytePackedRaster(SampleModel sampleModel,
-                            Point origin) {
-        this(sampleModel,
-             sampleModel.createDataBuffer(),
-             new Rectangle(origin.x,
-                           origin.y,
-                           sampleModel.getWidth(),
-                           sampleModel.getHeight()),
-             origin,
-             null);
-    }
-
-    /**
-     * Constructs a BytePackedRaster with the given SampleModel
-     * and DataBuffer.  The Raster's upper left corner is origin and
-     * it is the same size as the SampleModel.  The DataBuffer is not
-     * initialized and must be a DataBufferByte compatible with SampleModel.
-     * SampleModel must be of type MultiPixelPackedSampleModel.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param dataBuffer      The DataBufferShort that contains the image data.
-     * @param origin          The Point that specifies the origin.
-     */
-    public BytePackedRaster(SampleModel sampleModel,
-                            DataBuffer dataBuffer,
-                            Point origin) {
-        this(sampleModel,
-             dataBuffer,
-             new Rectangle(origin.x,
-                           origin.y,
-                           sampleModel.getWidth(),
-                           sampleModel.getHeight()),
-             origin,
-             null);
-    }
-
-    /**
-     * Constructs a BytePackedRaster with the given SampleModel,
-     * DataBuffer, and parent.  DataBuffer must be a DataBufferByte and
-     * SampleModel must be of type MultiPixelPackedSampleModel.
-     * When translated into the base Raster's
-     * coordinate system, aRegion must be contained by the base Raster.
-     * Origin is the coordinate in the new Raster's coordinate system of
-     * the origin of the base Raster.  (The base Raster is the Raster's
-     * ancestor which has no parent.)
-     *
-     * Note that this constructor should generally be called by other
-     * constructors or create methods, it should not be used directly.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param dataBuffer      The DataBufferShort that contains the image data.
-     * @param aRegion         The Rectangle that specifies the image area.
-     * @param origin          The Point that specifies the origin.
-     * @param parent          The parent (if any) of this raster.
-     *
-     * @exception RasterFormatException if the parameters do not conform
-     * to requirements of this Raster type.
-     */
-    public BytePackedRaster(SampleModel sampleModel,
-                            DataBuffer dataBuffer,
-                            Rectangle aRegion,
-                            Point origin,
-                            BytePackedRaster parent){
-        super(sampleModel,dataBuffer,aRegion,origin, parent);
-        this.maxX = minX + width;
-        this.maxY = minY + height;
-
-        if (!(dataBuffer instanceof DataBufferByte)) {
-           throw new RasterFormatException("BytePackedRasters must have" +
-                "byte DataBuffers");
-        }
-        DataBufferByte dbb = (DataBufferByte)dataBuffer;
-        this.data = stealData(dbb, 0);
-        if (dbb.getNumBanks() != 1) {
-            throw new
-                RasterFormatException("DataBuffer for BytePackedRasters"+
-                                      " must only have 1 bank.");
-        }
-        int dbOffset = dbb.getOffset();
-
-        if (sampleModel instanceof MultiPixelPackedSampleModel) {
-            MultiPixelPackedSampleModel mppsm =
-                (MultiPixelPackedSampleModel)sampleModel;
-            this.type = IntegerComponentRaster.TYPE_BYTE_BINARY_SAMPLES;
-            pixelBitStride = mppsm.getPixelBitStride();
-            if (pixelBitStride != 1 &&
-                pixelBitStride != 2 &&
-                pixelBitStride != 4) {
-                throw new RasterFormatException
-                  ("BytePackedRasters must have a bit depth of 1, 2, or 4");
-            }
-            scanlineStride = mppsm.getScanlineStride();
-            dataBitOffset = mppsm.getDataBitOffset() + dbOffset*8;
-            int xOffset = aRegion.x - origin.x;
-            int yOffset = aRegion.y - origin.y;
-            dataBitOffset += xOffset*pixelBitStride + yOffset*scanlineStride*8;
-            bitMask = (1 << pixelBitStride) -1;
-            shiftOffset = 8 - pixelBitStride;
-        } else {
-            throw new RasterFormatException("BytePackedRasters must have"+
-                "MultiPixelPackedSampleModel");
-        }
-        verify(false);
-    }
-
-    /**
-     * Returns the data bit offset for the Raster.  The data
-     * bit offset is the bit index into the data array element
-     * corresponding to the first sample of the first scanline.
-     */
-    public int getDataBitOffset() {
-        return dataBitOffset;
-    }
-
-    /**
-     * Returns the scanline stride -- the number of data array elements between
-     * a given sample and the sample in the same column
-     * of the next row.
-     */
-    public int getScanlineStride() {
-        return scanlineStride;
-    }
-
-    /**
-     * Returns pixel bit stride -- the number of bits between two
-     * samples on the same scanline.
-     */
-    public int getPixelBitStride() {
-        return pixelBitStride;
-    }
-
-    /**
-     * Returns a reference to the entire data array.
-     */
-    public byte[] getDataStorage() {
-        return data;
-    }
-
-    /**
-     * Returns the data element at the specified
-     * location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinate is out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * @param x        The X coordinate of the pixel location.
-     * @param y        The Y coordinate of the pixel location.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length getNumDataElements().
-     *                 If null an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the request pixel data.
-     */
-    public Object getDataElements(int x, int y, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x >= this.maxX) || (y >= this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        byte outData[];
-        if (obj == null) {
-            outData = new byte[numDataElements];
-        } else {
-            outData = (byte[])obj;
-        }
-        int bitnum = dataBitOffset + (x-minX) * pixelBitStride;
-        // Fix 4184283
-        int element = data[(y-minY) * scanlineStride + (bitnum >> 3)] & 0xff;
-        int shift = shiftOffset - (bitnum & 7);
-        outData[0] = (byte)((element >> shift) & bitMask);
-        return outData;
-    }
-
-    /**
-     * Returns the pixel data for the specified rectangle of pixels in a
-     * primitive array of type TransferType.
-     * For image data supported by the Java 2D API, this
-     * will be one of DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT, or
-     * DataBuffer.TYPE_INT.  Data may be returned in a packed format,
-     * thus increasing efficiency for data transfers.
-     *
-     * An ArrayIndexOutOfBoundsException may be thrown
-     * if the coordinates are not in bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of TransferType.
-     * @see java.awt.image.SampleModel#getDataElements(int, int, int, int, Object, DataBuffer)
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements().
-     *                 If null, an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the requested pixel data.
-     */
-    public Object getDataElements(int x, int y, int w, int h,
-                                  Object outData) {
-        return getByteData(x, y, w, h, (byte[])outData);
-    }
-
-    /**
-     * Returns an array  of data elements from the specified rectangular
-     * region.
-     *
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * <pre>
-     *       byte[] bandData = (byte[])raster.getPixelData(x, y, w, h, null);
-     *       int pixel;
-     *       // To find a data element at location (x2, y2)
-     *       pixel = bandData[((y2-y)*w + (x2-x))];
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements().
-     *                 If null an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the request pixel data.
-     */
-    public Object getPixelData(int x, int y, int w, int h, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        byte outData[];
-        if (obj == null) {
-            outData = new byte[numDataElements*w*h];
-        } else {
-            outData = (byte[])obj;
-        }
-        int pixbits = pixelBitStride;
-        int scanbit = dataBitOffset + (x-minX) * pixbits;
-        int index = (y-minY) * scanlineStride;
-        int outindex = 0;
-        byte data[] = this.data;
-
-        for (int j = 0; j < h; j++) {
-            int bitnum = scanbit;
-            for (int i = 0; i < w; i++) {
-                int shift = shiftOffset - (bitnum & 7);
-                outData[outindex++] =
-                    (byte)(bitMask & (data[index + (bitnum >> 3)] >> shift));
-                bitnum += pixbits;
-            }
-            index += scanlineStride;
-        }
-        return outData;
-    }
-
-    /**
-     * Returns a byte array containing the specified data elements
-     * from the data array.  The band index will be ignored.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * <pre>
-     *       byte[] byteData = getByteData(x, y, band, w, h, null);
-     *       // To find a data element at location (x2, y2)
-     *       byte element = byteData[(y2-y)*w + (x2-x)];
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param band     The band to return, is ignored.
-     * @param outData  If non-null, data elements
-     *                 at the specified locations are returned in this array.
-     * @return         Byte array with data elements.
-     */
-    public byte[] getByteData(int x, int y, int w, int h,
-                              int band, byte[] outData) {
-        return getByteData(x, y, w, h, outData);
-    }
-
-    /**
-     * Returns a byte array containing the specified data elements
-     * from the data array.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * <pre>
-     *       byte[] byteData = raster.getByteData(x, y, w, h, null);
-     *       byte pixel;
-     *       // To find a data element at location (x2, y2)
-     *       pixel = byteData[((y2-y)*w + (x2-x))];
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param outData  If non-null, data elements
-     *                 at the specified locations are returned in this array.
-     * @return         Byte array with data elements.
-     */
-    public byte[] getByteData(int x, int y, int w, int h, byte[] outData) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        if (outData == null) {
-            outData = new byte[w * h];
-        }
-        int pixbits = pixelBitStride;
-        int scanbit = dataBitOffset + (x-minX) * pixbits;
-        int index = (y-minY) * scanlineStride;
-        int outindex = 0;
-        byte data[] = this.data;
-
-        for (int j = 0; j < h; j++) {
-            int bitnum = scanbit;
-            int element;
-
-            // Process initial portion of scanline
-            int i = 0;
-            while ((i < w) && ((bitnum & 7) != 0)) {
-                int shift = shiftOffset - (bitnum & 7);
-                outData[outindex++] =
-                    (byte)(bitMask & (data[index + (bitnum >> 3)] >> shift));
-                bitnum += pixbits;
-                i++;
-            }
-
-            // Process central portion of scanline 8 pixels at a time
-            int inIndex = index + (bitnum >> 3);
-            switch (pixbits) {
-            case 1:
-                for (; i < w - 7; i += 8) {
-                    element = data[inIndex++];
-                    outData[outindex++] = (byte)((element >> 7) & 1);
-                    outData[outindex++] = (byte)((element >> 6) & 1);
-                    outData[outindex++] = (byte)((element >> 5) & 1);
-                    outData[outindex++] = (byte)((element >> 4) & 1);
-                    outData[outindex++] = (byte)((element >> 3) & 1);
-                    outData[outindex++] = (byte)((element >> 2) & 1);
-                    outData[outindex++] = (byte)((element >> 1) & 1);
-                    outData[outindex++] = (byte)(element & 1);
-                    bitnum += 8;
-                }
-                break;
-
-            case 2:
-                for (; i < w - 7; i += 8) {
-                    element = data[inIndex++];
-                    outData[outindex++] = (byte)((element >> 6) & 3);
-                    outData[outindex++] = (byte)((element >> 4) & 3);
-                    outData[outindex++] = (byte)((element >> 2) & 3);
-                    outData[outindex++] = (byte)(element & 3);
-
-                    element = data[inIndex++];
-                    outData[outindex++] = (byte)((element >> 6) & 3);
-                    outData[outindex++] = (byte)((element >> 4) & 3);
-                    outData[outindex++] = (byte)((element >> 2) & 3);
-                    outData[outindex++] = (byte)(element & 3);
-
-                    bitnum += 16;
-                }
-                break;
-
-            case 4:
-                for (; i < w - 7; i += 8) {
-                    element = data[inIndex++];
-                    outData[outindex++] = (byte)((element >> 4) & 0xf);
-                    outData[outindex++] = (byte)(element & 0xf);
-
-                    element = data[inIndex++];
-                    outData[outindex++] = (byte)((element >> 4) & 0xf);
-                    outData[outindex++] = (byte)(element & 0xf);
-
-                    element = data[inIndex++];
-                    outData[outindex++] = (byte)((element >> 4) & 0xf);
-                    outData[outindex++] = (byte)(element & 0xf);
-
-                    element = data[inIndex++];
-                    outData[outindex++] = (byte)((element >> 4) & 0xf);
-                    outData[outindex++] = (byte)(element & 0xf);
-
-                    bitnum += 32;
-                }
-                break;
-            }
-
-            // Process final portion of scanline
-            for (; i < w; i++) {
-                int shift = shiftOffset - (bitnum & 7);
-                outData[outindex++] =
-                    (byte) (bitMask & (data[index + (bitnum >> 3)] >> shift));
-                bitnum += pixbits;
-            }
-
-            index += scanlineStride;
-        }
-
-        return outData;
-    }
-
-    /**
-     * Stores the data elements at the specified location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinate is out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * @param x        The X coordinate of the pixel location.
-     * @param y        The Y coordinate of the pixel location.
-     * @param inData   An object reference to an array of type defined by
-     *                 getTransferType() and length getNumDataElements()
-     *                 containing the pixel data to place at x,y.
-     */
-    public void setDataElements(int x, int y, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x >= this.maxX) || (y >= this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        byte inData[] = (byte[])obj;
-        int bitnum = dataBitOffset + (x-minX) * pixelBitStride;
-        int index = (y-minY) * scanlineStride + (bitnum >> 3);
-        int shift = shiftOffset - (bitnum & 7);
-
-        byte element = data[index];
-        element &= ~(bitMask << shift);
-        element |= (inData[0] & bitMask) << shift;
-        data[index] = element;
-
-        markDirty();
-    }
-
-    /**
-     * Stores the Raster data at the specified location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * @param x          The X coordinate of the pixel location.
-     * @param y          The Y coordinate of the pixel location.
-     * @param inRaster   Raster of data to place at x,y location.
-     */
-    public void setDataElements(int x, int y, Raster inRaster) {
-        // Check if we can use fast code
-        if (!(inRaster instanceof BytePackedRaster) ||
-            ((BytePackedRaster)inRaster).pixelBitStride != pixelBitStride) {
-            super.setDataElements(x, y, inRaster);
-            return;
-        }
-
-        int srcOffX = inRaster.getMinX();
-        int srcOffY = inRaster.getMinY();
-        int dstOffX = srcOffX + x;
-        int dstOffY = srcOffY + y;
-        int width = inRaster.getWidth();
-        int height = inRaster.getHeight();
-        if ((dstOffX < this.minX) || (dstOffY < this.minY) ||
-            (dstOffX + width > this.maxX) || (dstOffY + height > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        setDataElements(dstOffX, dstOffY,
-                        srcOffX, srcOffY,
-                        width, height,
-                        (BytePackedRaster)inRaster);
-    }
-
-    /**
-     * Stores the Raster data at the specified location.
-     * @param dstX The absolute X coordinate of the destination pixel
-     * that will receive a copy of the upper-left pixel of the
-     * inRaster
-     * @param dstY The absolute Y coordinate of the destination pixel
-     * that will receive a copy of the upper-left pixel of the
-     * inRaster
-     * @param srcX The absolute X coordinate of the upper-left source
-     * pixel that will be copied into this Raster
-     * @param srcY The absolute Y coordinate of the upper-left source
-     * pixel that will be copied into this Raster
-     * @param width      The number of pixels to store horizontally
-     * @param height     The number of pixels to store vertically
-     * @param inRaster   BytePackedRaster of data to place at x,y location.
-     */
-    private void setDataElements(int dstX, int dstY,
-                                 int srcX, int srcY,
-                                 int width, int height,
-                                 BytePackedRaster inRaster) {
-        // Assume bounds checking has been performed previously
-        if (width <= 0 || height <= 0) {
-            return;
-        }
-
-        byte[] inData = inRaster.data;
-        byte[] outData = this.data;
-
-        int inscan = inRaster.scanlineStride;
-        int outscan = this.scanlineStride;
-        int inbit = inRaster.dataBitOffset +
-                      8 * (srcY - inRaster.minY) * inscan +
-                      (srcX - inRaster.minX) * inRaster.pixelBitStride;
-        int outbit = (this.dataBitOffset +
-                      8 * (dstY - minY) * outscan +
-                      (dstX - minX) * this.pixelBitStride);
-        int copybits = width * pixelBitStride;
-
-        // Check whether the same bit alignment is present in both
-        // Rasters; if so, we can copy whole bytes using
-        // System.arraycopy.  If not, we must do a "funnel shift"
-        // where adjacent bytes contribute to each destination byte.
-        if ((inbit & 7) == (outbit & 7)) {
-            // copy is bit aligned
-            int bitpos = outbit & 7;
-            if (bitpos != 0) {
-                int bits = 8 - bitpos;
-                // Copy partial bytes on left
-                int inbyte = inbit >> 3;
-                int outbyte = outbit >> 3;
-                int mask = 0xff >> bitpos;
-                if (copybits < bits) {
-                    // Fix bug 4399076: previously had '8 - copybits' instead
-                    // of 'bits - copybits'.
-                    //
-                    // Prior to the this expression, 'mask' has its rightmost
-                    // 'bits' bits set to '1'.  We want it to have a total
-                    // of 'copybits' bits set, therefore we want to introduce
-                    // 'bits - copybits' zeroes on the right.
-                    mask &= 0xff << (bits - copybits);
-                    bits = copybits;
-                }
-                for (int j = 0; j < height; j++) {
-                    int element = outData[outbyte];
-                    element &= ~mask;
-                    element |= (inData[inbyte] & mask);
-                    outData[outbyte] = (byte) element;
-                    inbyte += inscan;
-                    outbyte += outscan;
-                }
-                inbit += bits;
-                outbit += bits;
-                copybits -= bits;
-            }
-            if (copybits >= 8) {
-                // Copy whole bytes
-                int inbyte = inbit >> 3;
-                int outbyte = outbit >> 3;
-                int copybytes = copybits >> 3;
-                if (copybytes == inscan && inscan == outscan) {
-                    System.arraycopy(inData, inbyte,
-                                     outData, outbyte,
-                                     inscan * height);
-                } else {
-                    for (int j = 0; j < height; j++) {
-                        System.arraycopy(inData, inbyte,
-                                         outData, outbyte,
-                                         copybytes);
-                        inbyte += inscan;
-                        outbyte += outscan;
-                    }
-                }
-
-                int bits = copybytes*8;
-                inbit += bits;
-                outbit += bits;
-                copybits -= bits;
-            }
-            if (copybits > 0) {
-                // Copy partial bytes on right
-                int inbyte = inbit >> 3;
-                int outbyte = outbit >> 3;
-                int mask = (0xff00 >> copybits) & 0xff;
-                for (int j = 0; j < height; j++) {
-                    int element = outData[outbyte];
-                    element &= ~mask;
-                    element |= (inData[inbyte] & mask);
-                    outData[outbyte] = (byte) element;
-                    inbyte += inscan;
-                    outbyte += outscan;
-                }
-            }
-        } else {
-            // Unaligned case, see RFE #4284166
-            // Note that the code in that RFE is not correct
-
-            // Insert bits into the first byte of the output
-            // if either the starting bit position is not zero or
-            // we are writing fewer than 8 bits in total
-            int bitpos = outbit & 7;
-            if (bitpos != 0 || copybits < 8) {
-                int bits = 8 - bitpos;
-                int inbyte = inbit >> 3;
-                int outbyte = outbit >> 3;
-
-                int lshift = inbit & 7;
-                int rshift = 8 - lshift;
-                int mask = 0xff >> bitpos;
-                if (copybits < bits) {
-                    // Fix mask if we're only writing a partial byte
-                    mask &= 0xff << (bits - copybits);
-                    bits = copybits;
-                }
-                int lastByte = inData.length - 1;
-                for (int j = 0; j < height; j++) {
-                    // Read two bytes from the source if possible
-                    // Don't worry about going over a scanline boundary
-                    // since any extra bits won't get used anyway
-                    byte inData0 = inData[inbyte];
-                    byte inData1 = (byte)0;
-                    if (inbyte < lastByte) {
-                        inData1 = inData[inbyte + 1];
-                    }
-
-                    // Insert the new bits into the output
-                    int element = outData[outbyte];
-                    element &= ~mask;
-                    element |= (((inData0 << lshift) |
-                                 ((inData1 & 0xff) >> rshift))
-                                >> bitpos) & mask;
-                    outData[outbyte] = (byte)element;
-                    inbyte += inscan;
-                    outbyte += outscan;
-                }
-
-                inbit += bits;
-                outbit += bits;
-                copybits -= bits;
-            }
-
-            // Now we have outbit & 7 == 0 so we can write
-            // complete bytes for a while
-
-            // Make sure we have work to do in the central loop
-            // to avoid reading past the end of the scanline
-            if (copybits >= 8) {
-                int inbyte = inbit >> 3;
-                int outbyte = outbit >> 3;
-                int copybytes = copybits >> 3;
-                int lshift = inbit & 7;
-                int rshift = 8 - lshift;
-
-                for (int j = 0; j < height; j++) {
-                    int ibyte = inbyte + j*inscan;
-                    int obyte = outbyte + j*outscan;
-
-                    int inData0 = inData[ibyte];
-                    // Combine adjacent bytes while 8 or more bits left
-                    for (int i = 0; i < copybytes; i++) {
-                        int inData1 = inData[ibyte + 1];
-                        int val = (inData0 << lshift) |
-                            ((inData1 & 0xff) >> rshift);
-                        outData[obyte] = (byte)val;
-                        inData0 = inData1;
-
-                        ++ibyte;
-                        ++obyte;
-                    }
-                }
-
-                int bits = copybytes*8;
-                inbit += bits;
-                outbit += bits;
-                copybits -= bits;
-            }
-
-            // Finish last byte
-            if (copybits > 0) {
-                int inbyte = inbit >> 3;
-                int outbyte = outbit >> 3;
-                int mask = (0xff00 >> copybits) & 0xff;
-                int lshift = inbit & 7;
-                int rshift = 8 - lshift;
-
-                int lastByte = inData.length - 1;
-                for (int j = 0; j < height; j++) {
-                    byte inData0 = inData[inbyte];
-                    byte inData1 = (byte)0;
-                    if (inbyte < lastByte) {
-                        inData1 = inData[inbyte + 1];
-                    }
-
-                    // Insert the new bits into the output
-                    int element = outData[outbyte];
-                    element &= ~mask;
-                    element |= ((inData0 << lshift) |
-                                ((inData1 & 0xff) >> rshift)) & mask;
-                    outData[outbyte] = (byte)element;
-
-                    inbyte += inscan;
-                    outbyte += outscan;
-                }
-            }
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Copies pixels from Raster srcRaster to this WritableRaster.
-     * For each (x, y) address in srcRaster, the corresponding pixel
-     * is copied to address (x+dx, y+dy) in this WritableRaster,
-     * unless (x+dx, y+dy) falls outside the bounds of this raster.
-     * srcRaster must have the same number of bands as this WritableRaster.
-     * The copy is a simple copy of source samples to the corresponding
-     * destination samples.  For details, see
-     * {@link WritableRaster#setRect(Raster)}.
-     *
-     * @param dx        The X translation factor from src space to dst space
-     *                  of the copy.
-     * @param dy        The Y translation factor from src space to dst space
-     *                  of the copy.
-     * @param srcRaster The Raster from which to copy pixels.
-     */
-    public void setRect(int dx, int dy, Raster srcRaster) {
-        // Check if we can use fast code
-        if (!(srcRaster instanceof BytePackedRaster) ||
-            ((BytePackedRaster)srcRaster).pixelBitStride != pixelBitStride) {
-            super.setRect(dx, dy, srcRaster);
-            return;
-        }
-
-        int width  = srcRaster.getWidth();
-        int height = srcRaster.getHeight();
-        int srcOffX = srcRaster.getMinX();
-        int srcOffY = srcRaster.getMinY();
-        int dstOffX = dx+srcOffX;
-        int dstOffY = dy+srcOffY;
-
-        // Clip to this raster
-        if (dstOffX < this.minX) {
-            int skipX = this.minX - dstOffX;
-            width -= skipX;
-            srcOffX += skipX;
-            dstOffX = this.minX;
-        }
-        if (dstOffY < this.minY) {
-            int skipY = this.minY - dstOffY;
-            height -= skipY;
-            srcOffY += skipY;
-            dstOffY = this.minY;
-        }
-        if (dstOffX+width > this.maxX) {
-            width = this.maxX - dstOffX;
-        }
-        if (dstOffY+height > this.maxY) {
-            height = this.maxY - dstOffY;
-        }
-
-        setDataElements(dstOffX, dstOffY,
-                        srcOffX, srcOffY,
-                        width, height,
-                        (BytePackedRaster)srcRaster);
-    }
-
-    /**
-     * Stores an array of data elements into the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param inData   An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements()
-     *                 containing the pixel data to place between x,y and
-     *                 x+h, y+h.
-     */
-    public void setDataElements(int x, int y, int w, int h, Object obj) {
-        putByteData(x, y, w, h, (byte[])obj);
-    }
-
-    /**
-     * Stores a byte array of data elements into the specified rectangular
-     * region.  The band index will be ignored.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param band     The band to set, is ignored.
-     * @param inData   The data elements to be stored.
-     */
-    public void putByteData(int x, int y, int w, int h,
-                            int band, byte[] inData) {
-        putByteData(x, y, w, h, inData);
-    }
-
-    /**
-     * Stores a byte array of data elements into the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param inData   The data elements to be stored.
-     */
-    public void putByteData(int x, int y, int w, int h, byte[] inData) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        if (w == 0 || h == 0) {
-            return;
-        }
-
-        int pixbits = pixelBitStride;
-        int scanbit = dataBitOffset + (x - minX) * pixbits;
-        int index = (y - minY) * scanlineStride;
-        int outindex = 0;
-        byte data[] = this.data;
-        for (int j = 0; j < h; j++) {
-            int bitnum = scanbit;
-            int element;
-
-            // Process initial portion of scanline
-            int i = 0;
-            while ((i < w) && ((bitnum & 7) != 0)) {
-                int shift = shiftOffset - (bitnum & 7);
-                element = data[index + (bitnum >> 3)];
-                element &= ~(bitMask << shift);
-                element |= (inData[outindex++] & bitMask) << shift;
-                data[index + (bitnum >> 3)] = (byte)element;
-
-                bitnum += pixbits;
-                i++;
-            }
-
-            // Process central portion of scanline 8 pixels at a time
-            int inIndex = index + (bitnum >> 3);
-            switch (pixbits) {
-            case 1:
-                for (; i < w - 7; i += 8) {
-                    element = (inData[outindex++] & 1) << 7;
-                    element |= (inData[outindex++] & 1) << 6;
-                    element |= (inData[outindex++] & 1) << 5;
-                    element |= (inData[outindex++] & 1) << 4;
-                    element |= (inData[outindex++] & 1) << 3;
-                    element |= (inData[outindex++] & 1) << 2;
-                    element |= (inData[outindex++] & 1) << 1;
-                    element |= (inData[outindex++] & 1);
-
-                    data[inIndex++] = (byte)element;
-
-                    bitnum += 8;
-                }
-                break;
-
-            case 2:
-                for (; i < w - 7; i += 8) {
-                    element = (inData[outindex++] & 3) << 6;
-                    element |= (inData[outindex++] & 3) << 4;
-                    element |= (inData[outindex++] & 3) << 2;
-                    element |= (inData[outindex++] & 3);
-                    data[inIndex++] = (byte)element;
-
-                    element = (inData[outindex++] & 3) << 6;
-                    element |= (inData[outindex++] & 3) << 4;
-                    element |= (inData[outindex++] & 3) << 2;
-                    element |= (inData[outindex++] & 3);
-                    data[inIndex++] = (byte)element;
-
-                    bitnum += 16;
-                }
-                break;
-
-            case 4:
-                for (; i < w - 7; i += 8) {
-                    element = (inData[outindex++] & 0xf) << 4;
-                    element |= (inData[outindex++] & 0xf);
-                    data[inIndex++] = (byte)element;
-
-                    element = (inData[outindex++] & 0xf) << 4;
-                    element |= (inData[outindex++] & 0xf);
-                    data[inIndex++] = (byte)element;
-
-                    element = (inData[outindex++] & 0xf) << 4;
-                    element |= (inData[outindex++] & 0xf);
-                    data[inIndex++] = (byte)element;
-
-                    element = (inData[outindex++] & 0xf) << 4;
-                    element |= (inData[outindex++] & 0xf);
-                    data[inIndex++] = (byte)element;
-
-                    bitnum += 32;
-                }
-                break;
-            }
-
-            // Process final portion of scanline
-            for (; i < w; i++) {
-                int shift = shiftOffset - (bitnum & 7);
-
-                element = data[index + (bitnum >> 3)];
-                element &= ~(bitMask << shift);
-                element |= (inData[outindex++] & bitMask) << shift;
-                data[index + (bitnum >> 3)] = (byte)element;
-
-                bitnum += pixbits;
-            }
-
-            index += scanlineStride;
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Returns an int array containing all samples for a rectangle of pixels,
-     * one sample per array element.
-     * An ArrayIndexOutOfBoundsException may be thrown
-     * if the coordinates are not in bounds.
-     * @param x, y   the coordinates of the upper-left pixel location
-     * @param w      Width of the pixel rectangle
-     * @param h      Height of the pixel rectangle
-     * @param iArray An optionally pre-allocated int array
-     * @return the samples for the specified rectangle of pixels.
-     */
-    public int[] getPixels(int x, int y, int w, int h, int iArray[]) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        if (iArray == null) {
-            iArray = new int[w * h];
-        }
-        int pixbits = pixelBitStride;
-        int scanbit = dataBitOffset + (x-minX) * pixbits;
-        int index = (y-minY) * scanlineStride;
-        int outindex = 0;
-        byte data[] = this.data;
-
-        for (int j = 0; j < h; j++) {
-            int bitnum = scanbit;
-            int element;
-
-            // Process initial portion of scanline
-            int i = 0;
-            while ((i < w) && ((bitnum & 7) != 0)) {
-                int shift = shiftOffset - (bitnum & 7);
-                iArray[outindex++] =
-                    bitMask & (data[index + (bitnum >> 3)] >> shift);
-                bitnum += pixbits;
-                i++;
-            }
-
-            // Process central portion of scanline 8 pixels at a time
-            int inIndex = index + (bitnum >> 3);
-            switch (pixbits) {
-            case 1:
-                for (; i < w - 7; i += 8) {
-                    element = data[inIndex++];
-                    iArray[outindex++] = (element >> 7) & 1;
-                    iArray[outindex++] = (element >> 6) & 1;
-                    iArray[outindex++] = (element >> 5) & 1;
-                    iArray[outindex++] = (element >> 4) & 1;
-                    iArray[outindex++] = (element >> 3) & 1;
-                    iArray[outindex++] = (element >> 2) & 1;
-                    iArray[outindex++] = (element >> 1) & 1;
-                    iArray[outindex++] = element & 1;
-                    bitnum += 8;
-                }
-                break;
-
-            case 2:
-                for (; i < w - 7; i += 8) {
-                    element = data[inIndex++];
-                    iArray[outindex++] = (element >> 6) & 3;
-                    iArray[outindex++] = (element >> 4) & 3;
-                    iArray[outindex++] = (element >> 2) & 3;
-                    iArray[outindex++] = element & 3;
-
-                    element = data[inIndex++];
-                    iArray[outindex++] = (element >> 6) & 3;
-                    iArray[outindex++] = (element >> 4) & 3;
-                    iArray[outindex++] = (element >> 2) & 3;
-                    iArray[outindex++] = element & 3;
-
-                    bitnum += 16;
-                }
-                break;
-
-            case 4:
-                for (; i < w - 7; i += 8) {
-                    element = data[inIndex++];
-                    iArray[outindex++] = (element >> 4) & 0xf;
-                    iArray[outindex++] = element & 0xf;
-
-                    element = data[inIndex++];
-                    iArray[outindex++] = (element >> 4) & 0xf;
-                    iArray[outindex++] = element & 0xf;
-
-                    element = data[inIndex++];
-                    iArray[outindex++] = (element >> 4) & 0xf;
-                    iArray[outindex++] = element & 0xf;
-
-                    element = data[inIndex++];
-                    iArray[outindex++] = (element >> 4) & 0xf;
-                    iArray[outindex++] = element & 0xf;
-
-                    bitnum += 32;
-                }
-                break;
-            }
-
-            // Process final portion of scanline
-            for (; i < w; i++) {
-                int shift = shiftOffset - (bitnum & 7);
-                iArray[outindex++] =
-                    bitMask & (data[index + (bitnum >> 3)] >> shift);
-                bitnum += pixbits;
-            }
-
-            index += scanlineStride;
-        }
-
-        return iArray;
-    }
-
-    /**
-     * Sets all samples for a rectangle of pixels from an int array containing
-     * one sample per array element.
-     * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
-     * not in bounds.
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param iArray   The input int pixel array.
-     */
-    public void setPixels(int x, int y, int w, int h, int iArray[]) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int pixbits = pixelBitStride;
-        int scanbit = dataBitOffset + (x - minX) * pixbits;
-        int index = (y - minY) * scanlineStride;
-        int outindex = 0;
-        byte data[] = this.data;
-        for (int j = 0; j < h; j++) {
-            int bitnum = scanbit;
-            int element;
-
-            // Process initial portion of scanline
-            int i = 0;
-            while ((i < w) && ((bitnum & 7) != 0)) {
-                int shift = shiftOffset - (bitnum & 7);
-                element = data[index + (bitnum >> 3)];
-                element &= ~(bitMask << shift);
-                element |= (iArray[outindex++] & bitMask) << shift;
-                data[index + (bitnum >> 3)] = (byte)element;
-
-                bitnum += pixbits;
-                i++;
-            }
-
-            // Process central portion of scanline 8 pixels at a time
-            int inIndex = index + (bitnum >> 3);
-            switch (pixbits) {
-            case 1:
-                for (; i < w - 7; i += 8) {
-                    element = (iArray[outindex++] & 1) << 7;
-                    element |= (iArray[outindex++] & 1) << 6;
-                    element |= (iArray[outindex++] & 1) << 5;
-                    element |= (iArray[outindex++] & 1) << 4;
-                    element |= (iArray[outindex++] & 1) << 3;
-                    element |= (iArray[outindex++] & 1) << 2;
-                    element |= (iArray[outindex++] & 1) << 1;
-                    element |= (iArray[outindex++] & 1);
-                    data[inIndex++] = (byte)element;
-
-                    bitnum += 8;
-                }
-                break;
-
-            case 2:
-                for (; i < w - 7; i += 8) {
-                    element = (iArray[outindex++] & 3) << 6;
-                    element |= (iArray[outindex++] & 3) << 4;
-                    element |= (iArray[outindex++] & 3) << 2;
-                    element |= (iArray[outindex++] & 3);
-                    data[inIndex++] = (byte)element;
-
-                    element = (iArray[outindex++] & 3) << 6;
-                    element |= (iArray[outindex++] & 3) << 4;
-                    element |= (iArray[outindex++] & 3) << 2;
-                    element |= (iArray[outindex++] & 3);
-                    data[inIndex++] = (byte)element;
-
-                    bitnum += 16;
-                }
-                break;
-
-            case 4:
-                for (; i < w - 7; i += 8) {
-                    element = (iArray[outindex++] & 0xf) << 4;
-                    element |= (iArray[outindex++] & 0xf);
-                    data[inIndex++] = (byte)element;
-
-                    element = (iArray[outindex++] & 0xf) << 4;
-                    element |= (iArray[outindex++] & 0xf);
-                    data[inIndex++] = (byte)element;
-
-                    element = (iArray[outindex++] & 0xf) << 4;
-                    element |= (iArray[outindex++] & 0xf);
-                    data[inIndex++] = (byte)element;
-
-                    element = (iArray[outindex++] & 0xf) << 4;
-                    element |= (iArray[outindex++] & 0xf);
-                    data[inIndex++] = (byte)element;
-
-                    bitnum += 32;
-                }
-                break;
-            }
-
-            // Process final portion of scanline
-            for (; i < w; i++) {
-                int shift = shiftOffset - (bitnum & 7);
-
-                element = data[index + (bitnum >> 3)];
-                element &= ~(bitMask << shift);
-                element |= (iArray[outindex++] & bitMask) << shift;
-                data[index + (bitnum >> 3)] = (byte)element;
-
-                bitnum += pixbits;
-            }
-
-            index += scanlineStride;
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Creates a subraster given a region of the raster.  The x and y
-     * coordinates specify the horizontal and vertical offsets
-     * from the upper-left corner of this raster to the upper-left corner
-     * of the subraster.  Note that the subraster will reference the same
-     * DataBuffer as the parent raster, but using different offsets. The
-     * bandList is ignored.
-     * @param x               X offset.
-     * @param y               Y offset.
-     * @param width           Width (in pixels) of the subraster.
-     * @param height          Height (in pixels) of the subraster.
-     * @param x0              Translated X origin of the subraster.
-     * @param y0              Translated Y origin of the subraster.
-     * @param bandList        Array of band indices.
-     * @exception RasterFormatException
-     *            if the specified bounding box is outside of the parent raster.
-     */
-    public Raster createChild(int x, int y,
-                              int width, int height,
-                              int x0, int y0, int[] bandList) {
-        WritableRaster newRaster = createWritableChild(x, y,
-                                                       width, height,
-                                                       x0, y0,
-                                                       bandList);
-        return (Raster) newRaster;
-    }
-
-    /**
-     * Creates a Writable subRaster given a region of the Raster. The x and y
-     * coordinates specify the horizontal and vertical offsets
-     * from the upper-left corner of this Raster to the upper-left corner
-     * of the subRaster.  The bandList is ignored.
-     * A translation to the subRaster may also be specified.
-     * Note that the subRaster will reference the same
-     * DataBuffer as the parent Raster, but using different offsets.
-     * @param x               X offset.
-     * @param y               Y offset.
-     * @param width           Width (in pixels) of the subraster.
-     * @param height          Height (in pixels) of the subraster.
-     * @param x0              Translated X origin of the subraster.
-     * @param y0              Translated Y origin of the subraster.
-     * @param bandList        Array of band indices.
-     * @exception RasterFormatException
-     *            if the specified bounding box is outside of the parent Raster.
-     */
-    public WritableRaster createWritableChild(int x, int y,
-                                              int width, int height,
-                                              int x0, int y0,
-                                              int[] bandList) {
-        if (x < this.minX) {
-            throw new RasterFormatException("x lies outside the raster");
-        }
-        if (y < this.minY) {
-            throw new RasterFormatException("y lies outside the raster");
-        }
-        if ((x+width < x) || (x+width > this.minX + this.width)) {
-            throw new RasterFormatException("(x + width) is outside of Raster");
-        }
-        if ((y+height < y) || (y+height > this.minY + this.height)) {
-            throw new RasterFormatException("(y + height) is outside of Raster");
-        }
-
-        SampleModel sm;
-
-        if (bandList != null) {
-            sm = sampleModel.createSubsetSampleModel(bandList);
-        }
-        else {
-            sm = sampleModel;
-        }
-
-        int deltaX = x0 - x;
-        int deltaY = y0 - y;
-
-        return new BytePackedRaster(sm,
-                                    dataBuffer,
-                                    new Rectangle(x0, y0, width, height),
-                                    new Point(sampleModelTranslateX+deltaX,
-                                              sampleModelTranslateY+deltaY),
-                                    this);
-    }
-
-    /**
-     * Creates a raster with the same layout but using a different
-     * width and height, and with new zeroed data arrays.
-     */
-    public WritableRaster createCompatibleWritableRaster(int w, int h) {
-        if (w <= 0 || h <=0) {
-            throw new RasterFormatException("negative "+
-                                          ((w <= 0) ? "width" : "height"));
-        }
-
-        SampleModel sm = sampleModel.createCompatibleSampleModel(w,h);
-
-        return new BytePackedRaster(sm, new Point(0,0));
-    }
-
-    /**
-     * Creates a raster with the same layout and the same
-     * width and height, and with new zeroed data arrays.
-     */
-    public WritableRaster createCompatibleWritableRaster () {
-        return createCompatibleWritableRaster(width,height);
-    }
-
-    /**
-     * Verify that the layout parameters are consistent with
-     * the data.  If strictCheck
-     * is false, this method will check for ArrayIndexOutOfBounds conditions.
-     * If strictCheck is true, this method will check for additional error
-     * conditions such as line wraparound (width of a line greater than
-     * the scanline stride).
-     * @return   String   Error string, if the layout is incompatible with
-     *                    the data.  Otherwise returns null.
-     */
-    private void verify (boolean strictCheck) {
-        // Make sure data for Raster is in a legal range
-        if (dataBitOffset < 0) {
-            throw new RasterFormatException("Data offsets must be >= 0");
-        }
-
-        int lastbit = (dataBitOffset
-                       + (height-1) * scanlineStride * 8
-                       + (width-1) * pixelBitStride
-                       + pixelBitStride - 1);
-        if (lastbit / 8 >= data.length) {
-            throw new RasterFormatException("raster dimensions overflow " +
-                                            "array bounds");
-        }
-        if (strictCheck) {
-            if (height > 1) {
-                lastbit = width * pixelBitStride - 1;
-                if (lastbit / 8 >= scanlineStride) {
-                    throw new RasterFormatException("data for adjacent" +
-                                                    " scanlines overlaps");
-                }
-            }
-        }
-    }
-
-    public String toString() {
-        return new String ("BytePackedRaster: width = "+width+" height = "+height
-                           +" #channels "+numBands
-                           +" xOff = "+sampleModelTranslateX
-                           +" yOff = "+sampleModelTranslateY);
-    }
-}
diff --git a/external/ikvm/openjdk/sun/awt/image/IntegerComponentRaster.java b/external/ikvm/openjdk/sun/awt/image/IntegerComponentRaster.java
deleted file mode 100644
index 7c44c6f..0000000
--- a/external/ikvm/openjdk/sun/awt/image/IntegerComponentRaster.java
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.awt.image;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-import java.awt.image.RasterFormatException;
-import java.awt.image.SampleModel;
-import java.awt.image.SinglePixelPackedSampleModel;
-import java.awt.image.DataBuffer;
-import java.awt.image.DataBufferInt;
-import java.awt.Rectangle;
-import java.awt.Point;
-
-/**
- * This class defines a Raster with pixels consisting of one or more 32-bit
- * data elements stored in close proximity to each other in a integer array.
- * The bit precision per data element is that
- * of the data type (that is, the bit precision for this raster is 32).
- * There is only one pixel stride and one scanline stride for all
- * bands.  For a given pixel, all samples fit in N data elements and these
- * N data elements hold samples for only one pixel.  This type of Raster
- * can be used with a PackedColorModel.
- * <p>
- * For example, if there is only one data element per pixel, a
- * SinglePixelPackedSampleModel can be used to represent multiple
- * bands with a PackedColorModel (including a DirectColorModel) for
- * color interpretation.
- *
- */
-public class IntegerComponentRaster extends SunWritableRaster {
-
-    static final int TYPE_CUSTOM                = 0;
-    static final int TYPE_BYTE_SAMPLES          = 1;
-    static final int TYPE_USHORT_SAMPLES        = 2;
-    static final int TYPE_INT_SAMPLES           = 3;
-    static final int TYPE_BYTE_BANDED_SAMPLES   = 4;
-    static final int TYPE_USHORT_BANDED_SAMPLES = 5;
-    static final int TYPE_INT_BANDED_SAMPLES    = 6;
-    static final int TYPE_BYTE_PACKED_SAMPLES   = 7;
-    static final int TYPE_USHORT_PACKED_SAMPLES = 8;
-    static final int TYPE_INT_PACKED_SAMPLES    = 9;
-    static final int TYPE_INT_8BIT_SAMPLES      = 10;
-    static final int TYPE_BYTE_BINARY_SAMPLES   = 11;
-
-    /** private band offset for use by native code */
-    protected int bandOffset;
-
-    /** Data offsets for each band of image data. */
-    protected int[]         dataOffsets;
-
-    /** Scanline stride of the image data contained in this Raster. */
-    protected int           scanlineStride;
-
-    /** Pixel stride of the image data contained in this Raster. */
-    protected int           pixelStride;
-
-    /** The image data array. */
-    protected int[]         data;
-
-    /** The number of data elements required to store a pixel. */
-    protected int           numDataElems;
-
-    int type;
-
-    /** A cached copy of minX + width for use in bounds checks. */
-    private int maxX;
-
-    /** A cached copy of minY + height for use in bounds checks. */
-    private int maxY;
-
-    /**
-     *  Constructs a IntegerComponentRaster with the given SampleModel.
-     *  The Raster's upper left corner is origin and it is the same
-     *  size as the SampleModel.  A DataBuffer large enough to describe the
-     *  Raster is automatically created.  SampleModel must be of type
-     *  SinglePixelPackedSampleModel.
-     *  @param sampleModel     The SampleModel that specifies the layout.
-     *  @param origin          The Point that specified the origin.
-     */
-    public IntegerComponentRaster(SampleModel sampleModel,
-                                     Point origin) {
-        this(sampleModel,
-             sampleModel.createDataBuffer(),
-             new Rectangle(origin.x,
-                           origin.y,
-                           sampleModel.getWidth(),
-                           sampleModel.getHeight()),
-             origin,
-             null);
-    }
-
-    /**
-     * Constructs a IntegerComponentRaster with the given SampleModel
-     * and DataBuffer.  The Raster's upper left corner is origin and
-     * it is the same sizes the SampleModel.  The DataBuffer is not
-     * initialized and must be a DataBufferInt compatible with SampleModel.
-     * SampleModel must be of type SinglePixelPackedSampleModel.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param dataBuffer      The DataBufferInt that contains the image data.
-     * @param origin          The Point that specifies the origin.
-     */
-    public IntegerComponentRaster(SampleModel sampleModel,
-                                     DataBuffer dataBuffer,
-                                     Point origin) {
-        this(sampleModel,
-             dataBuffer,
-             new Rectangle(origin.x,
-                           origin.y,
-                           sampleModel.getWidth(),
-                           sampleModel.getHeight()),
-             origin,
-             null);
-    }
-
-   /**
-     * Constructs a IntegerComponentRaster with the given SampleModel,
-     * DataBuffer, and parent.  DataBuffer must be a DataBufferInt and
-     * SampleModel must be of type SinglePixelPackedSampleModel.
-     * When translated into the base Raster's
-     * coordinate system, aRegion must be contained by the base Raster.
-     * Origin is the coodinate in the new Raster's coordinate system of
-     * the origin of the base Raster.  (The base Raster is the Raster's
-     * ancestor which has no parent.)
-     *
-     * Note that this constructor should generally be called by other
-     * constructors or create methods, it should not be used directly.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param dataBuffer      The DataBufferInt that contains the image data.
-     * @param aRegion         The Rectangle that specifies the image area.
-     * @param origin          The Point that specifies the origin.
-     * @param parent          The parent (if any) of this raster.
-     */
-    public IntegerComponentRaster(SampleModel sampleModel,
-                                     DataBuffer dataBuffer,
-                                     Rectangle aRegion,
-                                     Point origin,
-                                     IntegerComponentRaster parent){
-        super(sampleModel,dataBuffer,aRegion,origin,parent);
-        this.maxX = minX + width;
-        this.maxY = minY + height;
-        if (!(dataBuffer instanceof DataBufferInt)) {
-           throw new RasterFormatException("IntegerComponentRasters must have" +
-                "integer DataBuffers");
-        }
-        DataBufferInt dbi = (DataBufferInt)dataBuffer;
-        if (dbi.getNumBanks() != 1) {
-            throw new
-                RasterFormatException("DataBuffer for IntegerComponentRasters"+
-                                      " must only have 1 bank.");
-        }
-        this.data = stealData(dbi, 0);
-
-        if (sampleModel instanceof SinglePixelPackedSampleModel) {
-            SinglePixelPackedSampleModel sppsm =
-                    (SinglePixelPackedSampleModel)sampleModel;
-            int[] boffsets = sppsm.getBitOffsets();
-            boolean notByteBoundary = false;
-            for (int i=1; i < boffsets.length; i++) {
-                if ((boffsets[i]%8) != 0) {
-                    notByteBoundary = true;
-                }
-            }
-            this.type = (notByteBoundary
-                         ? IntegerComponentRaster.TYPE_INT_PACKED_SAMPLES
-                         : IntegerComponentRaster.TYPE_INT_8BIT_SAMPLES);
-
-            this.scanlineStride = sppsm.getScanlineStride();
-            this.pixelStride    = 1;
-            this.dataOffsets = new int[1];
-            this.dataOffsets[0] = dbi.getOffset();
-            this.bandOffset = this.dataOffsets[0];
-            int xOffset = aRegion.x - origin.x;
-            int yOffset = aRegion.y - origin.y;
-            dataOffsets[0] += xOffset+yOffset*scanlineStride;
-            this.numDataElems = sppsm.getNumDataElements();
-        } else {
-            throw new RasterFormatException("IntegerComponentRasters must have"+
-                                            " SinglePixelPackedSampleModel");
-        }
-
-        verify(false);
-    }
-
-
-    /**
-     * Returns a copy of the data offsets array. For each band the data offset
-     * is the index into the band's data array, of the first sample of the
-     * band.
-     */
-    public int[] getDataOffsets() {
-        return (int[]) dataOffsets.clone();
-    }
-
-    /**
-     * Returns data offset for the specified band.  The data offset
-     * is the index into the data array in which the first sample
-     * of the first scanline is stored.
-     */
-    public int getDataOffset(int band) {
-        return dataOffsets[band];
-    }
-
-
-    /**
-     * Returns the scanline stride -- the number of data array elements between
-     * a given sample and the sample in the same column of the next row.
-     */
-    public int getScanlineStride() {
-        return scanlineStride;
-    }
-
-    /**
-     * Returns pixel stride -- the number of data array elements  between two
-     * samples for the same band on the same scanline.
-     */
-    public int getPixelStride() {
-        return pixelStride;
-    }
-
-    /**
-     * Returns a reference to the data array.
-     */
-    public int[] getDataStorage() {
-        return data;
-    }
-
-    /**
-     * Returns the data elements for all bands at the specified
-     * location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinate is out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * @param x        The X coordinate of the pixel location.
-     * @param y        The Y coordinate of the pixel location.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length getNumDataElements().
-     *                 If null an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the request pixel data.
-     */
-    public Object getDataElements(int x, int y, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x >= this.maxX) || (y >= this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int outData[];
-        if (obj == null) {
-            outData = new int[numDataElements];
-        } else {
-            outData = (int[])obj;
-        }
-        int off = (y-minY)*scanlineStride +
-                  (x-minX)*pixelStride;
-        for (int band = 0; band < numDataElements; band++) {
-            outData[band] = data[dataOffsets[band] + off];
-        }
-
-        return outData;
-    }
-
-
-    /**
-     * Returns an array  of data elements from the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     <pre>
-     *       int[] bandData = (int[])raster.getDataElements(x, y, w, h, null);
-     *       int numDataElements = raster.getNumDataElements();
-     *       int[] pixel = new int[numDataElements];
-     *       // To find a data element at location (x2, y2)
-     *       System.arraycopy(bandData, ((y2-y)*w + (x2-x))*numDataElements,
-     *                        pixel, 0, numDataElements);
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements().
-     *                 If null an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the request pixel data.
-     */
-    public Object getDataElements(int x, int y, int w, int h, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int outData[];
-        if (obj instanceof int[]) {
-            outData = (int[])obj;
-        } else {
-            outData = new int[numDataElements*w*h];
-        }
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    outData[off++] = data[dataOffsets[c] + xoff];
-                }
-            }
-        }
-
-        return outData;
-    }
-
-
-    /**
-     * Stores the data elements for all bands at the specified location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinate is out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * @param x        The X coordinate of the pixel location.
-     * @param y        The Y coordinate of the pixel location.
-     * @param inData   An object reference to an array of type defined by
-     *                 getTransferType() and length getNumDataElements()
-     *                 containing the pixel data to place at x,y.
-     */
-    public void setDataElements(int x, int y, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x >= this.maxX) || (y >= this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int inData[] = (int[])obj;
-
-        int off = (y-minY)*scanlineStride +
-                  (x-minX)*pixelStride;
-
-        for (int i = 0; i < numDataElements; i++) {
-            data[dataOffsets[i] + off] = inData[i];
-        }
-
-        markDirty();
-    }
-
-
-    /**
-     * Stores the Raster data at the specified location.
-     * The transferType of the inputRaster must match this raster.
-     * An ArrayIndexOutOfBoundsException will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * @param x          The X coordinate of the pixel location.
-     * @param y          The Y coordinate of the pixel location.
-     * @param inRaster   Raster of data to place at x,y location.
-     */
-    public void setDataElements(int x, int y, Raster inRaster) {
-        int dstOffX = x + inRaster.getMinX();
-        int dstOffY = y + inRaster.getMinY();
-        int width  = inRaster.getWidth();
-        int height = inRaster.getHeight();
-        if ((dstOffX < this.minX) || (dstOffY < this.minY) ||
-            (dstOffX + width > this.maxX) || (dstOffY + height > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        setDataElements(dstOffX, dstOffY, width, height, inRaster);
-    }
-
-    /**
-     * Stores the Raster data at the specified location.
-     * @param dstX The absolute X coordinate of the destination pixel
-     * that will receive a copy of the upper-left pixel of the
-     * inRaster
-     * @param dstY The absolute Y coordinate of the destination pixel
-     * that will receive a copy of the upper-left pixel of the
-     * inRaster
-     * @param width      The number of pixels to store horizontally
-     * @param height     The number of pixels to store vertically
-     * @param inRaster   Raster of data to place at x,y location.
-     */
-    private void setDataElements(int dstX, int dstY,
-                                 int width, int height,
-                                 Raster inRaster) {
-        // Assume bounds checking has been performed previously
-        if (width <= 0 || height <= 0) {
-            return;
-        }
-
-        // Write inRaster (minX, minY) to (dstX, dstY)
-
-        int srcOffX = inRaster.getMinX();
-        int srcOffY = inRaster.getMinY();
-        int tdata[] = null;
-
-        if (inRaster instanceof IntegerComponentRaster &&
-            (pixelStride == 1) && (numDataElements == 1)) {
-            IntegerComponentRaster ict = (IntegerComponentRaster) inRaster;
-            if (ict.getNumDataElements() != 1) {
-                throw new ArrayIndexOutOfBoundsException("Number of bands"+
-                                                         " does not match");
-            }
-
-            // Extract the raster parameters
-            tdata    = ict.getDataStorage();
-            int tss  = ict.getScanlineStride();
-            int toff = ict.getDataOffset(0);
-
-            int srcOffset = toff;
-
-            int dstOffset = dataOffsets[0]+(dstY-minY)*scanlineStride+
-                                           (dstX-minX);
-
-
-            // Fastest case.  We can copy scanlines
-            if (ict.getPixelStride() == pixelStride) {
-                width *= pixelStride;
-
-                // Loop through all of the scanlines and copy the data
-                for (int startY=0; startY < height; startY++) {
-                    System.arraycopy(tdata, srcOffset, data, dstOffset, width);
-                    srcOffset += tss;
-                    dstOffset += scanlineStride;
-                }
-                markDirty();
-                return;
-            }
-        }
-
-        Object odata = null;
-        for (int startY=0; startY < height; startY++) {
-            odata = inRaster.getDataElements(srcOffX, srcOffY+startY,
-                                             width, 1, odata);
-            setDataElements(dstX, dstY+startY,
-                            width, 1, odata);
-        }
-    }
-
-    /**
-     * Stores an array of data elements into the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * for the nth band at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))*numDataElements + n]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param inData   An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements()
-     *                 containing the pixel data to place between x,y and
-     *                 x+h, y+h.
-     */
-    public void setDataElements(int x, int y, int w, int h, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int inData[] = (int[])obj;
-
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    data[dataOffsets[c] + xoff] = inData[off++];
-                }
-            }
-        }
-
-        markDirty();
-    }
-
-
-    /**
-     * Creates a subraster given a region of the raster.  The x and y
-     * coordinates specify the horizontal and vertical offsets
-     * from the upper-left corner of this raster to the upper-left corner
-     * of the subraster.  A subset of the bands of the parent Raster may
-     * be specified.  If this is null, then all the bands are present in the
-     * subRaster. A translation to the subRaster may also be specified.
-     * Note that the subraster will reference the same
-     * DataBuffer as the parent raster, but using different offsets.
-     * @param x               X offset.
-     * @param y               Y offset.
-     * @param width           Width (in pixels) of the subraster.
-     * @param height          Height (in pixels) of the subraster.
-     * @param x0              Translated X origin of the subraster.
-     * @param y0              Translated Y origin of the subraster.
-     * @param bandList        Array of band indices.
-     * @exception RasterFormatException
-     *            if the specified bounding box is outside of the parent raster.
-     */
-    public WritableRaster createWritableChild (int x, int y,
-                                               int width, int height,
-                                               int x0, int y0,
-                                               int bandList[]) {
-        if (x < this.minX) {
-            throw new RasterFormatException("x lies outside raster");
-        }
-        if (y < this.minY) {
-            throw new RasterFormatException("y lies outside raster");
-        }
-        if ((x+width < x) || (x+width > this.minX + this.width)) {
-            throw new RasterFormatException("(x + width) is outside raster");
-        }
-        if ((y+height < y) || (y+height > this.minY + this.height)) {
-            throw new RasterFormatException("(y + height) is outside raster");
-        }
-
-        SampleModel sm;
-
-        if (bandList != null)
-            sm = sampleModel.createSubsetSampleModel(bandList);
-        else
-            sm = sampleModel;
-
-        int deltaX = x0 - x;
-        int deltaY = y0 - y;
-
-        return new IntegerComponentRaster(sm,
-                                          dataBuffer,
-                                          new Rectangle(x0,y0,width,height),
-                                          new Point(sampleModelTranslateX+deltaX,
-                                                    sampleModelTranslateY+deltaY),
-                                          this);
-    }
-
-
-    /**
-     * Creates a subraster given a region of the raster.  The x and y
-     * coordinates specify the horizontal and vertical offsets
-     * from the upper-left corner of this raster to the upper-left corner
-     * of the subraster.  A subset of the bands of the parent raster may
-     * be specified. If this is null, then all the bands are present in the
-     * subRaster. Note that the subraster will reference the same
-     * DataBuffer as the parent raster, but using different offsets.
-     * @param x               X offset.
-     * @param y               Y offset.
-     * @param width           Width (in pixels) of the subraster.
-     * @param height          Height (in pixels) of the subraster.
-     * @param x0              Translated X origin of the subRaster.
-     * @param y0              Translated Y origin of the subRaster.
-     * @param bandList        Array of band indices.
-     * @exception RasterFormatException
-     *            if the specified bounding box is outside of the parent raster.
-     */
-    public Raster createChild (int x, int y,
-                               int width, int height,
-                               int x0, int y0,
-                               int bandList[]) {
-        return createWritableChild(x, y, width, height, x0, y0, bandList);
-    }
-
-
-    /**
-     * Creates a raster with the same band layout but using a different
-     * width and height, and with new zeroed data arrays.
-     */
-    public WritableRaster createCompatibleWritableRaster(int w, int h) {
-        if (w <= 0 || h <=0) {
-            throw new RasterFormatException("negative "+
-                                          ((w <= 0) ? "width" : "height"));
-        }
-
-        SampleModel sm = sampleModel.createCompatibleSampleModel(w,h);
-
-        return new IntegerComponentRaster(sm, new Point(0,0));
-    }
-
-    /**
-     * Creates a raster with the same data layout and the same
-     * width and height, and with new zeroed data arrays.  If
-     * the raster is a subraster, this will call
-     * createCompatibleRaster(width, height).
-     */
-    public WritableRaster createCompatibleWritableRaster() {
-        return createCompatibleWritableRaster(width,height);
-    }
-
-    /**
-     * Verify that the layout parameters are consistent with
-     * the data.  If strictCheck
-     * is false, this method will check for ArrayIndexOutOfBounds conditions.  If
-     * strictCheck is true, this method will check for additional error
-     * conditions such as line wraparound (width of a line greater than
-     * the scanline stride).
-     * @return   String   Error string, if the layout is incompatible with
-     *                    the data.  Otherwise returns null.
-     */
-    private void verify (boolean strictCheck) {
-        if (dataOffsets[0] < 0) {
-            throw new RasterFormatException("Data offset ("+dataOffsets[0]+
-                                            ") must be >= 0");
-        }
-
-        int maxSize = 0;
-        int size;
-
-        for (int i=0; i < numDataElements; i++) {
-            size = (height-1)*scanlineStride + (width-1)*pixelStride +
-                dataOffsets[i];
-            if (size > maxSize) {
-                maxSize = size;
-            }
-        }
-        if (data.length < maxSize) {
-            throw new RasterFormatException("Data array too small (should be "+
-                                          maxSize
-                                          +" but is "+data.length+" )");
-        }
-    }
-
-    public String toString() {
-        return new String ("IntegerComponentRaster: width = "+width
-                           +" height = " + height
-                           +" #Bands = " + numBands
-                           +" #DataElements "+numDataElements
-                           +" xOff = "+sampleModelTranslateX
-                           +" yOff = "+sampleModelTranslateY
-                           +" dataOffset[0] "+dataOffsets[0]);
-    }
-
-//    /**
-//     * For debugging...  prints a region of a one-band IntegerComponentRaster
-//     */
-//    public void print(int x, int y, int w, int h) {
-//        // REMIND:  Only works for 1 band!
-//        System.out.println(this);
-//        int offset = dataOffsets[0] + y*scanlineStride + x*pixelStride;
-//        int off;
-//        for (int yoff=0; yoff < h; yoff++, offset += scanlineStride) {
-//            off = offset;
-//            System.out.print("Line "+(sampleModelTranslateY+y+yoff)+": ");
-//            for (int xoff = 0; xoff < w; xoff++, off+= pixelStride) {
-//                System.out.print(Integer.toHexString(data[off])+" ");
-//            }
-//            System.out.println("");
-//        }
-//    }
-
-}
diff --git a/external/ikvm/openjdk/sun/awt/image/OffScreenImageSource.java b/external/ikvm/openjdk/sun/awt/image/OffScreenImageSource.java
deleted file mode 100644
index 7e8e2db..0000000
--- a/external/ikvm/openjdk/sun/awt/image/OffScreenImageSource.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (c) 1995, 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.awt.image;
-
-import java.util.Hashtable;
-import java.awt.image.ImageConsumer;
-import java.awt.image.ImageProducer;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-import java.awt.image.ColorModel;
-import java.awt.image.IndexColorModel;
-import java.awt.image.DirectColorModel;
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBuffer;
-
-public class OffScreenImageSource implements ImageProducer {
-    BufferedImage image;
-    int width;
-    int height;
-    Hashtable properties;
-
-    public OffScreenImageSource(BufferedImage image,
-                                Hashtable properties) {
-        this.image = image;
-        if (properties != null) {
-            this.properties = properties;
-        } else {
-            this.properties = new Hashtable();
-        }
-        width  = image.getWidth();
-        height = image.getHeight();
-    }
-
-    public OffScreenImageSource(BufferedImage image) {
-        this(image, null);
-    }
-
-    // We can only have one consumer since we immediately return the data...
-    private ImageConsumer theConsumer;
-
-    public synchronized void addConsumer(ImageConsumer ic) {
-        theConsumer = ic;
-        produce();
-    }
-
-    public synchronized boolean isConsumer(ImageConsumer ic) {
-        return (ic == theConsumer);
-    }
-
-    public synchronized void removeConsumer(ImageConsumer ic) {
-        if (theConsumer == ic) {
-            theConsumer = null;
-        }
-    }
-
-    public void startProduction(ImageConsumer ic) {
-        addConsumer(ic);
-    }
-
-    public void requestTopDownLeftRightResend(ImageConsumer ic) {
-    }
-
-    private void sendPixels() {
-        ColorModel cm = image.getColorModel();
-        WritableRaster raster = image.getRaster();
-        int numDataElements = raster.getNumDataElements();
-        int dataType = raster.getDataBuffer().getDataType();
-        int[] scanline = new int[width*numDataElements];
-        boolean needToCvt = true;
-
-        if (cm instanceof IndexColorModel) {
-            byte[] pixels = new byte[width];
-            theConsumer.setColorModel(cm);
-
-            if (raster instanceof ByteComponentRaster) {
-                needToCvt = false;
-                for (int y=0; y < height; y++) {
-                    raster.getDataElements(0, y, width, 1, pixels);
-                    theConsumer.setPixels(0, y, width, 1, cm, pixels, 0,
-                                          width);
-                }
-            }
-            else if (raster instanceof BytePackedRaster) {
-                needToCvt = false;
-                // Binary image.  Need to unpack it
-                for (int y=0; y < height; y++) {
-                    raster.getPixels(0, y, width, 1, scanline);
-                    for (int x=0; x < width; x++) {
-                        pixels[x] = (byte) scanline[x];
-                    }
-                    theConsumer.setPixels(0, y, width, 1, cm, pixels, 0,
-                                          width);
-                }
-            }
-            else if (dataType == DataBuffer.TYPE_SHORT ||
-                     dataType == DataBuffer.TYPE_INT)
-            {
-                // Probably a short or int "GRAY" image
-                needToCvt = false;
-                for (int y=0; y < height; y++) {
-                    raster.getPixels(0, y, width, 1, scanline);
-                    theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,
-                                          width);
-                }
-            }
-        }
-        else if (cm instanceof DirectColorModel) {
-            theConsumer.setColorModel(cm);
-            needToCvt = false;
-            switch (dataType) {
-            case DataBuffer.TYPE_INT:
-                for (int y=0; y < height; y++) {
-                    raster.getDataElements(0, y, width, 1, scanline);
-                    theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,
-                                          width);
-                }
-                break;
-            case DataBuffer.TYPE_BYTE:
-                byte[] bscanline = new byte[width];
-                for (int y=0; y < height; y++) {
-                    raster.getDataElements(0, y, width, 1, bscanline);
-                    for (int x=0; x < width; x++) {
-                        scanline[x] = bscanline[x]&0xff;
-                    }
-                    theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,
-                                          width);
-                }
-                break;
-            case DataBuffer.TYPE_USHORT:
-                short[] sscanline = new short[width];
-                for (int y=0; y < height; y++) {
-                    raster.getDataElements(0, y, width, 1, sscanline);
-                    for (int x=0; x < width; x++) {
-                        scanline[x] = sscanline[x]&0xffff;
-                    }
-                    theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,
-                                          width);
-                }
-                break;
-            default:
-                needToCvt = true;
-            }
-        }
-
-        if (needToCvt) {
-            // REMIND: Need to add other types of CMs here
-            ColorModel newcm = ColorModel.getRGBdefault();
-            theConsumer.setColorModel(newcm);
-
-            for (int y=0; y < height; y++) {
-                for (int x=0; x < width; x++) {
-                    scanline[x] = image.getRGB(x, y);
-                }
-                theConsumer.setPixels(0, y, width, 1, newcm, scanline, 0,
-                                      width);
-            }
-        }
-    }
-
-    private void produce() {
-        try {
-            theConsumer.setDimensions(image.getWidth(), image.getHeight());
-            theConsumer.setProperties(properties);
-            sendPixels();
-            theConsumer.imageComplete(ImageConsumer.SINGLEFRAMEDONE);
-        } catch (NullPointerException e) {
-            if (theConsumer != null) {
-                theConsumer.imageComplete(ImageConsumer.IMAGEERROR);
-            }
-        }
-    }
-}
diff --git a/external/ikvm/openjdk/sun/awt/image/ShortComponentRaster.java b/external/ikvm/openjdk/sun/awt/image/ShortComponentRaster.java
deleted file mode 100644
index f353fa8..0000000
--- a/external/ikvm/openjdk/sun/awt/image/ShortComponentRaster.java
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.awt.image;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-import java.awt.image.RasterFormatException;
-import java.awt.image.SampleModel;
-import java.awt.image.ComponentSampleModel;
-import java.awt.image.SinglePixelPackedSampleModel;
-import java.awt.image.DataBuffer;
-import java.awt.image.DataBufferUShort;
-import java.awt.Rectangle;
-import java.awt.Point;
-
-/**
- * This class defines a Raster with pixels consisting of one or more 16-bit
- * data elements stored in close proximity to each other in a short integer
- * array.  The bit precision per data element is that
- * of the data type (that is, the bit precision for this Raster is 16).
- * There is only one pixel stride and one scanline stride for all
- * bands.  This type of Raster can be used with a
- * ComponentColorModel if there are multiple bands, or a
- * IndexColorModel if there is only one band.
- * <p>
- * For example, 5-6-5 RGB image data can be represented by a
- * ShortComponentRaster using a SinglePixelPackedSampleModel and
- * a ComponentColorModel.
- *
- *
- */
-public class ShortComponentRaster extends SunWritableRaster {
-
-    /** private band offset for use by native code */
-    protected int bandOffset;
-
-    /** Data offsets for each band of image data. */
-    protected int[]         dataOffsets;
-
-    /** Scanline stride of the image data contained in this Raster. */
-    protected int           scanlineStride;
-
-    /** Pixel stride of the image data contained in this Raster. */
-    protected int           pixelStride;
-
-    /** The image data array. */
-    protected short[]       data;
-
-    int type;
-
-    /** A cached copy of minX + width for use in bounds checks. */
-    private int maxX;
-
-    /** A cached copy of minY + height for use in bounds checks. */
-    private int maxY;
-
-    /**
-     *  Constructs a ShortComponentRaster with the given SampleModel.
-     *  The Raster's upper left corner is origin and it is the same
-     *  size as the SampleModel.  A DataBuffer large enough to describe the
-     *  Raster is automatically created.  SampleModel must be of type
-     *  ComponentSampleModel or SinglePixelPackedSampleModel.
-     *  @param sampleModel     The SampleModel that specifies the layout.
-     *  @param origin          The Point that specified the origin.
-     */
-    public ShortComponentRaster(SampleModel sampleModel, Point origin) {
-        this(sampleModel,
-             sampleModel.createDataBuffer(),
-             new Rectangle(origin.x,
-                           origin.y,
-                           sampleModel.getWidth(),
-                           sampleModel.getHeight()),
-             origin,
-             null);
-    }
-
-    /**
-     * Constructs a ShortComponentRaster with the given SampleModel
-     * and DataBuffer.  The Raster's upper left corner is origin and
-     * it is the same sizes the SampleModel.  The DataBuffer is not
-     * initialized and must be a DataBufferUShort compatible with SampleModel.
-     * SampleModel must be of type ComponentSampleModel or
-     * SinglePixelPackedSampleModel.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param dataBuffer      The DataBufferUShort that contains the image data.
-     * @param origin          The Point that specifies the origin.
-     */
-    public ShortComponentRaster(SampleModel sampleModel,
-                                   DataBuffer dataBuffer,
-                                   Point origin) {
-        this(sampleModel,
-             dataBuffer,
-             new Rectangle(origin.x,
-                           origin.y,
-                           sampleModel.getWidth(),
-                           sampleModel.getHeight()),
-             origin,
-             null);
-    }
-
-    /**
-     * Constructs a ShortComponentRaster with the given SampleModel,
-     * DataBuffer, and parent.  DataBuffer must be a DataBufferUShort and
-     * SampleModel must be of type ComponentSampleModel or
-     * SinglePixelPackedSampleModel.  When translated into the base Raster's
-     * coordinate system, aRegion must be contained by the base Raster.
-     * Origin is the coodinate in the new Raster's coordinate system of
-     * the origin of the base Raster.  (The base Raster is the Raster's
-     * ancestor which has no parent.)
-     *
-     * Note that this constructor should generally be called by other
-     * constructors or create methods, it should not be used directly.
-     * @param sampleModel     The SampleModel that specifies the layout.
-     * @param dataBuffer      The DataBufferUShort that contains the image data.
-     * @param aRegion         The Rectangle that specifies the image area.
-     * @param origin          The Point that specifies the origin.
-     * @param parent          The parent (if any) of this raster.
-     */
-    public ShortComponentRaster(SampleModel sampleModel,
-                                   DataBuffer dataBuffer,
-                                   Rectangle aRegion,
-                                   Point origin,
-                                   ShortComponentRaster parent) {
-
-        super(sampleModel, dataBuffer, aRegion, origin, parent);
-        this.maxX = minX + width;
-        this.maxY = minY + height;
-
-        if(!(dataBuffer instanceof DataBufferUShort)) {
-            throw new RasterFormatException("ShortComponentRasters must have "+
-                                            "short DataBuffers");
-        }
-
-        DataBufferUShort dbus = (DataBufferUShort)dataBuffer;
-        this.data = stealData(dbus, 0);
-        if (dbus.getNumBanks() != 1) {
-            throw new
-                RasterFormatException("DataBuffer for ShortComponentRasters"+
-                                      " must only have 1 bank.");
-        }
-        int dbOffset = dbus.getOffset();
-
-        if (sampleModel instanceof ComponentSampleModel) {
-            ComponentSampleModel csm = (ComponentSampleModel)sampleModel;
-            this.type = IntegerComponentRaster.TYPE_USHORT_SAMPLES;
-            this.scanlineStride = csm.getScanlineStride();
-            this.pixelStride = csm.getPixelStride();
-            this.dataOffsets = csm.getBandOffsets();
-            int xOffset = aRegion.x - origin.x;
-            int yOffset = aRegion.y - origin.y;
-            for (int i = 0; i < getNumDataElements(); i++) {
-                dataOffsets[i] += dbOffset +
-                    xOffset*pixelStride+yOffset*scanlineStride;
-            }
-        } else if (sampleModel instanceof SinglePixelPackedSampleModel) {
-            SinglePixelPackedSampleModel sppsm =
-                    (SinglePixelPackedSampleModel)sampleModel;
-            this.type = IntegerComponentRaster.TYPE_USHORT_PACKED_SAMPLES;
-            this.scanlineStride = sppsm.getScanlineStride();
-            this.pixelStride    = 1;
-            this.dataOffsets = new int[1];
-            this.dataOffsets[0] = dbOffset;
-            int xOffset = aRegion.x - origin.x;
-            int yOffset = aRegion.y - origin.y;
-            dataOffsets[0] += xOffset+yOffset*scanlineStride;
-        } else {
-            throw new RasterFormatException("ShortComponentRasters must have"+
-                "ComponentSampleModel or SinglePixelPackedSampleModel");
-        }
-        this.bandOffset = this.dataOffsets[0];
-
-        verify(false);
-    }
-
-    /**
-     * Returns a copy of the data offsets array. For each band the data offset
-     * is the index into the band's data array, of the first sample of the
-     * band.
-     */
-    public int[] getDataOffsets() {
-        return (int[]) dataOffsets.clone();
-    }
-
-    /**
-     * Returns the data offset for the specified band.  The data offset
-     * is the index into the data array in which the first sample
-     * of the first scanline is stored.
-     * @param band  The band whose offset is returned.
-     */
-    public int getDataOffset(int band) {
-        return dataOffsets[band];
-    }
-
-    /**
-     * Returns the scanline stride -- the number of data array elements between
-     * a given sample and the same sample in the same column of the next row.
-     */
-    public int getScanlineStride() {
-        return scanlineStride;
-    }
-
-    /**
-     * Returns pixel stride -- the number of data array elements  between two
-     * samples for the same band on the same scanline.
-     */
-    public int getPixelStride() {
-        return pixelStride;
-    }
-
-    /**
-     * Returns a reference to the data array.
-     */
-    public short[] getDataStorage() {
-        return data;
-    }
-
-    /**
-     * Returns the data elements for all bands at the specified
-     * location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinate is out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * @param x        The X coordinate of the pixel location.
-     * @param y        The Y coordinate of the pixel location.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length getNumDataElements().
-     *                 If null an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the request pixel data.
-     */
-    public Object getDataElements(int x, int y, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x >= this.maxX) || (y >= this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        short outData[];
-        if (obj == null) {
-            outData = new short[numDataElements];
-        } else {
-            outData = (short[])obj;
-        }
-        int off = (y-minY)*scanlineStride +
-                  (x-minX)*pixelStride;
-
-        for (int band = 0; band < numDataElements; band++) {
-            outData[band] = data[dataOffsets[band] + off];
-        }
-
-        return outData;
-    }
-
-    /**
-     * Returns an array  of data elements from the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * <pre>
-     *       short[] bandData = (short[])Raster.getDataElements(x, y, w, h, null);
-     *       int numDataElements = Raster.getBands();
-     *       short[] pixel = new short[numDataElements];
-     *       // To find the data element at location (x2, y2)
-     *       System.arraycopy(bandData, ((y2-y)*w + (x2-x))*numDataElements,
-     *                        pixel, 0, numDataElements);
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param outData  An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements().
-     *                 If null an array of appropriate type and size will be
-     *                 allocated.
-     * @return         An object reference to an array of type defined by
-     *                 getTransferType() with the request pixel data.
-     */
-    public Object getDataElements(int x, int y, int w, int h, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        short outData[];
-        if (obj == null) {
-            outData = new short[w*h*numDataElements];
-        } else {
-            outData = (short[])obj;
-        }
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    outData[off++] = data[dataOffsets[c] + xoff];
-                }
-            }
-        }
-
-        return outData;
-    }
-
-    /**
-     * Returns a short integer array of data elements from the
-     * specified rectangular region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * <pre>
-     *       short[] bandData = Raster.getShortData(x, y, w, h, null);
-     *       // To find the data element at location (x2, y2)
-     *       short dataElenent = bandData[((y2-y)*w + (x2-x))];
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the sample rectangle.
-     * @param height   Height of the sample rectangle.
-     * @param band     The band to return.
-     * @param outData  If non-null, data elements for all bands
-     *                 at the specified location are returned in this array.
-     * @return         Data array with data elements for all bands.
-     */
-    public short[] getShortData(int x, int y, int w, int h,
-                               int band, short[] outData) {
-        // Bounds check for 'band' will be performed automatically
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        if (outData == null) {
-            outData = new short[numDataElements*w*h];
-        }
-        int yoff =  (y-minY)*scanlineStride +
-                    (x-minX)*pixelStride+ dataOffsets[band];
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        if (pixelStride == 1) {
-            if (scanlineStride == w) {
-                System.arraycopy(data, yoff, outData, 0, w*h);
-            }
-            else {
-                for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                    System.arraycopy(data, yoff, outData, off, w);
-                    off += w;
-                }
-            }
-        }
-        else {
-            for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                xoff = yoff;
-                for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                    outData[off++] = data[xoff];
-                }
-            }
-        }
-
-        return outData;
-    }
-
-    /**
-     * Returns a short integer array  of data elements from the
-     * specified rectangular region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * <pre>
-     *       short[] bandData = Raster.getShortData(x, y, w, h, null);
-     *       int numDataElements = Raster.getNumBands();
-     *       short[] pixel = new short[numDataElements];
-     *       // To find the data element at location (x2, y2)
-     *       System.arraycopy(bandData, ((y2-y)*w + (x2-x))*numDataElements,
-     *                        pixel, 0, numDataElements);
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param width    Width of the pixel rectangle.
-     * @param height   Height of the pixel rectangle.
-     * @param outData  If non-null, data elements for all bands
-     *                 at the specified location are returned in this array.
-     * @return         Data array with data elements for all bands.
-     */
-    public short[] getShortData(int x, int y, int w, int h, short[] outData) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        if (outData == null) {
-            outData = new short[numDataElements*w*h];
-        }
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    outData[off++] = data[dataOffsets[c] + xoff];
-                }
-            }
-        }
-
-        return outData;
-    }
-
-    /**
-     * Stores the data elements for all bands at the specified location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinate is out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * @param x        The X coordinate of the pixel location.
-     * @param y        The Y coordinate of the pixel location.
-     * @param inData   An object reference to an array of type defined by
-     *                 getTransferType() and length getNumDataElements()
-     *                 containing the pixel data to place at x,y.
-     */
-    public void setDataElements(int x, int y, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x >= this.maxX) || (y >= this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        short inData[] = (short[])obj;
-        int off = (y-minY)*scanlineStride +
-                  (x-minX)*pixelStride;
-        for (int i = 0; i < numDataElements; i++) {
-            data[dataOffsets[i] + off] = (short) inData[i];
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Stores the Raster data at the specified location.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * @param x          The X coordinate of the pixel location.
-     * @param y          The Y coordinate of the pixel location.
-     * @param inRaster   Raster of data to place at x,y location.
-     */
-    public void setDataElements(int x, int y, Raster inRaster) {
-        int dstOffX = x + inRaster.getMinX();
-        int dstOffY = y + inRaster.getMinY();
-        int width  = inRaster.getWidth();
-        int height = inRaster.getHeight();
-        if ((dstOffX < this.minX) || (dstOffY < this.minY) ||
-            (dstOffX + width > this.maxX) || (dstOffY + height > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-
-        setDataElements(dstOffX, dstOffY, width, height, inRaster);
-    }
-
-    /**
-     * Stores the Raster data at the specified location.
-     * @param dstX The absolute X coordinate of the destination pixel
-     * that will receive a copy of the upper-left pixel of the
-     * inRaster
-     * @param dstY The absolute Y coordinate of the destination pixel
-     * that will receive a copy of the upper-left pixel of the
-     * inRaster
-     * @param width      The number of pixels to store horizontally
-     * @param height     The number of pixels to store vertically
-     * @param inRaster   Raster of data to place at x,y location.
-     */
-    private void setDataElements(int dstX, int dstY,
-                                 int width, int height,
-                                 Raster inRaster) {
-        // Assume bounds checking has been performed previously
-        if (width <= 0 || height <= 0) {
-            return;
-        }
-
-        // Write inRaster (minX, minY) to (dstX, dstY)
-
-        int srcOffX = inRaster.getMinX();
-        int srcOffY = inRaster.getMinY();
-        Object tdata = null;
-
-//      // REMIND: Do something faster!
-//      if (inRaster instanceof ShortComponentRaster) {
-//      }
-
-        for (int startY=0; startY < height; startY++) {
-            // Grab one scanline at a time
-            tdata = inRaster.getDataElements(srcOffX, srcOffY+startY,
-                                             width, 1, tdata);
-            setDataElements(dstX, dstY + startY, width, 1, tdata);
-        }
-    }
-
-    /**
-     * Stores an array of data elements into the specified rectangular
-     * region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * A ClassCastException will be thrown if the input object is non null
-     * and references anything other than an array of transferType.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * for the nth band at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))*numDataElements + n]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param inData   An object reference to an array of type defined by
-     *                 getTransferType() and length w*h*getNumDataElements()
-     *                 containing the pixel data to place between x,y and
-     *                 x+h, y+h.
-     */
-    public void setDataElements(int x, int y, int w, int h, Object obj) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        short inData[] = (short[])obj;
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    data[dataOffsets[c] + xoff] = (short) inData[off++];
-                }
-            }
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Stores a short integer array of data elements into the
-     * specified rectangular region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param band     The band to set.
-     * @param inData   The data elements to be stored.
-     */
-    public void putShortData(int x, int y, int w, int h,
-                             int band, short[] inData) {
-        // Bounds check for 'band' will be performed automatically
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int yoff =  (y-minY)*scanlineStride +
-                    (x-minX)*pixelStride + dataOffsets[band];
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        if (pixelStride == 1) {
-            if (scanlineStride == w) {
-                System.arraycopy(inData, 0, data, yoff, w*h);
-            }
-            else {
-                for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                    System.arraycopy(inData, off, data, yoff, w);
-                    off += w;
-                }
-            }
-        }
-        else {
-            for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-                xoff = yoff;
-                for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                    data[xoff] = inData[off++];
-                }
-            }
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Stores a short integer array of data elements into the
-     * specified rectangular region.
-     * An ArrayIndexOutOfBounds exception will be thrown at runtime
-     * if the pixel coordinates are out of bounds.
-     * The data elements in the
-     * data array are assumed to be packed.  That is, a data element
-     * for the nth band at location (x2, y2) would be found at:
-     * <pre>
-     *      inData[((y2-y)*w + (x2-x))*numDataElements + n]
-     * </pre>
-     * @param x        The X coordinate of the upper left pixel location.
-     * @param y        The Y coordinate of the upper left pixel location.
-     * @param w        Width of the pixel rectangle.
-     * @param h        Height of the pixel rectangle.
-     * @param inData   The data elements to be stored.
-     */
-    public void putShortData(int x, int y, int w, int h, short[] inData) {
-        if ((x < this.minX) || (y < this.minY) ||
-            (x + w > this.maxX) || (y + h > this.maxY)) {
-            throw new ArrayIndexOutOfBoundsException
-                ("Coordinate out of bounds!");
-        }
-        int yoff = (y-minY)*scanlineStride +
-                   (x-minX)*pixelStride;
-        int xoff;
-        int off = 0;
-        int xstart;
-        int ystart;
-
-        for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
-            xoff = yoff;
-            for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
-                for (int c = 0; c < numDataElements; c++) {
-                    data[dataOffsets[c] + xoff] = inData[off++];
-                }
-            }
-        }
-
-        markDirty();
-    }
-
-    /**
-     * Creates a subraster given a region of the raster.  The x and y
-     * coordinates specify the horizontal and vertical offsets
-     * from the upper-left corner of this raster to the upper-left corner
-     * of the subraster.  A subset of the bands of the parent Raster may
-     * be specified.  If this is null, then all the bands are present in the
-     * subRaster. A translation to the subRaster may also be specified.
-     * Note that the subraster will reference the same
-     * band objects as the parent raster, but using different offsets.
-     * @param x               X offset.
-     * @param y               Y offset.
-     * @param width           Width (in pixels) of the subraster.
-     * @param height          Height (in pixels) of the subraster.
-     * @param x0              Translated X origin of the subraster.
-     * @param y0              Translated Y origin of the subraster.
-     * @param bandList        Array of band indices.
-     * @exception RasterFormatException
-     *            if the specified bounding box is outside of the parent raster.
-     */
-    public Raster createChild (int x, int y,
-                               int width, int height,
-                               int x0, int y0, int[] bandList) {
-        WritableRaster newRaster = createWritableChild(x, y,
-                                                       width, height,
-                                                       x0, y0,
-                                                       bandList);
-        return (Raster) newRaster;
-    }
-
-    /**
-     * Creates a Writable subRaster given a region of the Raster. The x and y
-     * coordinates specify the horizontal and vertical offsets
-     * from the upper-left corner of this Raster to the upper-left corner
-     * of the subRaster.  A subset of the bands of the parent Raster may
-     * be specified.  If this is null, then all the bands are present in the
-     * subRaster. A translation to the subRaster may also be specified.
-     * Note that the subRaster will reference the same
-     * DataBuffers as the parent Raster, but using different offsets.
-     * @param x               X offset.
-     * @param y               Y offset.
-     * @param width           Width (in pixels) of the subraster.
-     * @param height          Height (in pixels) of the subraster.
-     * @param x0              Translated X origin of the subraster.
-     * @param y0              Translated Y origin of the subraster.
-     * @param bandList        Array of band indices.
-     * @exception RasterFormatException
-     *            if the specified bounding box is outside of the parent Raster.
-     */
-    public WritableRaster createWritableChild(int x, int y,
-                                              int width, int height,
-                                              int x0, int y0,
-                                              int[] bandList) {
-        if (x < this.minX) {
-            throw new RasterFormatException("x lies outside the raster");
-        }
-        if (y < this.minY) {
-            throw new RasterFormatException("y lies outside the raster");
-        }
-        if ((x+width < x) || (x+width > this.minX + this.width)) {
-            throw new RasterFormatException("(x + width) is outside of Raster");
-        }
-        if ((y+height < y) || (y+height > this.minY + this.height)) {
-            throw new RasterFormatException("(y + height) is outside of Raster");
-        }
-
-        SampleModel sm;
-
-        if (bandList != null)
-            sm = sampleModel.createSubsetSampleModel(bandList);
-        else
-            sm = sampleModel;
-
-        int deltaX = x0 - x;
-        int deltaY = y0 - y;
-
-        return new ShortComponentRaster(sm,
-                                       dataBuffer,
-                                       new Rectangle(x0, y0, width, height),
-                                       new Point(sampleModelTranslateX+deltaX,
-                                                 sampleModelTranslateY+deltaY),
-                                       this);
-    }
-
-    /**
-     * Creates a Raster with the same layout but using a different
-     * width and height, and with new zeroed data arrays.
-     */
-    public WritableRaster createCompatibleWritableRaster(int w, int h) {
-        if (w <= 0 || h <=0) {
-            throw new RasterFormatException("negative "+
-                                          ((w <= 0) ? "width" : "height"));
-        }
-
-        SampleModel sm = sampleModel.createCompatibleSampleModel(w, h);
-
-        return new ShortComponentRaster(sm, new Point(0, 0));
-    }
-
-    /**
-     * Creates a Raster with the same layout and the same
-     * width and height, and with new zeroed data arrays.  If
-     * the Raster is a subRaster, this will call
-     * createCompatibleRaster(width, height).
-     */
-    public WritableRaster createCompatibleWritableRaster() {
-        return createCompatibleWritableRaster(width,height);
-    }
-
-    /**
-     * Verify that the layout parameters are consistent with
-     * the data.  If strictCheck
-     * is false, this method will check for ArrayIndexOutOfBounds conditions.  If
-     * strictCheck is true, this method will check for additional error
-     * conditions such as line wraparound (width of a line greater than
-     * the scanline stride).
-     * @return   String   Error string, if the layout is incompatible with
-     *                    the data.  Otherwise returns null.
-     */
-    private void verify (boolean strictCheck) {
-        // Make sure data for Raster is in a legal range
-        for (int i=0; i < dataOffsets.length; i++) {
-            if (dataOffsets[i] < 0) {
-                throw new RasterFormatException("Data offsets for band "+i+
-                                                "("+dataOffsets[i]+
-                                                ") must be >= 0");
-            }
-        }
-
-        int maxSize = 0;
-        int size;
-
-        for (int i=0; i < numDataElements; i++) {
-            size = (height-1)*scanlineStride + (width-1)*pixelStride +
-                dataOffsets[i];
-            if (size > maxSize) {
-                maxSize = size;
-            }
-        }
-        if (data.length < maxSize) {
-            throw new RasterFormatException("Data array too small (should be "+
-                                          maxSize+" )");
-        }
-    }
-
-    public String toString() {
-        return new String ("ShortComponentRaster: width = "+width
-                           +" height = " + height
-                           +" #numDataElements "+numDataElements);
-                           // +" xOff = "+xOffset+" yOff = "+yOffset);
-    }
-
-}
diff --git a/external/ikvm/openjdk/sun/font/StandardGlyphVector.java b/external/ikvm/openjdk/sun/font/StandardGlyphVector.java
index aec6572..fb3de31 100644
--- a/external/ikvm/openjdk/sun/font/StandardGlyphVector.java
+++ b/external/ikvm/openjdk/sun/font/StandardGlyphVector.java
@@ -94,8 +94,21 @@ public class StandardGlyphVector extends GlyphVector{
         this(font, getString(iter), frc);
     }
 
-    public StandardGlyphVector(Font font, int[] glyphs, FontRenderContext frc) {
-        throw new NotYetImplementedError();
+    public StandardGlyphVector( Font font, int[] glyphs, FontRenderContext frc ) {
+        this( font, glyphs2chars(glyphs), frc );
+    }
+    
+    /**
+     * Symmetric to {@link #getGlyphCodes(int, int, int[])}
+     * Currently there is no real mapping possible between the chars and the glyph IDs in the TTF file
+     */
+    private static char[] glyphs2chars( int[] glyphs ) {
+        int count = glyphs.length;
+        char[] text = new char[count];
+        for( int i = 0; i < count; ++i ) {
+            text[i] = (char)glyphs[i];
+        }
+        return text;
     }
 
     /////////////////////////////
diff --git a/external/ikvm/openjdk/sun/misc/IoTrace.java b/external/ikvm/openjdk/sun/misc/IoTrace.java
new file mode 100644
index 0000000..ab15ed1
--- /dev/null
+++ b/external/ikvm/openjdk/sun/misc/IoTrace.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.misc;
+
+import java.net.InetAddress;
+
+/**
+ * Utility class used to identify trace points for I/O calls.
+ * <p>
+ * To use this class, a diagnostic tool must redefine this class with a version
+ * that contains calls to the the diagnostic tool. This implementation will then
+ * receive callbacks when file and socket operations are performed. The reason
+ * for requiring a redefine of the class is to avoid any overhead caused by the
+ * instrumentation.
+ * <p>
+ * The xxBegin() methods return a "context". This can be any Object. This
+ * context will be passed to the corresponding xxEnd() method. This way, an
+ * implementation can correlate the beginning of an operation with the end.
+ * <p>
+ * It is possible for a xxEnd() method to be called with a null handle. This
+ * happens if tracing was started between the call to xxBegin() and xxEnd(), in
+ * which case xxBegin() would not have been called. It is the implementation's
+ * responsibility to not throw an exception in this case.
+ * <p>
+ * Only blocking I/O operations are identified with this facility.
+ * <p>
+ * <b>Warning</b>
+ * <p>
+ * These methods are called from sensitive points in the I/O subsystem. Great
+ * care must be taken to not interfere with ongoing operations or cause
+ * deadlocks. In particular:
+ * <ul>
+ * <li>Implementations must not throw exceptions since this will cause
+ * disruptions to the I/O operations.
+ * <li>Implementations must not do I/O operations since this will lead to an
+ * endless loop.
+ * <li>Since the hooks may be called while holding low-level locks in the I/O
+ * subsystem, implementations must be careful with synchronization or
+ * interaction with other threads to avoid deadlocks in the VM.
+ * </ul>
+ */
+public final class IoTrace {
+    private IoTrace() {
+    }
+
+    /**
+     * Called before data is read from a socket.
+     *
+     * @return a context object
+     */
+    public static Object socketReadBegin() {
+        return null;
+    }
+
+    /**
+     * Called after data is read from the socket.
+     *
+     * @param context
+     *            the context returned by the previous call to socketReadBegin()
+     * @param address
+     *            the remote address the socket is bound to
+     * @param port
+     *            the remote port the socket is bound to
+     * @param timeout
+     *            the SO_TIMEOUT value of the socket (in milliseconds) or 0 if
+     *            there is no timeout set
+     * @param bytesRead
+     *            the number of bytes read from the socket, 0 if there was an
+     *            error reading from the socket
+     */
+    public static void socketReadEnd(Object context, InetAddress address, int port,
+                                     int timeout, long bytesRead) {
+    }
+
+    /**
+     * Called before data is written to a socket.
+     *
+     * @return a context object
+     */
+    public static Object socketWriteBegin() {
+        return null;
+    }
+
+    /**
+     * Called after data is written to a socket.
+     *
+     * @param context
+     *            the context returned by the previous call to
+     *            socketWriteBegin()
+     * @param address
+     *            the remote address the socket is bound to
+     * @param port
+     *            the remote port the socket is bound to
+     * @param bytesWritten
+     *            the number of bytes written to the socket, 0 if there was an
+     *            error writing to the socket
+     */
+    public static void socketWriteEnd(Object context, InetAddress address, int port,
+                                      long bytesWritten) {
+    }
+
+    /**
+     * Called before data is read from a file.
+     *
+     * @param path
+     *            the path of the file
+     * @return a context object
+     */
+    public static Object fileReadBegin(String path) {
+        return null;
+    }
+
+    /**
+     * Called after data is read from a file.
+     *
+     * @param context
+     *            the context returned by the previous call to fileReadBegin()
+     * @param bytesRead
+     *            the number of bytes written to the file, 0 if there was an
+     *            error writing to the file
+     */
+    public static void fileReadEnd(Object context, long bytesRead) {
+    }
+
+    /**
+     * Called before data is written to a file.
+     *
+     * @param path
+     *            the path of the file
+     * @return a context object
+     */
+    public static Object fileWriteBegin(String path) {
+        return null;
+    }
+
+    /**
+     * Called after data is written to a file.
+     *
+     * @param context
+     *            the context returned by the previous call to fileReadBegin()
+     * @param bytesWritten
+     *            the number of bytes written to the file, 0 if there was an
+     *            error writing to the file
+     */
+    public static void fileWriteEnd(Object context, long bytesWritten) {
+    }
+}
diff --git a/external/ikvm/openjdk/sun/misc/JavaAWTAccess.java b/external/ikvm/openjdk/sun/misc/JavaAWTAccess.java
new file mode 100644
index 0000000..462eb9a
--- /dev/null
+++ b/external/ikvm/openjdk/sun/misc/JavaAWTAccess.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.misc;
+
+public interface JavaAWTAccess {
+    public Object getContext();
+    public Object getExecutionContext();
+
+    public Object get(Object context, Object key);
+    public void put(Object context, Object key, Object value);
+    public void remove(Object context, Object key);
+
+    // convenience methods whose context is the object returned by getContext()
+    public Object get(Object key);
+    public void put(Object key, Object value);
+    public void remove(Object key);
+    public boolean isDisposed();
+    public boolean isMainAppContext();
+}
diff --git a/external/ikvm/openjdk/sun/misc/SharedSecrets.java b/external/ikvm/openjdk/sun/misc/SharedSecrets.java
index af2174c..172c4c5 100644
--- a/external/ikvm/openjdk/sun/misc/SharedSecrets.java
+++ b/external/ikvm/openjdk/sun/misc/SharedSecrets.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -52,6 +52,7 @@ public class SharedSecrets {
     private static JavaSecurityProtectionDomainAccess javaSecurityProtectionDomainAccess;
     private static JavaSecurityAccess javaSecurityAccess;
     private static JavaxSecurityAuthKerberosAccess javaxSecurityAuthKerberosAccess;
+    private static JavaAWTAccess javaAWTAccess;
 
     public static JavaUtilJarAccess javaUtilJarAccess() {
         if (javaUtilJarAccess == null) {
@@ -146,4 +147,17 @@ public class SharedSecrets {
             unsafe.ensureClassInitialized(KeyTab.class);
         return javaxSecurityAuthKerberosAccess;
     }
+
+    public static void setJavaAWTAccess(JavaAWTAccess jaa) {
+        javaAWTAccess = jaa;
+    }
+
+    public static JavaAWTAccess getJavaAWTAccess() {
+        // this may return null in which case calling code needs to
+        // provision for.
+        if (javaAWTAccess == null || javaAWTAccess.getContext() == null) {
+            return null;
+        }
+        return javaAWTAccess;
+    }
 }
diff --git a/external/ikvm/openjdk/sun/misc/Unsafe.java b/external/ikvm/openjdk/sun/misc/Unsafe.java
index 104b4c0..748e3b0 100644
--- a/external/ikvm/openjdk/sun/misc/Unsafe.java
+++ b/external/ikvm/openjdk/sun/misc/Unsafe.java
@@ -46,7 +46,7 @@ public final class Unsafe
 
     private Unsafe() { }
 
-    @ikvm.internal.HasCallerID
+    @sun.reflect.CallerSensitive
     public static Unsafe getUnsafe()
     {
         if(ikvm.internal.CallerID.getCallerID().getCallerClassLoader() != null)
diff --git a/external/ikvm/openjdk/sun/nio/ch/DatagramChannelImpl.java b/external/ikvm/openjdk/sun/nio/ch/DatagramChannelImpl.java
index b263153..08cc5c9 100644
--- a/external/ikvm/openjdk/sun/nio/ch/DatagramChannelImpl.java
+++ b/external/ikvm/openjdk/sun/nio/ch/DatagramChannelImpl.java
@@ -86,8 +86,8 @@ class DatagramChannelImpl
     private int state = ST_UNINITIALIZED;
 
     // Binding
-    private SocketAddress localAddress;
-    private SocketAddress remoteAddress;
+    private InetSocketAddress localAddress;
+    private InetSocketAddress remoteAddress;
 
     // Our socket adaptor, if any
     private DatagramSocket socket;
@@ -95,6 +95,12 @@ class DatagramChannelImpl
     // Multicast support
     private MembershipRegistry registry;
 
+    // set true when socket is bound and SO_REUSEADDRESS is emulated
+    private boolean reuseAddressEmulated;
+
+    // set true/false when socket is already bound and SO_REUSEADDR is emulated
+    private boolean isReuseAddress;
+
     // -- End of fields protected by stateLock
 
 
@@ -163,7 +169,7 @@ class DatagramChannelImpl
         synchronized (stateLock) {
             if (!isOpen())
                 throw new ClosedChannelException();
-            return localAddress;
+            return Net.getRevealedLocalAddress(localAddress);
         }
     }
 
@@ -223,6 +229,12 @@ class DatagramChannelImpl
                 }
                 return this;
             }
+            if (name == StandardSocketOptions.SO_REUSEADDR &&
+                    Net.useExclusiveBind() && localAddress != null)
+            {
+                reuseAddressEmulated = true;
+                this.isReuseAddress = (Boolean)value;
+            }
 
             // remaining options don't need any special handling
             Net.setSocketOption(fd, Net.UNSPEC, name, value);
@@ -281,6 +293,12 @@ class DatagramChannelImpl
                 }
             }
 
+            if (name == StandardSocketOptions.SO_REUSEADDR &&
+                    reuseAddressEmulated)
+            {
+                return (T)Boolean.valueOf(isReuseAddress);
+            }
+
             // no special handling
             return (T) Net.getSocketOption(fd, Net.UNSPEC, name);
         }
@@ -416,7 +434,7 @@ class DatagramChannelImpl
 
         synchronized (writeLock) {
             ensureOpen();
-            InetSocketAddress isa = (InetSocketAddress)target;
+            InetSocketAddress isa = Net.checkAddress(target);
             InetAddress ia = isa.getAddress();
             if (ia == null)
                 throw new IOException("Target address not resolved");
@@ -427,9 +445,9 @@ class DatagramChannelImpl
                     SecurityManager sm = System.getSecurityManager();
                     if (sm != null) {
                         if (ia.isMulticastAddress()) {
-                            sm.checkMulticast(isa.getAddress());
+                            sm.checkMulticast(ia);
                         } else {
-                            sm.checkConnect(isa.getAddress().getHostAddress(),
+                            sm.checkConnect(ia.getHostAddress(),
                                             isa.getPort());
                         }
                     }
@@ -449,7 +467,7 @@ class DatagramChannelImpl
                     return 0;
                 writerThread = NativeThread.current();
                 do {
-                    n = send(fd, src, target);
+                    n = send(fd, src, isa);
                 } while ((n == IOStatus.INTERRUPTED) && isOpen());
 
                 synchronized (stateLock) {
@@ -466,7 +484,7 @@ class DatagramChannelImpl
         }
     }
 
-    private int send(FileDescriptor fd, ByteBuffer src, SocketAddress target)
+    private int send(FileDescriptor fd, ByteBuffer src, InetSocketAddress target)
         throws IOException
     {
         if (src.hasArray())
@@ -496,7 +514,7 @@ class DatagramChannelImpl
     }
 
     private int sendFromManagedBuffer(FileDescriptor fd, ByteBuffer bb,
-                                            SocketAddress target)
+                                     InetSocketAddress target)
         throws IOException
     {
         int pos = bb.position();
@@ -508,7 +526,7 @@ class DatagramChannelImpl
         int written;
         try {
             written = send0(preferIPv6, fd, bb.array(), bb.arrayOffset() + pos,
-                            rem, target);
+                            rem, target.getAddress(), target.getPort());
         } catch (PortUnreachableException pue) {
             if (isConnected())
                 throw pue;
@@ -700,6 +718,7 @@ class DatagramChannelImpl
         }
     }
 
+    @Override
     public DatagramChannel connect(SocketAddress sa) throws IOException {
         int localPort = 0;
 
@@ -721,7 +740,7 @@ class DatagramChannelImpl
 
                     // Connection succeeded; disallow further invocation
                     state = ST_CONNECTED;
-                    remoteAddress = sa;
+                    remoteAddress = isa;
                     sender = isa;
                     cachedSenderInetAddress = isa.getAddress();
                     cachedSenderPort = isa.getPort();
@@ -740,12 +759,13 @@ class DatagramChannelImpl
                 synchronized (stateLock) {
                     if (!isConnected() || !isOpen())
                         return this;
-                    InetSocketAddress isa = (InetSocketAddress)remoteAddress;
+                    InetSocketAddress isa = remoteAddress;
                     SecurityManager sm = System.getSecurityManager();
                     if (sm != null)
                         sm.checkConnect(isa.getAddress().getHostAddress(),
                                         isa.getPort());
-                    disconnect0(fd);
+                    boolean isIPv6 = (family == StandardProtocolFamily.INET6);
+                    disconnect0(fd, isIPv6);
                     remoteAddress = null;
                     state = ST_UNCONNECTED;
 
@@ -1074,15 +1094,15 @@ class DatagramChannelImpl
 
     private static native void initIDs();
 
-    private static native void disconnect0(FileDescriptor fd)
+    private static native void disconnect0(FileDescriptor fd, boolean isIPv6)
         throws IOException;
 
     private native int receive0(FileDescriptor fd, byte[] buf, int pos, int len,
                                 boolean connected)
         throws IOException;
 
-    private native int send0(boolean preferIPv6, FileDescriptor fd, byte[] buf, int pos, int len,
-                             SocketAddress sa)
+    private native int send0(boolean preferIPv6, FileDescriptor fd, byte[] buf, int pos,
+                             int len, InetAddress addr, int port)
         throws IOException;
 
     static {
diff --git a/external/ikvm/openjdk/sun/nio/ch/FileChannelImpl.java b/external/ikvm/openjdk/sun/nio/ch/FileChannelImpl.java
index 160e1f5..902509b 100644
--- a/external/ikvm/openjdk/sun/nio/ch/FileChannelImpl.java
+++ b/external/ikvm/openjdk/sun/nio/ch/FileChannelImpl.java
@@ -29,8 +29,6 @@ import cli.Microsoft.Win32.SafeHandles.SafeFileHandle;
 import cli.System.IntPtr;
 import cli.System.IO.FileStream;
 import cli.System.Runtime.InteropServices.DllImportAttribute;
-import cli.System.Runtime.InteropServices.StructLayoutAttribute;
-import cli.System.Runtime.InteropServices.LayoutKind;
 import java.io.FileDescriptor;
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -40,6 +38,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.security.AccessController;
 import sun.misc.Cleaner;
+import sun.misc.IoTrace;
 import sun.security.action.GetPropertyAction;
 
 public class FileChannelImpl
@@ -64,13 +63,16 @@ public class FileChannelImpl
     // Required to prevent finalization of creating stream (immutable)
     private final Object parent;
 
+    // The path of the referenced file (null if the parent stream is created with a file descriptor)
+    private final String path;
+
     // Thread-safe set of IDs of native threads, for signalling
     private final NativeThreadSet threads = new NativeThreadSet(2);
 
     // Lock for operations involving position and size
     private final Object positionLock = new Object();
 
-    private FileChannelImpl(FileDescriptor fd, boolean readable,
+    private FileChannelImpl(FileDescriptor fd, String path, boolean readable,
                             boolean writable, boolean append, Object parent)
     {
         this.fd = fd;
@@ -78,23 +80,24 @@ public class FileChannelImpl
         this.writable = writable;
         this.append = append;
         this.parent = parent;
+        this.path = path;
         this.nd = new FileDispatcherImpl(append);
     }
 
     // Used by FileInputStream.getChannel() and RandomAccessFile.getChannel()
-    public static FileChannel open(FileDescriptor fd,
+    public static FileChannel open(FileDescriptor fd, String path,
                                    boolean readable, boolean writable,
                                    Object parent)
     {
-        return new FileChannelImpl(fd, readable, writable, false, parent);
+        return new FileChannelImpl(fd, path, readable, writable, false, parent);
     }
 
     // Used by FileOutputStream.getChannel
-    public static FileChannel open(FileDescriptor fd,
+    public static FileChannel open(FileDescriptor fd, String path,
                                    boolean readable, boolean writable,
                                    boolean append, Object parent)
     {
-        return new FileChannelImpl(fd, readable, writable, append, parent);
+        return new FileChannelImpl(fd, path, readable, writable, append, parent);
     }
 
     private void ensureOpen() throws IOException {
@@ -142,6 +145,7 @@ public class FileChannelImpl
         synchronized (positionLock) {
             int n = 0;
             int ti = -1;
+            Object traceContext = IoTrace.fileReadBegin(path);
             try {
                 begin();
                 ti = threads.add();
@@ -153,6 +157,7 @@ public class FileChannelImpl
                 return IOStatus.normalize(n);
             } finally {
                 threads.remove(ti);
+                IoTrace.fileReadEnd(traceContext, n > 0 ? n : 0);
                 end(n > 0);
                 assert IOStatus.check(n);
             }
@@ -170,6 +175,7 @@ public class FileChannelImpl
         synchronized (positionLock) {
             long n = 0;
             int ti = -1;
+            Object traceContext = IoTrace.fileReadBegin(path);
             try {
                 begin();
                 ti = threads.add();
@@ -181,6 +187,7 @@ public class FileChannelImpl
                 return IOStatus.normalize(n);
             } finally {
                 threads.remove(ti);
+                IoTrace.fileReadEnd(traceContext, n > 0 ? n : 0);
                 end(n > 0);
                 assert IOStatus.check(n);
             }
@@ -194,6 +201,7 @@ public class FileChannelImpl
         synchronized (positionLock) {
             int n = 0;
             int ti = -1;
+            Object traceContext = IoTrace.fileWriteBegin(path);
             try {
                 begin();
                 ti = threads.add();
@@ -206,6 +214,7 @@ public class FileChannelImpl
             } finally {
                 threads.remove(ti);
                 end(n > 0);
+                IoTrace.fileWriteEnd(traceContext, n > 0 ? n : 0);
                 assert IOStatus.check(n);
             }
         }
@@ -222,6 +231,7 @@ public class FileChannelImpl
         synchronized (positionLock) {
             long n = 0;
             int ti = -1;
+            Object traceContext = IoTrace.fileWriteBegin(path);
             try {
                 begin();
                 ti = threads.add();
@@ -233,6 +243,7 @@ public class FileChannelImpl
                 return IOStatus.normalize(n);
             } finally {
                 threads.remove(ti);
+                IoTrace.fileWriteEnd(traceContext, n > 0 ? n : 0);
                 end(n > 0);
                 assert IOStatus.check(n);
             }
@@ -513,6 +524,7 @@ public class FileChannelImpl
         ensureOpen();
         int n = 0;
         int ti = -1;
+        Object traceContext = IoTrace.fileReadBegin(path);
         try {
             begin();
             ti = threads.add();
@@ -524,6 +536,7 @@ public class FileChannelImpl
             return IOStatus.normalize(n);
         } finally {
             threads.remove(ti);
+            IoTrace.fileReadEnd(traceContext, n > 0 ? n : 0);
             end(n > 0);
             assert IOStatus.check(n);
         }
@@ -539,6 +552,7 @@ public class FileChannelImpl
         ensureOpen();
         int n = 0;
         int ti = -1;
+        Object traceContext = IoTrace.fileWriteBegin(path);
         try {
             begin();
             ti = threads.add();
@@ -551,6 +565,7 @@ public class FileChannelImpl
         } finally {
             threads.remove(ti);
             end(n > 0);
+            IoTrace.fileWriteEnd(traceContext, n > 0 ? n : 0);
             assert IOStatus.check(n);
         }
     }
diff --git a/external/ikvm/openjdk/sun/nio/ch/Net.java b/external/ikvm/openjdk/sun/nio/ch/Net.java
index 71ae543..d9ab0f0 100644
--- a/external/ikvm/openjdk/sun/nio/ch/Net.java
+++ b/external/ikvm/openjdk/sun/nio/ch/Net.java
@@ -31,6 +31,7 @@ import java.nio.channels.*;
 import java.util.*;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.security.PrivilegedExceptionAction;
 
 
 class Net {                                             // package-private
@@ -44,6 +45,40 @@ class Net {                                             // package-private
         }
     };
 
+    // Value of jdk.net.revealLocalAddress
+    private static boolean revealLocalAddress;
+
+    // True if jdk.net.revealLocalAddress had been read
+    private static volatile boolean propRevealLocalAddress;
+
+    // set to true if exclusive binding is on for Windows
+    private static final boolean exclusiveBind;
+
+    static {
+        int availLevel = isExclusiveBindAvailable();
+        if (availLevel >= 0) {
+            String exclBindProp =
+                java.security.AccessController.doPrivileged(
+                      new PrivilegedAction<String>() {
+                          @Override
+                        public String run() {
+                            return System.getProperty(
+                                    "sun.net.useExclusiveBind");
+                        }
+                    });
+            if (exclBindProp != null) {
+                exclusiveBind = exclBindProp.length() == 0 ?
+                        true : Boolean.parseBoolean(exclBindProp);
+            } else if (availLevel == 1) {
+                exclusiveBind = true;
+            } else {
+                exclusiveBind = false;
+            }
+        } else {
+            exclusiveBind = false;
+        }
+    }
+
     // -- Miscellaneous utilities --
 
     private static volatile boolean checkedIPv6 = false;
@@ -61,6 +96,13 @@ class Net {                                             // package-private
     }
 
     /**
+     * Returns true if exclusive binding is on
+     */
+    static boolean useExclusiveBind() {
+        return exclusiveBind;
+    }
+
+    /**
      * Tells whether IPv6 sockets can join IPv4 multicast groups
      */
     static boolean canIPv6SocketJoinIPv4Group() {
@@ -148,6 +190,58 @@ class Net {                                             // package-private
     }
 
     /**
+     * Returns the local address after performing a SecurityManager#checkConnect.
+     */
+    static InetSocketAddress getRevealedLocalAddress(InetSocketAddress addr) {
+        SecurityManager sm = System.getSecurityManager();
+        if (addr == null || sm == null)
+            return addr;
+
+        if (!getRevealLocalAddress()) {
+            // Return loopback address only if security check fails
+            try{
+                sm.checkConnect(addr.getAddress().getHostAddress(), -1);
+                //Security check passed
+            } catch (SecurityException e) {
+                //Return loopback address
+                addr = getLoopbackAddress(addr.getPort());
+            }
+        }
+        return addr;
+    }
+
+    static String getRevealedLocalAddressAsString(InetSocketAddress addr) {
+        if (!getRevealLocalAddress() && System.getSecurityManager() != null)
+            addr = getLoopbackAddress(addr.getPort());
+        return addr.toString();
+    }
+
+    private static boolean getRevealLocalAddress() {
+        if (!propRevealLocalAddress) {
+            try {
+                revealLocalAddress = Boolean.parseBoolean(
+                      AccessController.doPrivileged(
+                          new PrivilegedExceptionAction<String>() {
+                              public String run() {
+                                  return System.getProperty(
+                                      "jdk.net.revealLocalAddress");
+                              }
+                          }));
+
+            } catch (Exception e) {
+                // revealLocalAddress is false
+            }
+            propRevealLocalAddress = true;
+        }
+        return revealLocalAddress;
+    }
+
+    private static InetSocketAddress getLoopbackAddress(int port) {
+        return new InetSocketAddress(InetAddress.getLoopbackAddress(),
+                                     port);
+    }
+
+    /**
      * Returns any IPv4 address of the given network interface, or
      * null if the interface does not have any IPv4 addresses.
      */
@@ -308,6 +402,12 @@ class Net {                                             // package-private
 
     private static native boolean isIPv6Available0();
 
+    /*
+     * Returns 1 for Windows versions that support exclusive binding by default, 0
+     * for those that do not, and -1 for Solaris/Linux/Mac OS
+     */
+    private static native int isExclusiveBindAvailable();
+
     private static native boolean canIPv6SocketJoinIPv4Group0();
 
     private static native boolean canJoin6WithIPv4Group0();
@@ -341,11 +441,12 @@ class Net {                                             // package-private
     {
         boolean preferIPv6 = isIPv6Available() &&
             (family != StandardProtocolFamily.INET);
-        bind0(preferIPv6, fd, addr, port);
+        bind0(fd, preferIPv6, exclusiveBind, addr, port);
     }
 
-    private static native void bind0(boolean preferIPv6, FileDescriptor fd,
-                                     InetAddress addr, int port)
+    private static native void bind0(FileDescriptor fd, boolean preferIPv6,
+                                     boolean useExclBind, InetAddress addr,
+                                     int port)
         throws IOException;
 
     static native void listen(FileDescriptor fd, int backlog) throws IOException;
diff --git a/external/ikvm/openjdk/sun/nio/fs/NetFileSystemProvider.java b/external/ikvm/openjdk/sun/nio/fs/NetFileSystemProvider.java
index e7b7e14..3c569b1 100644
--- a/external/ikvm/openjdk/sun/nio/fs/NetFileSystemProvider.java
+++ b/external/ikvm/openjdk/sun/nio/fs/NetFileSystemProvider.java
@@ -338,7 +338,7 @@ final class NetFileSystemProvider extends AbstractFileSystemProvider
             }
         }
 
-        return FileChannelImpl.open(open(npath.path, mode, rights, share, options), read, write, append, null);
+        return FileChannelImpl.open(open(npath.path, mode, rights, share, options), npath.path, read, write, append, null);
     }
 
     private static FileDescriptor open(String path, int mode, int rights, int share, int options) throws IOException
diff --git a/external/ikvm/openjdk/sun/reflect/CallerSensitive.java b/external/ikvm/openjdk/sun/reflect/CallerSensitive.java
new file mode 100644
index 0000000..b238baa
--- /dev/null
+++ b/external/ikvm/openjdk/sun/reflect/CallerSensitive.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.reflect;
+
+import java.lang.annotation.*;
+import static java.lang.annotation.ElementType.*;
+
+/**
+ * A method annotated @CallerSensitive is sensitive to its calling class,
+ * via {@link sun.reflect.Reflection#getCallerClass Reflection.getCallerClass},
+ * or via some equivalent.
+ *
+ * @author John R. Rose
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({METHOD})
+public @interface CallerSensitive {
+}
diff --git a/external/ikvm/openjdk/sun/reflect/Reflection.java b/external/ikvm/openjdk/sun/reflect/Reflection.java
index 5d237a6..6cff574 100644
--- a/external/ikvm/openjdk/sun/reflect/Reflection.java
+++ b/external/ikvm/openjdk/sun/reflect/Reflection.java
@@ -63,6 +63,14 @@ public class Reflection {
         methodFilterMap.put(sun.misc.Unsafe.class, new String[] {"getUnsafe"});
     }
 
+    /** Returns the class of the caller of the method calling this method,
+        ignoring frames associated with java.lang.reflect.Method.invoke()
+        and its implementation. */
+    @CallerSensitive
+    public static Class getCallerClass() {
+	return getCallerClass(2);
+    }
+
     /** Returns the class of the method <code>realFramesToSkip</code>
         frames up the stack (zero-based), ignoring frames associated
         with java.lang.reflect.Method.invoke() and its implementation.
@@ -72,6 +80,7 @@ public class Reflection {
         java.lang.reflect.Method.invoke() and its implementation are
         completely ignored and do not count toward the number of "real"
         frames skipped. */
+    @CallerSensitive
     public static native Class getCallerClass(int realFramesToSkip);
 
     /** Retrieves the access flags written to the class file. For
diff --git a/external/ikvm/openjdk/sun/reflect/misc/ReflectUtil.java b/external/ikvm/openjdk/sun/reflect/misc/ReflectUtil.java
new file mode 100644
index 0000000..81468c2
--- /dev/null
+++ b/external/ikvm/openjdk/sun/reflect/misc/ReflectUtil.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 2005, 2013 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+package sun.reflect.misc;
+
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Proxy;
+import sun.reflect.Reflection;
+
+public final class ReflectUtil {
+
+    private ReflectUtil() {
+    }
+
+    public static Class forName(String name)
+        throws ClassNotFoundException {
+        checkPackageAccess(name);
+        return Class.forName(name);
+    }
+
+    public static Object newInstance(Class cls)
+        throws InstantiationException, IllegalAccessException {
+        checkPackageAccess(cls);
+        return cls.newInstance();
+    }
+
+    /*
+     * Reflection.ensureMemberAccess is overly-restrictive
+     * due to a bug. We awkwardly work around it for now.
+     */
+    public static void ensureMemberAccess(Class currentClass,
+                                          Class memberClass,
+                                          Object target,
+                                          int modifiers)
+        throws IllegalAccessException
+    {
+        if (target == null && Modifier.isProtected(modifiers)) {
+            int mods = modifiers;
+            mods = mods & (~Modifier.PROTECTED);
+            mods = mods | Modifier.PUBLIC;
+
+            /*
+             * See if we fail because of class modifiers
+             */
+            Reflection.ensureMemberAccess(currentClass,
+                                          memberClass,
+                                          target,
+                                          mods);
+            try {
+                /*
+                 * We're still here so class access was ok.
+                 * Now try with default field access.
+                 */
+                mods = mods & (~Modifier.PUBLIC);
+                Reflection.ensureMemberAccess(currentClass,
+                                              memberClass,
+                                              target,
+                                              mods);
+                /*
+                 * We're still here so access is ok without
+                 * checking for protected.
+                 */
+                return;
+            } catch (IllegalAccessException e) {
+                /*
+                 * Access failed but we're 'protected' so
+                 * if the test below succeeds then we're ok.
+                 */
+                if (isSubclassOf(currentClass, memberClass)) {
+                    return;
+                } else {
+                    throw e;
+                }
+            }
+        } else {
+            Reflection.ensureMemberAccess(currentClass,
+                                          memberClass,
+                                          target,
+                                          modifiers);
+        }
+    }
+
+    private static boolean isSubclassOf(Class queryClass,
+                                Class ofClass)
+    {
+        while (queryClass != null) {
+            if (queryClass == ofClass) {
+                return true;
+            }
+            queryClass = queryClass.getSuperclass();
+        }
+        return false;
+    }
+
+
+    /**
+     * Checks package access on the given class.
+     *
+     * If it is a {@link Proxy#isProxyClass(java.lang.Class)} that implements
+     * a non-public interface (i.e. may be in a non-restricted package),
+     * also check the package access on the proxy interfaces.
+     */
+    public static void checkPackageAccess(Class<?> clazz) {
+        checkPackageAccess(clazz.getName());
+        if (isNonPublicProxyClass(clazz)) {
+            checkProxyPackageAccess(clazz);
+        }
+    }
+
+    /**
+     * Checks package access on the given classname.
+     * This method is typically called when the Class instance is not
+     * available and the caller attempts to load a class on behalf
+     * the true caller (application).
+     */
+    public static void checkPackageAccess(String name) {
+        SecurityManager s = System.getSecurityManager();
+        if (s != null) {
+            String cname = name.replace('/', '.');
+            if (cname.startsWith("[")) {
+                int b = cname.lastIndexOf('[') + 2;
+                if (b > 1 && b < cname.length()) {
+                    cname = cname.substring(b);
+                }
+            }
+            int i = cname.lastIndexOf('.');
+            if (i != -1) {
+                s.checkPackageAccess(cname.substring(0, i));
+            }
+        }
+    }
+
+    public static boolean isPackageAccessible(Class clazz) {
+        try {
+            checkPackageAccess(clazz);
+        } catch (SecurityException e) {
+            return false;
+        }
+        return true;
+    }
+
+    // Returns true if p is an ancestor of cl i.e. class loader 'p' can
+    // be found in the cl's delegation chain
+    private static boolean isAncestor(ClassLoader p, ClassLoader cl) {
+        ClassLoader acl = cl;
+        do {
+            acl = acl.getParent();
+            if (p == acl) {
+                return true;
+            }
+        } while (acl != null);
+        return false;
+    }
+
+    /**
+     * Returns true if package access check is needed for reflective
+     * access from a class loader 'from' to classes or members in
+     * a class defined by class loader 'to'.  This method returns true
+     * if 'from' is not the same as or an ancestor of 'to'.  All code
+     * in a system domain are granted with all permission and so this
+     * method returns false if 'from' class loader is a class loader
+     * loading system classes.  On the other hand, if a class loader
+     * attempts to access system domain classes, it requires package
+     * access check and this method will return true.
+     */
+    public static boolean needsPackageAccessCheck(ClassLoader from, ClassLoader to) {
+        if (from == null || from == to)
+            return false;
+
+        if (to == null)
+            return true;
+
+        return !isAncestor(from, to);
+    }
+
+    /**
+     * Check package access on the proxy interfaces that the given proxy class
+     * implements.
+     *
+     * @param clazz Proxy class object
+     */
+    public static void checkProxyPackageAccess(Class<?> clazz) {
+        SecurityManager s = System.getSecurityManager();
+        if (s != null) {
+            // check proxy interfaces if the given class is a proxy class
+            if (Proxy.isProxyClass(clazz)) {
+                for (Class<?> intf : clazz.getInterfaces()) {
+                    checkPackageAccess(intf);
+                }
+            }
+        }
+    }
+
+    /**
+     * Access check on the interfaces that a proxy class implements and throw
+     * {@code SecurityException} if it accesses a restricted package from
+     * the caller's class loader.
+     *
+     * @param ccl the caller's class loader
+     * @param interfaces the list of interfaces that a proxy class implements
+     */
+    public static void checkProxyPackageAccess(ClassLoader ccl,
+                                               Class<?>... interfaces)
+    {
+        SecurityManager sm = System.getSecurityManager();
+        if (sm != null) {
+            for (Class<?> intf : interfaces) {
+                ClassLoader cl = intf.getClassLoader();
+                if (needsPackageAccessCheck(ccl, cl)) {
+                    checkPackageAccess(intf);
+                }
+            }
+        }
+    }
+
+    public static final String PROXY_PACKAGE = "com.sun.proxy";
+
+    /**
+     * Test if the given class is a proxy class that implements
+     * non-public interface.  Such proxy class may be in a non-restricted
+     * package that bypasses checkPackageAccess.
+     */
+    public static boolean isNonPublicProxyClass(Class<?> cls) {
+        String name = cls.getName();
+        int i = name.lastIndexOf('.');
+        String pkg = (i != -1) ? name.substring(0, i) : "";
+        return Proxy.isProxyClass(cls) && !pkg.equals(PROXY_PACKAGE);
+    }
+}
diff --git a/external/ikvm/reflect/AssemblyName.cs b/external/ikvm/reflect/AssemblyName.cs
index beae6ad..f383d2b 100644
--- a/external/ikvm/reflect/AssemblyName.cs
+++ b/external/ikvm/reflect/AssemblyName.cs
@@ -42,7 +42,6 @@ namespace IKVM.Reflection
 		private AssemblyNameFlags flags;
 		private AssemblyHashAlgorithm hashAlgorithm;
 		private AssemblyVersionCompatibility versionCompatibility = AssemblyVersionCompatibility.SameMachine;
-		private ProcessorArchitecture processorArchitecture;
 		private string codeBase;
 		internal byte[] hash;
 
@@ -67,10 +66,14 @@ namespace IKVM.Reflection
 				case ParseAssemblyResult.DuplicateKey:
 					throw new FileLoadException();
 			}
+			if (!ParseVersion(parsed.Version, parsed.Retargetable.HasValue, out version))
+			{
+				throw new FileLoadException();
+			}
 			name = parsed.Name;
 			if (parsed.Culture != null)
 			{
-				if (parsed.Culture.Equals("neutral", StringComparison.InvariantCultureIgnoreCase))
+				if (parsed.Culture.Equals("neutral", StringComparison.OrdinalIgnoreCase))
 				{
 					culture = "";
 				}
@@ -83,14 +86,9 @@ namespace IKVM.Reflection
 					culture = new CultureInfo(parsed.Culture).Name;
 				}
 			}
-			if (parsed.Version != null && parsed.Version.Major != 65535 && parsed.Version.Minor != 65535)
-			{
-				// our Fusion parser returns -1 for build and revision for incomplete version numbers (and we want 65535)
-				version = new Version(parsed.Version.Major, parsed.Version.Minor, parsed.Version.Build & 0xFFFF, parsed.Version.Revision & 0xFFFF);
-			}
 			if (parsed.PublicKeyToken != null)
 			{
-				if (parsed.PublicKeyToken.Equals("null", StringComparison.InvariantCultureIgnoreCase))
+				if (parsed.PublicKeyToken.Equals("null", StringComparison.OrdinalIgnoreCase))
 				{
 					publicKeyToken = Empty<byte>.Array;
 				}
@@ -105,7 +103,7 @@ namespace IKVM.Reflection
 			}
 			if (parsed.Retargetable.HasValue)
 			{
-				if (parsed.Culture == null || parsed.PublicKeyToken == null || parsed.Version == null || parsed.Version.Build == -1 || parsed.Version.Revision == -1)
+				if (parsed.Culture == null || parsed.PublicKeyToken == null || version == null)
 				{
 					throw new FileLoadException();
 				}
@@ -214,12 +212,11 @@ namespace IKVM.Reflection
 
 		public ProcessorArchitecture ProcessorArchitecture
 		{
-			get { return processorArchitecture; }
+			get { return (ProcessorArchitecture)(((int)flags & 0x70) >> 4); }
 			set
 			{
 				if (value >= ProcessorArchitecture.None && value <= ProcessorArchitecture.Arm)
 				{
-					processorArchitecture = value;
 					flags = (flags & ~(AssemblyNameFlags)0x70) | (AssemblyNameFlags)((int)value << 4);
 				}
 			}
@@ -294,94 +291,107 @@ namespace IKVM.Reflection
 				{
 					return "";
 				}
-				StringBuilder sb = new StringBuilder();
-				bool doubleQuotes = name.StartsWith(" ") || name.EndsWith(" ") || name.IndexOf('\'') != -1;
-				bool singleQuotes = name.IndexOf('"') != -1;
-				if (singleQuotes)
-				{
-					sb.Append('\'');
-				}
-				else if (doubleQuotes)
-				{
-					sb.Append('"');
-				}
-				if (name.IndexOf(',') != -1 || name.IndexOf('\\') != -1 || name.IndexOf('=') != -1 || (singleQuotes && name.IndexOf('\'') != -1))
-				{
-					for (int i = 0; i < name.Length; i++)
-					{
-						char c = name[i];
-						if (c == ',' || c == '\\' || c == '=' || (singleQuotes && c == '\''))
-						{
-							sb.Append('\\');
-						}
-						sb.Append(c);
-					}
-				}
-				else
-				{
-					sb.Append(name);
-				}
-				if (singleQuotes)
-				{
-					sb.Append('\'');
-				}
-				else if (doubleQuotes)
-				{
-					sb.Append('"');
-				}
+				ushort versionMajor = 0xFFFF;
+				ushort versionMinor = 0xFFFF;
+				ushort versionBuild = 0xFFFF;
+				ushort versionRevision = 0xFFFF;
 				if (version != null)
 				{
-					if ((version.Major & 0xFFFF) != 0xFFFF)
-					{
-						sb.Append(", Version=").Append(version.Major & 0xFFFF);
-						if ((version.Minor & 0xFFFF) != 0xFFFF)
-						{
-							sb.Append('.').Append(version.Minor & 0xFFFF);
-							if ((version.Build & 0xFFFF) != 0xFFFF)
-							{
-								sb.Append('.').Append(version.Build & 0xFFFF);
-								if ((version.Revision & 0xFFFF) != 0xFFFF)
-								{
-									sb.Append('.').Append(version.Revision & 0xFFFF);
-								}
-							}
-						}
-					}
-				}
-				if (culture != null)
-				{
-					sb.Append(", Culture=").Append(culture == "" ? "neutral" : culture);
+					versionMajor = (ushort)version.Major;
+					versionMinor = (ushort)version.Minor;
+					versionBuild = (ushort)version.Build;
+					versionRevision = (ushort)version.Revision;
 				}
 				byte[] publicKeyToken = this.publicKeyToken;
 				if ((publicKeyToken == null || publicKeyToken.Length == 0) && publicKey != null)
 				{
 					publicKeyToken = ComputePublicKeyToken(publicKey);
 				}
-				if (publicKeyToken != null)
+				return GetFullName(name, versionMajor, versionMinor, versionBuild, versionRevision, culture, publicKeyToken, (int)flags);
+			}
+		}
+
+		internal static string GetFullName(string name, ushort versionMajor, ushort versionMinor, ushort versionBuild, ushort versionRevision, string culture, byte[] publicKeyToken, int flags)
+		{
+			StringBuilder sb = new StringBuilder();
+			bool doubleQuotes = name.StartsWith(" ") || name.EndsWith(" ") || name.IndexOf('\'') != -1;
+			bool singleQuotes = name.IndexOf('"') != -1;
+			if (singleQuotes)
+			{
+				sb.Append('\'');
+			}
+			else if (doubleQuotes)
+			{
+				sb.Append('"');
+			}
+			if (name.IndexOf(',') != -1 || name.IndexOf('\\') != -1 || name.IndexOf('=') != -1 || (singleQuotes && name.IndexOf('\'') != -1))
+			{
+				for (int i = 0; i < name.Length; i++)
 				{
-					sb.Append(", PublicKeyToken=");
-					if (publicKeyToken.Length == 0)
+					char c = name[i];
+					if (c == ',' || c == '\\' || c == '=' || (singleQuotes && c == '\''))
 					{
-						sb.Append("null");
+						sb.Append('\\');
 					}
-					else
+					sb.Append(c);
+				}
+			}
+			else
+			{
+				sb.Append(name);
+			}
+			if (singleQuotes)
+			{
+				sb.Append('\'');
+			}
+			else if (doubleQuotes)
+			{
+				sb.Append('"');
+			}
+			if (versionMajor != 0xFFFF)
+			{
+				sb.Append(", Version=").Append(versionMajor);
+				if (versionMinor != 0xFFFF)
+				{
+					sb.Append('.').Append(versionMinor);
+					if (versionBuild != 0xFFFF)
 					{
-						AppendPublicKey(sb, publicKeyToken);
+						sb.Append('.').Append(versionBuild);
+						if (versionRevision != 0xFFFF)
+						{
+							sb.Append('.').Append(versionRevision);
+						}
 					}
 				}
-				if ((Flags & AssemblyNameFlags.Retargetable) != 0)
+			}
+			if (culture != null)
+			{
+				sb.Append(", Culture=").Append(culture == "" ? "neutral" : culture);
+			}
+			if (publicKeyToken != null)
+			{
+				sb.Append(", PublicKeyToken=");
+				if (publicKeyToken.Length == 0)
 				{
-					sb.Append(", Retargetable=Yes");
+					sb.Append("null");
 				}
-				if (ContentType == AssemblyContentType.WindowsRuntime)
+				else
 				{
-					sb.Append(", ContentType=WindowsRuntime");
+					AppendPublicKey(sb, publicKeyToken);
 				}
-				return sb.ToString();
 			}
+			if ((flags & (int)AssemblyNameFlags.Retargetable) != 0)
+			{
+				sb.Append(", Retargetable=Yes");
+			}
+			if ((AssemblyContentType)((flags & 0xE00) >> 9) == AssemblyContentType.WindowsRuntime)
+			{
+				sb.Append(", ContentType=WindowsRuntime");
+			}
+			return sb.ToString();
 		}
 
-		private static byte[] ComputePublicKeyToken(byte[] publicKey)
+		internal static byte[] ComputePublicKeyToken(byte[] publicKey)
 		{
 			if (publicKey.Length == 0)
 			{
@@ -449,7 +459,7 @@ namespace IKVM.Reflection
 				path = Path.GetFullPath(path);
 				using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
 				{
-					ModuleReader module = new ModuleReader(null, null, fs, path);
+					ModuleReader module = new ModuleReader(null, null, fs, path, false);
 					if (module.Assembly == null)
 					{
 						throw new BadImageFormatException("Module does not contain a manifest");
@@ -472,5 +482,50 @@ namespace IKVM.Reflection
 			get { return flags; }
 			set { flags = value; }
 		}
+
+		private static bool ParseVersion(string str, bool mustBeComplete, out Version version)
+		{
+			if (str == null)
+			{
+				version = null;
+				return true;
+			}
+			string[] parts = str.Split('.');
+			if (parts.Length < 2 || parts.Length > 4)
+			{
+				version = null;
+				ushort dummy;
+				// if the version consists of a single integer, it is invalid, but not invalid enough to fail the parse of the whole assembly name
+				return parts.Length == 1 && ushort.TryParse(parts[0], NumberStyles.Integer, null, out dummy);
+			}
+			if (parts[0] == "" || parts[1] == "")
+			{
+				// this is a strange scenario, the version is invalid, but not invalid enough to fail the parse of the whole assembly name
+				version = null;
+				return true;
+			}
+			ushort major, minor, build = 65535, revision = 65535;
+			if (ushort.TryParse(parts[0], NumberStyles.Integer, null, out major)
+				&& ushort.TryParse(parts[1], NumberStyles.Integer, null, out minor)
+				&& (parts.Length <= 2 || parts[2] == "" || ushort.TryParse(parts[2], NumberStyles.Integer, null, out build))
+				&& (parts.Length <= 3 || parts[3] == "" || (parts[2] != "" && ushort.TryParse(parts[3], NumberStyles.Integer, null, out revision))))
+			{
+				if (mustBeComplete && (parts.Length < 4 || parts[2] == "" || parts[3] == ""))
+				{
+					version = null;
+				}
+				else if (major == 65535 || minor == 65535)
+				{
+					version = null;
+				}
+				else
+				{
+					version = new Version(major, minor, build, revision);
+				}
+				return true;
+			}
+			version = null;
+			return false;
+		}
 	}
 }
diff --git a/external/ikvm/reflect/Binder.cs b/external/ikvm/reflect/Binder.cs
index a079451..ca12f6b 100644
--- a/external/ikvm/reflect/Binder.cs
+++ b/external/ikvm/reflect/Binder.cs
@@ -74,16 +74,11 @@ namespace IKVM.Reflection
 				return null;
 			}
 
-			if (matchCount == 1)
-			{
-				return match[0];
-			}
-
 			MethodBase bestMatch = match[0];
 			bool ambiguous = false;
 			for (int i = 1; i < matchCount; i++)
 			{
-				bestMatch = SelectBestMatch(bestMatch, match[i], types, ref ambiguous);
+				SelectBestMatch(match[i], types, ref bestMatch, ref ambiguous);
 			}
 			if (ambiguous)
 			{
@@ -112,32 +107,35 @@ namespace IKVM.Reflection
 			return true;
 		}
 
-		private static MethodBase SelectBestMatch(MethodBase mb1, MethodBase mb2, Type[] types, ref bool ambiguous)
+		private static void SelectBestMatch(MethodBase candidate, Type[] types, ref MethodBase currentBest, ref bool ambiguous)
 		{
-			switch (MatchSignatures(mb1.MethodSignature, mb2.MethodSignature, types))
+			switch (MatchSignatures(currentBest.MethodSignature, candidate.MethodSignature, types))
 			{
 				case 1:
-					return mb1;
+					return;
 				case 2:
-					return mb2;
+					ambiguous = false;
+					currentBest = candidate;
+					return;
 			}
 
-			if (mb1.MethodSignature.MatchParameterTypes(mb2.MethodSignature))
+			if (currentBest.MethodSignature.MatchParameterTypes(candidate.MethodSignature))
 			{
-				int depth1 = GetInheritanceDepth(mb1.DeclaringType);
-				int depth2 = GetInheritanceDepth(mb2.DeclaringType);
+				int depth1 = GetInheritanceDepth(currentBest.DeclaringType);
+				int depth2 = GetInheritanceDepth(candidate.DeclaringType);
 				if (depth1 > depth2)
 				{
-					return mb1;
+					return;
 				}
 				else if (depth1 < depth2)
 				{
-					return mb2;
+					ambiguous = false;
+					currentBest = candidate;
+					return;
 				}
 			}
 
 			ambiguous = true;
-			return mb1;
 		}
 
 		private static int GetInheritanceDepth(Type type)
diff --git a/external/ikvm/reflect/Emit/AssemblyBuilder.cs b/external/ikvm/reflect/Emit/AssemblyBuilder.cs
index 910a6db..7732c57 100644
--- a/external/ikvm/reflect/Emit/AssemblyBuilder.cs
+++ b/external/ikvm/reflect/Emit/AssemblyBuilder.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2008-2012 Jeroen Frijters
+  Copyright (C) 2008-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -49,9 +49,6 @@ namespace IKVM.Reflection.Emit
 		private StrongNameKeyPair keyPair;
 		private byte[] publicKey;
 		internal readonly string dir;
-		private readonly PermissionSet requiredPermissions;
-		private readonly PermissionSet optionalPermissions;
-		private readonly PermissionSet refusedPermissions;
 		private PEFileKinds fileKind = PEFileKinds.Dll;
 		private MethodInfo entryPoint;
 		private VersionInfo versionInfo;
@@ -66,7 +63,19 @@ namespace IKVM.Reflection.Emit
 		private readonly List<Module> addedModules = new List<Module>();
 		private readonly List<CustomAttributeBuilder> customAttributes = new List<CustomAttributeBuilder>();
 		private readonly List<CustomAttributeBuilder> declarativeSecurity = new List<CustomAttributeBuilder>();
-		private readonly List<Type> typeForwarders = new List<Type>();
+		private readonly List<TypeForwarder> typeForwarders = new List<TypeForwarder>();
+
+		struct TypeForwarder
+		{
+			internal readonly Type Type;
+			internal readonly bool IncludeNested;
+
+			internal TypeForwarder(Type type, bool includeNested)
+			{
+				this.Type = type;
+				this.IncludeNested = includeNested;
+			}
+		}
 
 		private struct ResourceFile
 		{
@@ -76,7 +85,7 @@ namespace IKVM.Reflection.Emit
 			internal ResourceWriter Writer;
 		}
 
-		internal AssemblyBuilder(Universe universe, AssemblyName name, string dir, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet refusedPermissions)
+		internal AssemblyBuilder(Universe universe, AssemblyName name, string dir, IEnumerable<CustomAttributeBuilder> customAttributes)
 			: base(universe)
 		{
 			this.name = name.Name;
@@ -105,9 +114,10 @@ namespace IKVM.Reflection.Emit
 				}
 			}
 			this.dir = dir ?? ".";
-			this.requiredPermissions = requiredPermissions;
-			this.optionalPermissions = optionalPermissions;
-			this.refusedPermissions = refusedPermissions;
+			if (customAttributes != null)
+			{
+				this.customAttributes.AddRange(customAttributes);
+			}
 			if (universe.HasMscorlib && !universe.Mscorlib.__IsMissing && universe.Mscorlib.ImageRuntimeVersion != null)
 			{
 				this.imageRuntimeVersion = universe.Mscorlib.ImageRuntimeVersion;
@@ -116,6 +126,7 @@ namespace IKVM.Reflection.Emit
 			{
 				this.imageRuntimeVersion = typeof(object).Assembly.ImageRuntimeVersion;
 			}
+			universe.RegisterDynamicAssembly(this);
 		}
 
 		private void SetVersionHelper(Version version)
@@ -266,7 +277,12 @@ namespace IKVM.Reflection.Emit
 
 		public void __AddTypeForwarder(Type type)
 		{
-			typeForwarders.Add(type);
+			__AddTypeForwarder(type, true);
+		}
+
+		public void __AddTypeForwarder(Type type, bool includeNested)
+		{
+			typeForwarders.Add(new TypeForwarder(type, includeNested));
 		}
 
 		public void SetEntryPoint(MethodInfo entryMethod)
@@ -344,26 +360,7 @@ namespace IKVM.Reflection.Emit
 			{
 				assemblyRecord.Culture = manifestModule.Strings.Add(culture);
 			}
-			int token = 0x20000000 + manifestModule.AssemblyTable.AddRecord(assemblyRecord);
-
-#pragma warning disable 618
-			// this values are obsolete, but we already know that so we disable the warning
-			System.Security.Permissions.SecurityAction requestMinimum = System.Security.Permissions.SecurityAction.RequestMinimum;
-			System.Security.Permissions.SecurityAction requestOptional = System.Security.Permissions.SecurityAction.RequestOptional;
-			System.Security.Permissions.SecurityAction requestRefuse = System.Security.Permissions.SecurityAction.RequestRefuse;
-#pragma warning restore 618
-			if (requiredPermissions != null)
-			{
-				manifestModule.AddDeclarativeSecurity(token, requestMinimum, requiredPermissions);
-			}
-			if (optionalPermissions != null)
-			{
-				manifestModule.AddDeclarativeSecurity(token, requestOptional, optionalPermissions);
-			}
-			if (refusedPermissions != null)
-			{
-				manifestModule.AddDeclarativeSecurity(token, requestRefuse, refusedPermissions);
-			}
+			manifestModule.AssemblyTable.AddRecord(assemblyRecord);
 
 			ResourceSection unmanagedResources = versionInfo != null || win32icon != null || win32manifest != null || win32resources != null
 				? new ResourceSection()
@@ -409,9 +406,9 @@ namespace IKVM.Reflection.Emit
 
 			manifestModule.AddDeclarativeSecurity(0x20000001, declarativeSecurity);
 
-			foreach (Type type in typeForwarders)
+			foreach (TypeForwarder fwd in typeForwarders)
 			{
-				manifestModule.AddTypeForwarder(type);
+				manifestModule.AddTypeForwarder(fwd.Type, fwd.IncludeNested);
 			}
 
 			foreach (ResourceFile resfile in resourceFiles)
@@ -703,14 +700,14 @@ namespace IKVM.Reflection.Emit
 		{
 			foreach (ModuleBuilder module in modules)
 			{
-				if (module.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase))
+				if (module.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
 				{
 					return module;
 				}
 			}
 			foreach (Module module in addedModules)
 			{
-				if (module.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase))
+				if (module.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
 				{
 					return module;
 				}
@@ -745,6 +742,16 @@ namespace IKVM.Reflection.Emit
 			get { return true; }
 		}
 
+		public static AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access)
+		{
+			return new Universe().DefineDynamicAssembly(name, access);
+		}
+
+		public static AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, IEnumerable<CustomAttributeBuilder> assemblyAttributes)
+		{
+			return new Universe().DefineDynamicAssembly(name, access, assemblyAttributes);
+		}
+
 		internal override IList<CustomAttributeData> GetCustomAttributesData(Type attributeType)
 		{
 			List<CustomAttributeData> list = new List<CustomAttributeData>();
diff --git a/external/ikvm/reflect/Emit/CustomAttributeBuilder.cs b/external/ikvm/reflect/Emit/CustomAttributeBuilder.cs
index 2b9708b..4a1a143 100644
--- a/external/ikvm/reflect/Emit/CustomAttributeBuilder.cs
+++ b/external/ikvm/reflect/Emit/CustomAttributeBuilder.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2008-2011 Jeroen Frijters
+  Copyright (C) 2008-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -32,6 +32,7 @@ namespace IKVM.Reflection.Emit
 {
 	public sealed class CustomAttributeBuilder
 	{
+		internal static readonly ConstructorInfo LegacyPermissionSet = new ConstructorBuilder(null);
 		private readonly ConstructorInfo con;
 		private readonly byte[] blob;
 		private readonly object[] constructorArgs;
@@ -460,11 +461,6 @@ namespace IKVM.Reflection.Emit
 			}
 		}
 
-		internal bool IsPseudoCustomAttribute
-		{
-			get { return con.DeclaringType.IsPseudoCustomAttribute; }
-		}
-
 		internal ConstructorInfo Constructor
 		{
 			get { return con; }
@@ -537,18 +533,31 @@ namespace IKVM.Reflection.Emit
 			return null;
 		}
 
-		internal string GetLegacyDeclSecurity()
+		internal bool IsLegacyDeclSecurity
 		{
-			if (con.DeclaringType == con.Module.universe.System_Security_Permissions_PermissionSetAttribute
-				&& blob == null
-				&& (namedFields == null || namedFields.Length == 0)
-				&& namedProperties != null
-				&& namedProperties.Length == 1
-				&& namedProperties[0].Name == "XML")
+			get
 			{
-				return propertyValues[0] as string;
+				return ReferenceEquals(con, LegacyPermissionSet)
+					|| (con.DeclaringType == con.Module.universe.System_Security_Permissions_PermissionSetAttribute
+						&& blob == null
+						&& (namedFields == null || namedFields.Length == 0)
+						&& namedProperties != null
+						&& namedProperties.Length == 1
+						&& namedProperties[0].Name == "XML"
+						&& propertyValues[0] is string);
+			}
+		}
+
+		internal int WriteLegacyDeclSecurityBlob(ModuleBuilder moduleBuilder)
+		{
+			if (blob != null)
+			{
+				return moduleBuilder.Blobs.Add(ByteBuffer.Wrap(blob));
+			}
+			else
+			{
+				return moduleBuilder.Blobs.Add(ByteBuffer.Wrap(Encoding.Unicode.GetBytes((string)propertyValues[0])));
 			}
-			return null;
 		}
 
 		internal void WriteNamedArgumentsForDeclSecurity(ModuleBuilder moduleBuilder, ByteBuffer bb)
diff --git a/external/ikvm/reflect/Emit/ExceptionHandler.cs b/external/ikvm/reflect/Emit/ExceptionHandler.cs
index 40837a9..013f925 100644
--- a/external/ikvm/reflect/Emit/ExceptionHandler.cs
+++ b/external/ikvm/reflect/Emit/ExceptionHandler.cs
@@ -100,7 +100,7 @@ namespace IKVM.Reflection.Emit
 		public override bool Equals(object obj)
 		{
 			ExceptionHandler? other = obj as ExceptionHandler?;
-			return other != null && Equals(other);
+			return other != null && Equals(other.Value);
 		}
 
 		public override int GetHashCode()
diff --git a/external/ikvm/reflect/Emit/ILGenerator.cs b/external/ikvm/reflect/Emit/ILGenerator.cs
index b7be3f3..d7bb690 100644
--- a/external/ikvm/reflect/Emit/ILGenerator.cs
+++ b/external/ikvm/reflect/Emit/ILGenerator.cs
@@ -794,8 +794,11 @@ namespace IKVM.Reflection.Emit
 		{
 			SignatureHelper sig = SignatureHelper.GetMethodSigHelper(moduleBuilder, callingConvention, returnType);
 			sig.AddArguments(parameterTypes, null, null);
-			sig.AddSentinel();
-			sig.AddArguments(optionalParameterTypes, null, null);
+			if (optionalParameterTypes != null && optionalParameterTypes.Length != 0)
+			{
+				sig.AddSentinel();
+				sig.AddArguments(optionalParameterTypes, null, null);
+			}
 			Emit(opc, sig);
 		}
 
diff --git a/external/ikvm/reflect/Emit/ModuleBuilder.cs b/external/ikvm/reflect/Emit/ModuleBuilder.cs
index 7e05892..7d86ca4 100644
--- a/external/ikvm/reflect/Emit/ModuleBuilder.cs
+++ b/external/ikvm/reflect/Emit/ModuleBuilder.cs
@@ -140,7 +140,7 @@ namespace IKVM.Reflection.Emit
 			public override bool Equals(object obj)
 			{
 				MemberRefKey? other = obj as MemberRefKey?;
-				return other != null && Equals(other);
+				return other != null && Equals(other.Value);
 			}
 
 			public override int GetHashCode()
@@ -180,7 +180,7 @@ namespace IKVM.Reflection.Emit
 			public override bool Equals(object obj)
 			{
 				MethodSpecKey? other = obj as MethodSpecKey?;
-				return other != null && Equals(other);
+				return other != null && Equals(other.Value);
 			}
 
 			public override int GetHashCode()
@@ -384,16 +384,16 @@ namespace IKVM.Reflection.Emit
 			moduleType.CreateType();
 		}
 
-		internal void AddTypeForwarder(Type type)
+		internal void AddTypeForwarder(Type type, bool includeNested)
 		{
 			ExportType(type);
-			if (!type.__IsMissing)
+			if (includeNested && !type.__IsMissing)
 			{
 				foreach (Type nested in type.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic))
 				{
 					// we export all nested types (i.e. even the private ones)
 					// (this behavior is the same as the C# compiler)
-					AddTypeForwarder(nested);
+					AddTypeForwarder(nested, true);
 				}
 			}
 		}
@@ -401,8 +401,11 @@ namespace IKVM.Reflection.Emit
 		private int ExportType(Type type)
 		{
 			ExportedTypeTable.Record rec = new ExportedTypeTable.Record();
-			// HACK we should *not* set the TypeDefId in this case, but 2.0 and 3.5 peverify gives a warning if it is missing (4.5 doesn't)
-			rec.TypeDefId = type.MetadataToken;
+			if (asm.ImageRuntimeVersion == "v2.0.50727")
+			{
+				// HACK we should *not* set the TypeDefId in this case, but 2.0 and 3.5 peverify gives a warning if it is missing (4.5 doesn't)
+				rec.TypeDefId = type.MetadataToken;
+			}
 			rec.TypeName = this.Strings.Add(type.__Name);
 			string ns = type.__Namespace;
 			rec.TypeNamespace = ns == null ? 0 : this.Strings.Add(ns);
@@ -431,7 +434,6 @@ namespace IKVM.Reflection.Emit
 
 		internal void SetCustomAttribute(int token, CustomAttributeBuilder customBuilder)
 		{
-			Debug.Assert(!customBuilder.IsPseudoCustomAttribute);
 			CustomAttributeTable.Record rec = new CustomAttributeTable.Record();
 			rec.Parent = token;
 			rec.Type = asm.IsWindowsRuntime ? customBuilder.Constructor.ImportTo(this) : GetConstructorToken(customBuilder.Constructor).Token;
@@ -439,16 +441,21 @@ namespace IKVM.Reflection.Emit
 			this.CustomAttribute.AddRecord(rec);
 		}
 
-		internal void AddDeclarativeSecurity(int token, System.Security.Permissions.SecurityAction securityAction, System.Security.PermissionSet permissionSet)
+		private void AddDeclSecurityRecord(int token, int action, int blob)
 		{
 			DeclSecurityTable.Record rec = new DeclSecurityTable.Record();
-			rec.Action = (short)securityAction;
+			rec.Action = (short)action;
 			rec.Parent = token;
-			// like Ref.Emit, we're using the .NET 1.x xml format
-			rec.PermissionSet = this.Blobs.Add(ByteBuffer.Wrap(System.Text.Encoding.Unicode.GetBytes(permissionSet.ToXml().ToString())));
+			rec.PermissionSet = blob;
 			this.DeclSecurity.AddRecord(rec);
 		}
 
+		internal void AddDeclarativeSecurity(int token, System.Security.Permissions.SecurityAction securityAction, System.Security.PermissionSet permissionSet)
+		{
+			// like Ref.Emit, we're using the .NET 1.x xml format
+			AddDeclSecurityRecord(token, (int)securityAction, this.Blobs.Add(ByteBuffer.Wrap(System.Text.Encoding.Unicode.GetBytes(permissionSet.ToXml().ToString()))));
+		}
+
 		internal void AddDeclarativeSecurity(int token, List<CustomAttributeBuilder> declarativeSecurity)
 		{
 			Dictionary<int, List<CustomAttributeBuilder>> ordered = new Dictionary<int, List<CustomAttributeBuilder>>();
@@ -464,6 +471,11 @@ namespace IKVM.Reflection.Emit
 				{
 					action = (int)cab.GetConstructorArgument(0);
 				}
+				if (cab.IsLegacyDeclSecurity)
+				{
+					AddDeclSecurityRecord(token, action, cab.WriteLegacyDeclSecurityBlob(this));
+					continue;
+				}
 				List<CustomAttributeBuilder> list;
 				if (!ordered.TryGetValue(action, out list))
 				{
@@ -474,22 +486,12 @@ namespace IKVM.Reflection.Emit
 			}
 			foreach (KeyValuePair<int, List<CustomAttributeBuilder>> kv in ordered)
 			{
-				DeclSecurityTable.Record rec = new DeclSecurityTable.Record();
-				rec.Action = (short)kv.Key;
-				rec.Parent = token;
-				rec.PermissionSet = WriteDeclSecurityBlob(kv.Value);
-				this.DeclSecurity.AddRecord(rec);
+				AddDeclSecurityRecord(token, kv.Key, WriteDeclSecurityBlob(kv.Value));
 			}
 		}
 
 		private int WriteDeclSecurityBlob(List<CustomAttributeBuilder> list)
 		{
-			string xml;
-			if (list.Count == 1 && (xml = list[0].GetLegacyDeclSecurity()) != null)
-			{
-				// write .NET 1.1 format
-				return this.Blobs.Add(ByteBuffer.Wrap(System.Text.Encoding.Unicode.GetBytes(xml)));
-			}
 			ByteBuffer namedArgs = new ByteBuffer(100);
 			ByteBuffer bb = new ByteBuffer(list.Count * 100);
 			bb.Write((byte)'.');
diff --git a/external/ikvm/reflect/Emit/TypeBuilder.cs b/external/ikvm/reflect/Emit/TypeBuilder.cs
index aa6d264..30cde68 100644
--- a/external/ikvm/reflect/Emit/TypeBuilder.cs
+++ b/external/ikvm/reflect/Emit/TypeBuilder.cs
@@ -571,12 +571,11 @@ namespace IKVM.Reflection.Emit
 			{
 				layout = (LayoutKind)val;
 			}
-			StructLayoutAttribute attr = new StructLayoutAttribute(layout);
-			attr.Pack = (int?)customBuilder.GetFieldValue("Pack") ?? 0;
-			attr.Size = (int?)customBuilder.GetFieldValue("Size") ?? 0;
-			attr.CharSet = customBuilder.GetFieldValue<CharSet>("CharSet") ?? CharSet.None;
+			pack = (short)((int?)customBuilder.GetFieldValue("Pack") ?? 0);
+			size = (int?)customBuilder.GetFieldValue("Size") ?? 0;
+			CharSet charSet = customBuilder.GetFieldValue<CharSet>("CharSet") ?? CharSet.None;
 			attribs &= ~TypeAttributes.LayoutMask;
-			switch (attr.Value)
+			switch (layout)
 			{
 				case LayoutKind.Auto:
 					attribs |= TypeAttributes.AutoLayout;
@@ -589,7 +588,7 @@ namespace IKVM.Reflection.Emit
 					break;
 			}
 			attribs &= ~TypeAttributes.StringFormatMask;
-			switch (attr.CharSet)
+			switch (charSet)
 			{
 				case CharSet.None:
 				case CharSet.Ansi:
@@ -602,8 +601,6 @@ namespace IKVM.Reflection.Emit
 					attribs |= TypeAttributes.UnicodeClass;
 					break;
 			}
-			pack = (short)attr.Pack;
-			size = attr.Size;
 			hasLayout = pack != 0 || size != 0;
 		}
 
@@ -870,45 +867,6 @@ namespace IKVM.Reflection.Emit
 			return methods;
 		}
 
-		public override StructLayoutAttribute StructLayoutAttribute
-		{
-			get
-			{
-				LayoutKind layout;
-				switch (attribs & TypeAttributes.LayoutMask)
-				{
-					case TypeAttributes.ExplicitLayout:
-						layout = LayoutKind.Explicit;
-						break;
-					case TypeAttributes.SequentialLayout:
-						layout = LayoutKind.Sequential;
-						break;
-					default:
-						layout = LayoutKind.Auto;
-						break;
-				}
-				StructLayoutAttribute attr = new StructLayoutAttribute(layout);
-				attr.Pack = (ushort)pack;
-				attr.Size = size;
-				switch (attribs & TypeAttributes.StringFormatMask)
-				{
-					case TypeAttributes.AutoClass:
-						attr.CharSet = CharSet.Auto;
-						break;
-					case TypeAttributes.UnicodeClass:
-						attr.CharSet = CharSet.Unicode;
-						break;
-					case TypeAttributes.AnsiClass:
-						attr.CharSet = CharSet.Ansi;
-						break;
-					default:
-						attr.CharSet = CharSet.None;
-						break;
-				}
-				return attr;
-			}
-		}
-
 		public override Type DeclaringType
 		{
 			get { return owner as TypeBuilder; }
@@ -1194,9 +1152,9 @@ namespace IKVM.Reflection.Emit
 			get { return underlyingType.DeclaringType; }
 		}
 
-		public override StructLayoutAttribute StructLayoutAttribute
+		public override bool __GetLayout(out int packingSize, out int typeSize)
 		{
-			get { return underlyingType.StructLayoutAttribute; }
+			return underlyingType.__GetLayout(out packingSize, out typeSize);
 		}
 
 		public override Type[] GetGenericArguments()
diff --git a/external/ikvm/reflect/Fusion.cs b/external/ikvm/reflect/Fusion.cs
index dafb60e..ec9c252 100644
--- a/external/ikvm/reflect/Fusion.cs
+++ b/external/ikvm/reflect/Fusion.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2010-2012 Jeroen Frijters
+  Copyright (C) 2010-2013 Jeroen Frijters
   Copyright (C) 2011 Marek Safar
 
   This software is provided 'as-is', without any express or implied
@@ -32,7 +32,7 @@ namespace IKVM.Reflection
 	struct ParsedAssemblyName
 	{
 		internal string Name;
-		internal Version Version;
+		internal string Version;
 		internal string Culture;
 		internal string PublicKeyToken;
 		internal bool? Retargetable;
@@ -50,6 +50,16 @@ namespace IKVM.Reflection
 
 	static class Fusion
 	{
+		static readonly Version FrameworkVersion = new Version(4, 0, 0, 0);
+		static readonly Version FrameworkVersionNext = new Version(4, 1, 0, 0);
+		static readonly Version SilverlightVersion = new Version(2, 0, 5, 0);
+		static readonly Version SilverlightVersionMinimum = new Version(2, 0, 0, 0);
+		static readonly Version SilverlightVersionMaximum = new Version(5, 9, 0, 0);
+		const string PublicKeyTokenEcma = "b77a5c561934e089";
+		const string PublicKeyTokenMicrosoft = "b03f5f7f11d50a3a";
+		const string PublicKeyTokenSilverlight = "7cec85d7bea7798e";
+		const string PublicKeyTokenWinFX = "31bf3856ad364e35";
+
 		internal static bool CompareAssemblyIdentityNative(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
 		{
 			bool equivalent;
@@ -66,11 +76,46 @@ namespace IKVM.Reflection
 			ParsedAssemblyName name1;
 			ParsedAssemblyName name2;
 
-			ParseAssemblyResult r = ParseAssemblyName(assemblyIdentity1, out name1);
-			if (r != ParseAssemblyResult.OK || (r = ParseAssemblyName(assemblyIdentity2, out name2)) != ParseAssemblyResult.OK)
+			ParseAssemblyResult r1 = ParseAssemblyName(assemblyIdentity1, out name1);
+			ParseAssemblyResult r2 = ParseAssemblyName(assemblyIdentity2, out name2);
+
+			Version version1;
+			if (unified1)
+			{
+				if (name1.Name == null || !ParseVersion(name1.Version, out version1) || version1 == null || version1.Revision == -1
+					|| name1.Culture == null || name1.PublicKeyToken == null || name1.PublicKeyToken.Length < 2)
+				{
+					result = AssemblyComparisonResult.NonEquivalent;
+					throw new ArgumentException();
+				}
+			}
+
+			Version version2 = null;
+			if (!ParseVersion(name2.Version, out version2) || version2 == null || version2.Revision == -1 
+				|| name2.Culture == null || name2.PublicKeyToken == null || name2.PublicKeyToken.Length < 2)
 			{
 				result = AssemblyComparisonResult.NonEquivalent;
-				switch (r)
+				throw new ArgumentException();
+			}
+
+			if (name2.Name != null && name2.Name.Equals("mscorlib", StringComparison.OrdinalIgnoreCase))
+			{
+				if (name1.Name != null && name1.Name.Equals(name2.Name, StringComparison.OrdinalIgnoreCase))
+				{
+					result = AssemblyComparisonResult.EquivalentFullMatch;
+					return true;
+				}
+				else
+				{
+					result = AssemblyComparisonResult.NonEquivalent;
+					return false;
+				}
+			}
+
+			if (r1 != ParseAssemblyResult.OK)
+			{
+				result = AssemblyComparisonResult.NonEquivalent;
+				switch (r1)
 				{
 					case ParseAssemblyResult.DuplicateKey:
 						throw new System.IO.FileLoadException();
@@ -80,61 +125,128 @@ namespace IKVM.Reflection
 				}
 			}
 
-			bool partial = IsPartial(name1);
+			if (r2 != ParseAssemblyResult.OK)
+			{
+				result = AssemblyComparisonResult.NonEquivalent;
+				switch (r2)
+				{
+					case ParseAssemblyResult.DuplicateKey:
+						throw new System.IO.FileLoadException();
+					case ParseAssemblyResult.GenericError:
+					default:
+						throw new ArgumentException();
+				}
+			}
 
-			if ((partial && unified1) || IsPartial(name2))
+			if (!ParseVersion(name1.Version, out version1))
 			{
 				result = AssemblyComparisonResult.NonEquivalent;
 				throw new ArgumentException();
 			}
-			if (!name1.Name.Equals(name2.Name, StringComparison.InvariantCultureIgnoreCase))
+
+			bool partial = IsPartial(name1, version1);
+
+			if (partial && name1.Retargetable.HasValue)
 			{
 				result = AssemblyComparisonResult.NonEquivalent;
-				return false;
+				throw new System.IO.FileLoadException();
 			}
-			if (name1.Name.Equals("mscorlib", StringComparison.InvariantCultureIgnoreCase))
+			if ((partial && unified1) || IsPartial(name2, version2))
 			{
-				result = AssemblyComparisonResult.EquivalentFullMatch;
-				return true;
+				result = AssemblyComparisonResult.NonEquivalent;
+				throw new ArgumentException();
+			}
+			if (!name1.Name.Equals(name2.Name, StringComparison.OrdinalIgnoreCase))
+			{
+				result = AssemblyComparisonResult.NonEquivalent;
+				return false;
 			}
 			if (partial && name1.Culture == null)
 			{
 			}
-			else if (!name1.Culture.Equals(name2.Culture, StringComparison.InvariantCultureIgnoreCase))
+			else if (!name1.Culture.Equals(name2.Culture, StringComparison.OrdinalIgnoreCase))
 			{
 				result = AssemblyComparisonResult.NonEquivalent;
 				return false;
 			}
-			if (IsStrongNamed(name2))
+
+			if (!name1.Retargetable.GetValueOrDefault() && name2.Retargetable.GetValueOrDefault())
+			{
+				result = AssemblyComparisonResult.NonEquivalent;
+				return false;
+			}
+
+			// HACK handle the case "System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes"
+			// compared with "System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=No"
+			if (name1.PublicKeyToken == name2.PublicKeyToken
+				&& version1 != null
+				&& name1.Retargetable.GetValueOrDefault()
+				&& !name2.Retargetable.GetValueOrDefault()
+				&& GetRemappedPublicKeyToken(ref name1, version1) != null)
+			{
+				name1.Retargetable = false;
+			}
+
+			string remappedPublicKeyToken1 = null;
+			string remappedPublicKeyToken2 = null;
+			if (version1 != null && (remappedPublicKeyToken1 = GetRemappedPublicKeyToken(ref name1, version1)) != null)
+			{
+				name1.PublicKeyToken = remappedPublicKeyToken1;
+				version1 = FrameworkVersion;
+			}
+			if ((remappedPublicKeyToken2 = GetRemappedPublicKeyToken(ref name2, version2)) != null)
 			{
-				if (partial && name1.PublicKeyToken == null)
+				name2.PublicKeyToken = remappedPublicKeyToken2;
+				version2 = FrameworkVersion;
+			}
+			if (name1.Retargetable.GetValueOrDefault())
+			{
+				if (name2.Retargetable.GetValueOrDefault())
 				{
+					if (remappedPublicKeyToken1 != null ^ remappedPublicKeyToken2 != null)
+					{
+						result = AssemblyComparisonResult.NonEquivalent;
+						return false;
+					}
 				}
-				else if (name1.PublicKeyToken != name2.PublicKeyToken)
+				else if (remappedPublicKeyToken1 == null || remappedPublicKeyToken2 != null)
 				{
-					if (HasPclRuntimeRemapping (name1, name2)) {
-						result = AssemblyComparisonResult.EquivalentFXUnified;
-						return true;
-					}
-					result = AssemblyComparisonResult.NonEquivalent;
+					result = AssemblyComparisonResult.Unknown;
 					return false;
 				}
-				if (partial && name1.Version == null)
+			}
+
+			bool fxUnified = false;
+			bool versionMatch = version1 == version2;
+			if (IsFrameworkAssembly(name1))
+			{
+				fxUnified |= !versionMatch;
+				version1 = FrameworkVersion;
+			}
+			if (IsFrameworkAssembly(name2) && version2 < FrameworkVersionNext)
+			{
+				fxUnified |= !versionMatch;
+				version2 = FrameworkVersion;
+			}
+
+			if (IsStrongNamed(name2))
+			{
+				if (name1.PublicKeyToken != null && name1.PublicKeyToken != name2.PublicKeyToken)
 				{
-					result = AssemblyComparisonResult.EquivalentPartialMatch;
-					return true;
+					result = AssemblyComparisonResult.NonEquivalent;
+					return false;
 				}
-				else if (IsFrameworkAssembly(name2) || IsFacadeAssembly(name2))
+				else if (version1 == null)
 				{
-					result = partial ? AssemblyComparisonResult.EquivalentPartialFXUnified : AssemblyComparisonResult.EquivalentFXUnified;
+					result = AssemblyComparisonResult.EquivalentPartialMatch;
 					return true;
 				}
-				else if (name1.Version.Revision == -1 || name2.Version.Revision == -1)
+				else if (version1.Revision == -1 || version2.Revision == -1)
 				{
 					result = AssemblyComparisonResult.NonEquivalent;
 					throw new ArgumentException();
 				}
-				else if (name1.Version < name2.Version)
+				else if (version1 < version2)
 				{
 					if (unified2)
 					{
@@ -147,7 +259,7 @@ namespace IKVM.Reflection
 						return false;
 					}
 				}
-				else if (name1.Version > name2.Version)
+				else if (version1 > version2)
 				{
 					if (unified1)
 					{
@@ -160,6 +272,11 @@ namespace IKVM.Reflection
 						return false;
 					}
 				}
+				else if (!versionMatch || fxUnified)
+				{
+					result = partial ? AssemblyComparisonResult.EquivalentPartialFXUnified : AssemblyComparisonResult.EquivalentFXUnified;
+					return true;
+				}
 				else
 				{
 					result = partial ? AssemblyComparisonResult.EquivalentPartialMatch : AssemblyComparisonResult.EquivalentFullMatch;
@@ -178,56 +295,10 @@ namespace IKVM.Reflection
 			}
 		}
 
-		#region PCL Runtime Remapping
-
-		// keep this in sync with the key_remap_table in mono/metadata/assembly.c
-
-		const string SILVERLIGHT_KEY = "7cec85d7bea7798e";
-		const string WINFX_KEY = "31bf3856ad364e35";
-		const string ECMA_KEY = "b77a5c561934e089";
-		const string MSFINAL_KEY = "b03f5f7f11d50a3a";
-
-		static readonly string[,] key_remap_table = new string[,] {
-			{ "Microsoft.CSharp", WINFX_KEY, MSFINAL_KEY },
-			{ "System", SILVERLIGHT_KEY, ECMA_KEY },
-			{ "System.ComponentModel.Composition", WINFX_KEY, ECMA_KEY },
-			{ "System.ComponentModel.DataAnnotations", "ddd0da4d3e678217", WINFX_KEY },
-			{ "System.Core", SILVERLIGHT_KEY, ECMA_KEY },
-			// FIXME: MS uses MSFINAL_KEY for .NET 4.5
-			{ "System.Net", SILVERLIGHT_KEY, MSFINAL_KEY },
-			{ "System.Numerics", WINFX_KEY, MSFINAL_KEY },
-			{ "System.Runtime.Serialization", SILVERLIGHT_KEY, ECMA_KEY },
-			{ "System.ServiceModel", WINFX_KEY, ECMA_KEY },
-			{ "System.ServiceModel.Web", SILVERLIGHT_KEY, WINFX_KEY },
-			{ "System.Windows", SILVERLIGHT_KEY, MSFINAL_KEY },
-			{ "System.Xml", SILVERLIGHT_KEY, ECMA_KEY },
-			{ "System.Xml.Linq", WINFX_KEY, ECMA_KEY },
-			{ "System.Xml.Serialization", WINFX_KEY, ECMA_KEY }
-		};
-
-		static bool HasPclRuntimeRemapping(ParsedAssemblyName name1, ParsedAssemblyName name2)
-		{
-			if (name1.Name != name2.Name)
-				return false;
-
-			for (int i = 0; i < key_remap_table.GetLength (0); i++) {
-				if (!name1.Name.Equals (key_remap_table [i,0]))
-					continue;
-				if (name1.PublicKeyToken.Equals (key_remap_table [i, 1]) &&
-				    name2.PublicKeyToken.Equals (key_remap_table [i, 2]))
-					return true;
-			}
-
-			return false;
-		}
-
-		#endregion
-
 		static bool IsFrameworkAssembly(ParsedAssemblyName name)
 		{
-			// A list of FX assemblies which require some form of remapping
-			// When 4.0 + 1 version  is release, assemblies introduced in v4.0
-			// will have to be added
+			// Framework assemblies use different unification rules, so when
+			// a new framework is released the new assemblies need to be added.
 			switch (name.Name)
 			{
 				case "System":
@@ -240,31 +311,90 @@ namespace IKVM.Reflection
 				case "System.Data.Services.Client":
 				case "System.IdentityModel":
 				case "System.IdentityModel.Selectors":
+				case "System.IO.Compression":
+				case "System.Numerics":
+				case "System.Reflection.Context":
 				case "System.Runtime.Remoting":
 				case "System.Runtime.Serialization":
+				case "System.Runtime.WindowsRuntime":
+				case "System.Runtime.WindowsRuntime.UI.Xaml":
 				case "System.ServiceModel":
 				case "System.Transactions":
 				case "System.Windows.Forms":
 				case "System.Xml":
 				case "System.Xml.Linq":
-					return name.PublicKeyToken == "b77a5c561934e089";
-
+				case "System.Xml.Serialization":
+					return name.PublicKeyToken == PublicKeyTokenEcma;
+
+				case "Microsoft.CSharp":
+				case "Microsoft.VisualBasic":
+				case "System.Collections":
+				case "System.Collections.Concurrent":
+				case "System.ComponentModel":
+				case "System.ComponentModel.Annotations":
+				case "System.ComponentModel.EventBasedAsync":
 				case "System.Configuration":
 				case "System.Configuration.Install":
 				case "System.Design":
+				case "System.Diagnostics.Contracts":
+				case "System.Diagnostics.Debug":
+				case "System.Diagnostics.Tools":
+				case "System.Diagnostics.Tracing":
 				case "System.DirectoryServices":
 				case "System.Drawing":
 				case "System.Drawing.Design":
+				case "System.Dynamic.Runtime":
 				case "System.EnterpriseServices":
+				case "System.Globalization":
+				case "System.IO":
+				case "System.Linq":
+				case "System.Linq.Expressions":
+				case "System.Linq.Parallel":
+				case "System.Linq.Queryable":
 				case "System.Management":
 				case "System.Messaging":
+				case "System.Net":
+				case "System.Net.Http":
+				case "System.Net.Http.Rtc":
+				case "System.Net.NetworkInformation":
+				case "System.Net.Primitives":
+				case "System.Net.Requests":
+				case "System.ObjectModel":
+				case "System.Reflection":
+				case "System.Reflection.Extensions":
+				case "System.Reflection.Primitives":
+				case "System.Resources.ResourceManager":
+				case "System.Runtime":
+				case "System.Runtime.Extensions":
+				case "System.Runtime.InteropServices":
+				case "System.Runtime.InteropServices.WindowsRuntime":
+				case "System.Runtime.Numerics":
 				case "System.Runtime.Serialization.Formatters.Soap":
+				case "System.Runtime.Serialization.Json":
+				case "System.Runtime.Serialization.Primitives":
+				case "System.Runtime.Serialization.Xml":
 				case "System.Security":
+				case "System.Security.Principal":
+				case "System.ServiceModel.Duplex":
+				case "System.ServiceModel.Http":
+				case "System.ServiceModel.NetTcp":
+				case "System.ServiceModel.Primitives":
+				case "System.ServiceModel.Security":
 				case "System.ServiceProcess":
+				case "System.Text.Encoding":
+				case "System.Text.Encoding.Extensions":
+				case "System.Text.RegularExpressions":
+				case "System.Threading":
+				case "System.Threading.Tasks":
+				case "System.Threading.Tasks.Parallel":
 				case "System.Web":
 				case "System.Web.Mobile":
 				case "System.Web.Services":
-					return name.PublicKeyToken == "b03f5f7f11d50a3a";
+				case "System.Windows":
+				case "System.Xml.ReaderWriter":
+				case "System.Xml.XDocument":
+				case "System.Xml.XmlSerializer":
+					return name.PublicKeyToken == PublicKeyTokenMicrosoft;
 
 				case "System.ComponentModel.DataAnnotations":
 				case "System.ServiceModel.Web":
@@ -273,127 +403,161 @@ namespace IKVM.Reflection
 				case "System.Web.Extensions.Design":
 				case "System.Web.DynamicData":
 				case "System.Web.Routing":
-					return name.PublicKeyToken == "31bf3856ad364e35";
+					return name.PublicKeyToken == PublicKeyTokenWinFX;
 			}
 
 			return false;
 		}
 
-		static bool IsFacadeAssembly (ParsedAssemblyName name)
+		static string GetRemappedPublicKeyToken(ref ParsedAssemblyName name, Version version)
 		{
-			switch (name.Name) {
-			case "System.Collections":
-			case "System.Collections.Concurrent":
-			case "System.ComponentModel":
-			case "System.ComponentModel.Annotations":
-			case "System.ComponentModel.EventBasedAsync":
-			case "System.Diagnostics.Contracts":
-			case "System.Diagnostics.Debug":
-			case "System.Diagnostics.Tools":
-			case "System.Dynamic.Runtime":
-			case "System.Globalization":
-			case "System.IO":
-			case "System.Linq":
-			case "System.Linq.Expressions":
-			case "System.Linq.Parallel":
-			case "System.Linq.Queryable":
-			case "System.Net.NetworkInformation":
-			case "System.Net.Primitives":
-			case "System.Net.Requests":
-			case "System.ObjectModel":
-			case "System.Reflection":
-			case "System.Reflection.Extensions":
-			case "System.Reflection.Primitives":
-			case "System.Resources.ResourceManager":
-			case "System.Runtime":
-			case "System.Runtime.Extensions":
-			case "System.Runtime.InteropServices":
-			case "System.Runtime.Numerics":
-			case "System.Runtime.Serialization.Json":
-			case "System.Runtime.Serialization.Primitives":
-			case "System.Runtime.Serialization.Xml":
-			case "System.Security.Principal":
-			case "System.ServiceModel.Http":
-			case "System.ServiceModel.Primitives":
-			case "System.Text.Encoding":
-			case "System.Text.Encoding.Extensions":
-			case "System.Text.RegularExpressions":
-			case "System.Threading":
-			case "System.Threading.Tasks":
-			case "System.Threading.Tasks.Parallel":
-			case "System.Xml.ReaderWriter":
-			case "System.Xml.XDocument":
-			case "System.Xml.XmlSerializer":
-				return name.PublicKeyToken == "b03f5f7f11d50a3a";
-			default:
-				return false;
+			if (name.Retargetable.GetValueOrDefault() && version < SilverlightVersion)
+			{
+				return null;
 			}
+			if (name.PublicKeyToken == "ddd0da4d3e678217" && name.Name == "System.ComponentModel.DataAnnotations" && name.Retargetable.GetValueOrDefault())
+			{
+				return PublicKeyTokenWinFX;
+			}
+			if (SilverlightVersionMinimum <= version && version <= SilverlightVersionMaximum)
+			{
+				switch (name.PublicKeyToken)
+				{
+					case PublicKeyTokenSilverlight:
+						switch (name.Name)
+						{
+							case "System":
+							case "System.Core":
+								return PublicKeyTokenEcma;
+						}
+						if (name.Retargetable.GetValueOrDefault())
+						{
+							switch (name.Name)
+							{
+								case "System.Runtime.Serialization":
+								case "System.Xml":
+									return PublicKeyTokenEcma;
+								case "System.Net":
+								case "System.Windows":
+									return PublicKeyTokenMicrosoft;
+								case "System.ServiceModel.Web":
+									return PublicKeyTokenWinFX;
+							}
+						}
+						break;
+					case PublicKeyTokenWinFX:
+						switch (name.Name)
+						{
+							case "System.ComponentModel.Composition":
+								return PublicKeyTokenEcma;
+						}
+						if (name.Retargetable.GetValueOrDefault())
+						{
+							switch (name.Name)
+							{
+								case "Microsoft.CSharp":
+									return PublicKeyTokenMicrosoft;
+								case "System.Numerics":
+								case "System.ServiceModel":
+								case "System.Xml.Serialization":
+								case "System.Xml.Linq":
+									return PublicKeyTokenEcma;
+							}
+						}
+						break;
+				}
+			}
+			return null;
 		}
 
 		internal static ParseAssemblyResult ParseAssemblySimpleName(string fullName, out int pos, out string simpleName)
 		{
-			StringBuilder sb = new StringBuilder();
 			pos = 0;
-			simpleName = null;
+			if (!TryParse(fullName, ref pos, out simpleName) || simpleName.Length == 0)
+			{
+				return ParseAssemblyResult.GenericError;
+			}
+			if (pos == fullName.Length && fullName[fullName.Length - 1] == ',')
+			{
+				return ParseAssemblyResult.GenericError;
+			}
+			return ParseAssemblyResult.OK;
+		}
+
+		private static bool TryParse(string fullName, ref int pos, out string value)
+		{
+			value = null;
+			StringBuilder sb = new StringBuilder();
 			while (pos < fullName.Length && char.IsWhiteSpace(fullName[pos]))
 			{
 				pos++;
 			}
-			char quoteOrComma = ',';
-			if (pos < fullName.Length && (fullName[pos] == '\"' || fullName[pos] == '\''))
+			int quote = -1;
+			if (pos < fullName.Length && (fullName[pos] == '"' || fullName[pos] == '\''))
 			{
-				quoteOrComma = fullName[pos++];
+				quote = fullName[pos++];
 			}
-			while (pos < fullName.Length)
+			for (; pos < fullName.Length; pos++)
 			{
-				char ch = fullName[pos++];
+				char ch = fullName[pos];
 				if (ch == '\\')
 				{
-					if (pos == fullName.Length)
+					if (++pos == fullName.Length)
 					{
-						return ParseAssemblyResult.GenericError;
+						return false;
 					}
-					ch = fullName[pos++];
+					ch = fullName[pos];
 					if (ch == '\\')
 					{
-						return ParseAssemblyResult.GenericError;
+						return false;
 					}
 				}
-				else if (ch == quoteOrComma)
+				else if (ch == quote)
 				{
-					if (ch != ',')
+					for (pos++; pos != fullName.Length; pos++)
 					{
-						while (pos != fullName.Length)
+						ch = fullName[pos];
+						if (ch == ',' || ch == '=')
 						{
-							ch = fullName[pos++];
-							if (ch == ',')
-							{
-								break;
-							}
-							if (!char.IsWhiteSpace(ch))
-							{
-								return ParseAssemblyResult.GenericError;
-							}
+							break;
+						}
+						if (!char.IsWhiteSpace(ch))
+						{
+							return false;
 						}
 					}
 					break;
 				}
-				else if (ch == '=' || (quoteOrComma == ',' && (ch == '\'' || ch == '"')))
+				else if (quote == -1 && (ch == '"' || ch == '\''))
 				{
-					return ParseAssemblyResult.GenericError;
+					return false;
+				}
+				else if (quote == -1 && (ch == ',' || ch == '='))
+				{
+					break;
 				}
 				sb.Append(ch);
 			}
-			simpleName = sb.ToString().Trim();
-			if (simpleName.Length == 0)
-			{
-				return ParseAssemblyResult.GenericError;
-			}
-			if (pos == fullName.Length && fullName[fullName.Length - 1] == ',')
+			value = sb.ToString().Trim();
+			return value.Length != 0 || quote != -1;
+		}
+
+		private static bool TryConsume(string fullName, char ch, ref int pos)
+		{
+			if (pos < fullName.Length && fullName[pos] == ch)
 			{
-				return ParseAssemblyResult.GenericError;
+				pos++;
+				return true;
 			}
-			return ParseAssemblyResult.OK;
+			return false;
+		}
+
+		private static bool TryParseAssemblyAttribute(string fullName, ref int pos, ref string key, ref string value)
+		{
+			return TryConsume(fullName, ',', ref pos)
+				&& TryParse(fullName, ref pos, out key)
+				&& TryConsume(fullName, '=', ref pos)
+				&& TryParse(fullName, ref pos, out value);
 		}
 
 		internal static ParseAssemblyResult ParseAssemblyName(string fullName, out ParsedAssemblyName parsedName)
@@ -401,64 +565,76 @@ namespace IKVM.Reflection
 			parsedName = new ParsedAssemblyName();
 			int pos;
 			ParseAssemblyResult res = ParseAssemblySimpleName(fullName, out pos, out parsedName.Name);
-			if (res != ParseAssemblyResult.OK || pos == fullName.Length)
+			if (res != ParseAssemblyResult.OK)
 			{
 				return res;
 			}
 			else
 			{
+				const int ERROR_SXS_IDENTITIES_DIFFERENT = unchecked((int)0x80073716);
 				System.Collections.Generic.Dictionary<string, string> unknownAttributes = null;
 				bool hasProcessorArchitecture = false;
 				bool hasContentType = false;
-				string[] parts = fullName.Substring(pos).Split(',');
-				for (int i = 0; i < parts.Length; i++)
+				bool hasPublicKeyToken = false;
+				string publicKeyToken;
+				while (pos != fullName.Length)
 				{
-					string[] kv = parts[i].Split('=');
-					if (kv.Length != 2)
+					string key = null;
+					string value = null;
+					if (!TryParseAssemblyAttribute(fullName, ref pos, ref key, ref value))
 					{
 						return ParseAssemblyResult.GenericError;
 					}
-					switch (kv[0].Trim().ToLowerInvariant())
+					key = key.ToLowerInvariant();
+					switch (key)
 					{
 						case "version":
 							if (parsedName.Version != null)
 							{
 								return ParseAssemblyResult.DuplicateKey;
 							}
-							if (!ParseVersion(kv[1].Trim(), out parsedName.Version))
-							{
-								return ParseAssemblyResult.GenericError;
-							}
+							parsedName.Version = value;
 							break;
 						case "culture":
 							if (parsedName.Culture != null)
 							{
 								return ParseAssemblyResult.DuplicateKey;
 							}
-							if (!ParseCulture(kv[1].Trim(), out parsedName.Culture))
+							if (!ParseCulture(value, out parsedName.Culture))
 							{
 								return ParseAssemblyResult.GenericError;
 							}
 							break;
 						case "publickeytoken":
-							if (parsedName.PublicKeyToken != null)
+							if (hasPublicKeyToken)
 							{
 								return ParseAssemblyResult.DuplicateKey;
 							}
-							if (!ParsePublicKeyToken(kv[1].Trim(), out parsedName.PublicKeyToken))
+							if (!ParsePublicKeyToken(value, out publicKeyToken))
 							{
 								return ParseAssemblyResult.GenericError;
 							}
+							if (parsedName.HasPublicKey && parsedName.PublicKeyToken != publicKeyToken)
+							{
+								Marshal.ThrowExceptionForHR(ERROR_SXS_IDENTITIES_DIFFERENT);
+							}
+							parsedName.PublicKeyToken = publicKeyToken;
+							hasPublicKeyToken = true;
 							break;
 						case "publickey":
-							if (parsedName.PublicKeyToken != null)
+							if (parsedName.HasPublicKey)
 							{
 								return ParseAssemblyResult.DuplicateKey;
 							}
-							if (!ParsePublicKey(kv[1].Trim(), out parsedName.PublicKeyToken))
+							if (!ParsePublicKey(value, out publicKeyToken))
 							{
 								return ParseAssemblyResult.GenericError;
 							}
+							if (hasPublicKeyToken && parsedName.PublicKeyToken != publicKeyToken)
+							{
+								Marshal.ThrowExceptionForHR(ERROR_SXS_IDENTITIES_DIFFERENT);
+							}
+							parsedName.PublicKeyToken = publicKeyToken;
 							parsedName.HasPublicKey = true;
 							break;
 						case "retargetable":
@@ -466,7 +642,7 @@ namespace IKVM.Reflection
 							{
 								return ParseAssemblyResult.DuplicateKey;
 							}
-							switch (kv[1].Trim().ToLowerInvariant())
+							switch (value.ToLowerInvariant())
 							{
 								case "yes":
 									parsedName.Retargetable = true;
@@ -484,7 +660,7 @@ namespace IKVM.Reflection
 								return ParseAssemblyResult.DuplicateKey;
 							}
 							hasProcessorArchitecture = true;
-							switch (kv[1].Trim().ToLowerInvariant())
+							switch (value.ToLowerInvariant())
 							{
 								case "none":
 									parsedName.ProcessorArchitecture = ProcessorArchitecture.None;
@@ -514,14 +690,14 @@ namespace IKVM.Reflection
 								return ParseAssemblyResult.DuplicateKey;
 							}
 							hasContentType = true;
-							if (kv[1].Trim().ToLowerInvariant() != "windowsruntime")
+							if (!value.Equals("windowsruntime", StringComparison.OrdinalIgnoreCase))
 							{
 								return ParseAssemblyResult.GenericError;
 							}
 							parsedName.WindowsRuntime = true;
 							break;
 						default:
-							if (kv[1].Trim() == "")
+							if (key.Length == 0)
 							{
 								return ParseAssemblyResult.GenericError;
 							}
@@ -529,20 +705,25 @@ namespace IKVM.Reflection
 							{
 								unknownAttributes = new System.Collections.Generic.Dictionary<string, string>();
 							}
-							if (unknownAttributes.ContainsKey(kv[0].Trim().ToLowerInvariant()))
+							if (unknownAttributes.ContainsKey(key))
 							{
 								return ParseAssemblyResult.DuplicateKey;
 							}
-							unknownAttributes.Add(kv[0].Trim().ToLowerInvariant(), null);
+							unknownAttributes.Add(key, null);
 							break;
 					}
 				}
+				return ParseAssemblyResult.OK;
 			}
-			return ParseAssemblyResult.OK;
 		}
 
 		private static bool ParseVersion(string str, out Version version)
 		{
+			if (str == null)
+			{
+				version = null;
+				return true;
+			}
 			string[] parts = str.Split('.');
 			if (parts.Length < 2 || parts.Length > 4)
 			{
@@ -614,9 +795,9 @@ namespace IKVM.Reflection
 			return true;
 		}
 
-		private static bool IsPartial(ParsedAssemblyName name)
+		private static bool IsPartial(ParsedAssemblyName name, Version version)
 		{
-			return name.Version == null || name.Culture == null || name.PublicKeyToken == null;
+			return version == null || name.Culture == null || name.PublicKeyToken == null;
 		}
 
 		private static bool IsStrongNamed(ParsedAssemblyName name)
diff --git a/external/ikvm/reflect/IKVM.Reflection.csproj b/external/ikvm/reflect/IKVM.Reflection.csproj
index 4d3b12c..5e11728 100644
--- a/external/ikvm/reflect/IKVM.Reflection.csproj
+++ b/external/ikvm/reflect/IKVM.Reflection.csproj
@@ -22,13 +22,11 @@
     </SccAuxPath>
     <SccProvider>
     </SccProvider>
-    <SignAssembly>true</SignAssembly>
-    <AssemblyOriginatorKeyFile>..\ikvm-fork.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>True</DebugSymbols>
+    <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
-    <Optimize>False</Optimize>
+    <Optimize>false</Optimize>
     <OutputPath>bin\Debug\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -36,7 +34,7 @@
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
-    <Optimize>True</Optimize>
+    <Optimize>true</Optimize>
     <OutputPath>bin\Release\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -100,6 +98,7 @@
     <Compile Include="Module.cs" />
     <Compile Include="ParameterInfo.cs" />
     <Compile Include="ParameterModifier.cs" />
+    <Compile Include="Projection.cs" />
     <Compile Include="PropertyInfo.cs" />
     <Compile Include="PropertySignature.cs" />
     <Compile Include="Reader\AssemblyReader.cs" />
diff --git a/external/ikvm/reflect/MethodSignature.cs b/external/ikvm/reflect/MethodSignature.cs
index 2851255..189f13b 100644
--- a/external/ikvm/reflect/MethodSignature.cs
+++ b/external/ikvm/reflect/MethodSignature.cs
@@ -445,11 +445,14 @@ namespace IKVM.Reflection
 		{
 			get
 			{
-				for (int i = 0; i < customModifiers.Length; i++)
+				if (customModifiers != null)
 				{
-					if (customModifiers[i].ContainsMissingType)
+					for (int i = 0; i < customModifiers.Length; i++)
 					{
-						return true;
+						if (customModifiers[i].ContainsMissingType)
+						{
+							return true;
+						}
 					}
 				}
 				return false;
diff --git a/external/ikvm/reflect/Missing.cs b/external/ikvm/reflect/Missing.cs
index a438fea..ff9c5c0 100644
--- a/external/ikvm/reflect/Missing.cs
+++ b/external/ikvm/reflect/Missing.cs
@@ -380,6 +380,7 @@ namespace IKVM.Reflection
 		private Type[] typeArgs;
 		private int token;
 		private int flags;
+		private bool cyclicTypeForwarder;
 
 		internal MissingType(Module module, Type declaringType, string ns, string name)
 		{
@@ -388,6 +389,16 @@ namespace IKVM.Reflection
 			this.ns = ns;
 			this.name = name;
 			MarkEnumOrValueType(ns, name);
+
+			// HACK we need to handle the Windows Runtime projected types that change from ValueType to Class or v.v.
+			if (WindowsRuntimeProjection.IsProjectedValueType(ns, name, module))
+			{
+				typeFlags |= TypeFlags.ValueType;
+			}
+			else if (WindowsRuntimeProjection.IsProjectedReferenceType(ns, name, module))
+			{
+				typeFlags |= TypeFlags.NotValueType;
+			}
 		}
 
 		internal override MethodBase FindMethod(string name, MethodSignature signature)
@@ -465,6 +476,18 @@ namespace IKVM.Reflection
 						return true;
 					case TypeFlags.NotValueType:
 						return false;
+					case TypeFlags.ValueType | TypeFlags.NotValueType:
+						if (WindowsRuntimeProjection.IsProjectedValueType(ns, name, module))
+						{
+							typeFlags &= ~TypeFlags.NotValueType;
+							return true;
+						}
+						if (WindowsRuntimeProjection.IsProjectedReferenceType(ns, name, module))
+						{
+							typeFlags &= ~TypeFlags.ValueType;
+							return false;
+						}
+						goto default;
 					default:
 						if (module.universe.ResolveMissingTypeIsValueType(this))
 						{
@@ -539,9 +562,9 @@ namespace IKVM.Reflection
 			throw new MissingMemberException(this);
 		}
 
-		public override StructLayoutAttribute StructLayoutAttribute
+		public override bool __GetLayout(out int packingSize, out int typeSize)
 		{
-			get { throw new MissingMemberException(this); }
+			throw new MissingMemberException(this);
 		}
 
 		public override bool IsGenericType
@@ -579,6 +602,12 @@ namespace IKVM.Reflection
 			return this;
 		}
 
+		internal override Type SetCyclicTypeForwarder()
+		{
+			this.cyclicTypeForwarder = true;
+			return this;
+		}
+
 		internal override bool IsBaked
 		{
 			get { throw new MissingMemberException(this); }
@@ -589,6 +618,11 @@ namespace IKVM.Reflection
 			// CorTypeAttr.tdForwarder
 			get { return (flags & 0x00200000) != 0; }
 		}
+
+		public override bool __IsCyclicTypeForwarder
+		{
+			get { return cyclicTypeForwarder; }
+		}
 	}
 
 	sealed class MissingTypeParameter : IKVM.Reflection.Reader.TypeParameterType
diff --git a/external/ikvm/reflect/Module.cs b/external/ikvm/reflect/Module.cs
index 0582984..14e3178 100644
--- a/external/ikvm/reflect/Module.cs
+++ b/external/ikvm/reflect/Module.cs
@@ -55,6 +55,16 @@ namespace IKVM.Reflection
 			get { return module.ModuleVersionId; }
 		}
 
+		public string ImageRuntimeVersion
+		{
+			get { return module.__ImageRuntimeVersion; }
+		}
+
+		public int MDStreamVersion
+		{
+			get { return module.MDStreamVersion; }
+		}
+
 		private void CheckManifestModule()
 		{
 			if (!IsManifestModule)
diff --git a/external/ikvm/reflect/Projection.cs b/external/ikvm/reflect/Projection.cs
new file mode 100644
index 0000000..766e9d7
--- /dev/null
+++ b/external/ikvm/reflect/Projection.cs
@@ -0,0 +1,602 @@
+/*
+  Copyright (C) 2013 Jeroen Frijters
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jeroen Frijters
+  jeroen at frijters.net
+  
+*/
+using System;
+using System.Collections.Generic;
+using System.Text;
+using IKVM.Reflection.Metadata;
+using IKVM.Reflection.Reader;
+
+namespace IKVM.Reflection
+{
+	sealed class WindowsRuntimeProjection
+	{
+		private static readonly Dictionary<TypeName, Mapping> projections = new Dictionary<TypeName, Mapping>();
+		private readonly ModuleReader module;
+		private readonly Dictionary<int, string> strings;
+		private readonly Dictionary<string, int> added = new Dictionary<string,int>();
+		private readonly int[] assemblyRefTokens = new int[(int)ProjectionAssembly.Count];
+		private int typeofSystemAttribute = -1;
+		private int typeofSystemAttributeUsageAttribute = -1;
+		private int typeofSystemEnum = -1;
+		private int typeofSystemIDisposable = -1;
+		private int typeofSystemMulticastDelegate = -1;
+		private int typeofWindowsFoundationMetadataAllowMultipleAttribute = -1;
+		private bool[] projectedTypeRefs;
+
+		enum ProjectionAssembly
+		{
+			System_Runtime,
+			System_Runtime_InteropServices_WindowsRuntime,
+			System_ObjectModel,
+			System_Runtime_WindowsRuntime,
+			System_Runtime_WindowsRuntime_UI_Xaml,
+
+			Count
+		}
+
+		sealed class Mapping
+		{
+			internal readonly ProjectionAssembly Assembly;
+			internal readonly string TypeNamespace;
+			internal readonly string TypeName;
+
+			internal Mapping(ProjectionAssembly assembly, string typeNamespace, string typeName)
+			{
+				this.Assembly = assembly;
+				this.TypeNamespace = typeNamespace;
+				this.TypeName = typeName;
+			}
+		}
+
+		static WindowsRuntimeProjection()
+		{
+			projections.Add(new TypeName("System", "Attribute"), new Mapping(ProjectionAssembly.System_Runtime, "System", "Attribute"));
+			projections.Add(new TypeName("System", "MulticastDelegate"), new Mapping(ProjectionAssembly.System_Runtime, "System", "MulticastDelegate"));
+			projections.Add(new TypeName("Windows.Foundation", "DateTime"), new Mapping(ProjectionAssembly.System_Runtime, "System", "DateTimeOffset"));
+			projections.Add(new TypeName("Windows.Foundation", "EventHandler`1"), new Mapping(ProjectionAssembly.System_Runtime, "System", "EventHandler`1"));
+			projections.Add(new TypeName("Windows.Foundation", "EventRegistrationToken"), new Mapping(ProjectionAssembly.System_Runtime_InteropServices_WindowsRuntime, "System.Runtime.InteropServices.WindowsRuntime", "EventRegistrationToken"));
+			projections.Add(new TypeName("Windows.Foundation", "HResult"), new Mapping(ProjectionAssembly.System_Runtime, "System", "Exception"));
+			projections.Add(new TypeName("Windows.Foundation", "IClosable"), new Mapping(ProjectionAssembly.System_Runtime, "System", "IDisposable"));
+			projections.Add(new TypeName("Windows.Foundation", "IReference`1"), new Mapping(ProjectionAssembly.System_Runtime, "System", "Nullable`1"));
+			projections.Add(new TypeName("Windows.Foundation", "Point"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime, "Windows.Foundation", "Point"));
+			projections.Add(new TypeName("Windows.Foundation", "Rect"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime, "Windows.Foundation", "Rect"));
+			projections.Add(new TypeName("Windows.Foundation", "Size"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime, "Windows.Foundation", "Size"));
+			projections.Add(new TypeName("Windows.Foundation", "TimeSpan"), new Mapping(ProjectionAssembly.System_Runtime, "System", "TimeSpan"));
+			projections.Add(new TypeName("Windows.Foundation", "Uri"), new Mapping(ProjectionAssembly.System_Runtime, "System", "Uri"));
+			projections.Add(new TypeName("Windows.Foundation.Collections", "IIterable`1"), new Mapping(ProjectionAssembly.System_Runtime, "System.Collections.Generic", "IEnumerable`1"));
+			projections.Add(new TypeName("Windows.Foundation.Collections", "IKeyValuePair`2"), new Mapping(ProjectionAssembly.System_Runtime, "System.Collections.Generic", "KeyValuePair`2"));
+			projections.Add(new TypeName("Windows.Foundation.Collections", "IMap`2"), new Mapping(ProjectionAssembly.System_Runtime, "System.Collections.Generic", "IDictionary`2"));
+			projections.Add(new TypeName("Windows.Foundation.Collections", "IMapView`2"), new Mapping(ProjectionAssembly.System_Runtime, "System.Collections.Generic", "IReadOnlyDictionary`2"));
+			projections.Add(new TypeName("Windows.Foundation.Collections", "IVector`1"), new Mapping(ProjectionAssembly.System_Runtime, "System.Collections.Generic", "IList`1"));
+			projections.Add(new TypeName("Windows.Foundation.Collections", "IVectorView`1"), new Mapping(ProjectionAssembly.System_Runtime, "System.Collections.Generic", "IReadOnlyList`1"));
+			projections.Add(new TypeName("Windows.Foundation.Metadata", "AttributeTargets"), new Mapping(ProjectionAssembly.System_Runtime, "System", "AttributeTargets"));
+			projections.Add(new TypeName("Windows.Foundation.Metadata", "AttributeUsageAttribute"), new Mapping(ProjectionAssembly.System_Runtime, "System", "AttributeUsageAttribute"));
+			projections.Add(new TypeName("Windows.UI", "Color"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime, "Windows.UI", "Color"));
+			projections.Add(new TypeName("Windows.UI.Xaml", "CornerRadius"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml", "CornerRadius"));
+			projections.Add(new TypeName("Windows.UI.Xaml", "Duration"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml", "Duration"));
+			projections.Add(new TypeName("Windows.UI.Xaml", "DurationType"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml", "DurationType"));
+			projections.Add(new TypeName("Windows.UI.Xaml", "GridLength"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml", "GridLength"));
+			projections.Add(new TypeName("Windows.UI.Xaml", "GridUnitType"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml", "GridUnitType"));
+			projections.Add(new TypeName("Windows.UI.Xaml", "Thickness"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml", "Thickness"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Controls.Primitives", "GeneratorPosition"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml.Controls.Primitives", "GeneratorPosition"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Data", "INotifyPropertyChanged"), new Mapping(ProjectionAssembly.System_ObjectModel, "System.ComponentModel", "INotifyPropertyChanged"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Data", "PropertyChangedEventArgs"), new Mapping(ProjectionAssembly.System_ObjectModel, "System.ComponentModel", "PropertyChangedEventArgs"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Data", "PropertyChangedEventHandler"), new Mapping(ProjectionAssembly.System_ObjectModel, "System.ComponentModel", "PropertyChangedEventHandler"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Input", "ICommand"), new Mapping(ProjectionAssembly.System_ObjectModel, "System.Windows.Input", "ICommand"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Interop", "IBindableIterable"), new Mapping(ProjectionAssembly.System_Runtime, "System.Collections", "IEnumerable"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Interop", "IBindableVector"), new Mapping(ProjectionAssembly.System_Runtime, "System.Collections", "IList"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Interop", "NotifyCollectionChangedAction"), new Mapping(ProjectionAssembly.System_ObjectModel, "System.Collections.Specialized", "NotifyCollectionChangedAction"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Interop", "NotifyCollectionChangedEventArgs"), new Mapping(ProjectionAssembly.System_ObjectModel, "System.Collections.Specialized", "NotifyCollectionChangedEventArgs"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Interop", "NotifyCollectionChangedEventHandler"), new Mapping(ProjectionAssembly.System_ObjectModel, "System.Collections.Specialized", "NotifyCollectionChangedEventHandler"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Interop", "TypeName"), new Mapping(ProjectionAssembly.System_Runtime, "System", "Type"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Media", "Matrix"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml.Media", "Matrix"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Media.Animation", "KeyTime"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml.Media.Animation", "KeyTime"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Media.Animation", "RepeatBehavior"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml.Media.Animation", "RepeatBehavior"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Media.Animation", "RepeatBehaviorType"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml.Media.Animation", "RepeatBehaviorType"));
+			projections.Add(new TypeName("Windows.UI.Xaml.Media.Media3D", "Matrix3D"), new Mapping(ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml, "Windows.UI.Xaml.Media.Media3D", "Matrix3D"));
+
+			// hidden types
+			projections.Add(new TypeName("Windows.Foundation", "IPropertyValue"), null);
+			projections.Add(new TypeName("Windows.Foundation", "IReferenceArray`1"), null);
+			projections.Add(new TypeName("Windows.Foundation.Metadata", "GCPressureAmount"), null);
+			projections.Add(new TypeName("Windows.Foundation.Metadata", "GCPressureAttribute"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml", "CornerRadiusHelper"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml", "DurationHelper"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml", "GridLengthHelper"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml", "ThicknessHelper"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml.Controls.Primitives", "GeneratorPositionHelper"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml.Interop", "INotifyCollectionChanged"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml.Media", "MatrixHelper"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml.Media.Animation", "KeyTimeHelper"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml.Media.Animation", "RepeatBehaviorHelper"), null);
+			projections.Add(new TypeName("Windows.UI.Xaml.Media.Media3D", "Matrix3DHelper"), null);
+		}
+
+		private WindowsRuntimeProjection(ModuleReader module, Dictionary<int, string> strings)
+		{
+			this.module = module;
+			this.strings = strings;
+		}
+
+		internal static void Patch(ModuleReader module, Dictionary<int, string> strings, ref string imageRuntimeVersion, ref byte[] blobHeap)
+		{
+			if (!module.CustomAttribute.Sorted)
+			{
+				// HasAllowMultipleAttribute requires this
+				throw new NotImplementedException("CustomAttribute table must be sorted");
+			}
+
+			bool clr = imageRuntimeVersion.Contains(";");
+			if (clr)
+			{
+				imageRuntimeVersion = imageRuntimeVersion.Substring(imageRuntimeVersion.IndexOf(';') + 1);
+				if (imageRuntimeVersion.StartsWith("CLR", StringComparison.OrdinalIgnoreCase))
+				{
+					imageRuntimeVersion = imageRuntimeVersion.Substring(3);
+				}
+				imageRuntimeVersion = imageRuntimeVersion.TrimStart(' ');
+			}
+			else
+			{
+				Assembly mscorlib = module.universe.Mscorlib;
+				imageRuntimeVersion = mscorlib.__IsMissing ? "v4.0.30319" : mscorlib.ImageRuntimeVersion;
+			}
+
+			WindowsRuntimeProjection obj = new WindowsRuntimeProjection(module, strings);
+			obj.PatchAssemblyRef(ref blobHeap);
+			obj.PatchTypeRef();
+			obj.PatchTypes(clr);
+			obj.PatchMethodImpl();
+			obj.PatchCustomAttribute(ref blobHeap);
+		}
+
+		private void PatchAssemblyRef(ref byte[] blobHeap)
+		{
+			AssemblyRefTable assemblyRefs = module.AssemblyRef;
+			for (int i = 0; i < assemblyRefs.records.Length; i++)
+			{
+				if (module.GetString(assemblyRefs.records[i].Name) == "mscorlib")
+				{
+					Version ver = GetMscorlibVersion();
+					assemblyRefs.records[i].MajorVersion = (ushort)ver.Major;
+					assemblyRefs.records[i].MinorVersion = (ushort)ver.Minor;
+					assemblyRefs.records[i].BuildNumber = (ushort)ver.Build;
+					assemblyRefs.records[i].RevisionNumber = (ushort)ver.Revision;
+					break;
+				}
+			}
+
+			int publicKeyTokenMicrosoft = AddBlob(ref blobHeap, new byte[] { 0xB0, 0x3F, 0x5F, 0x7F, 0x11, 0xD5, 0x0A, 0x3A });
+			int publicKeyTokenEcma = AddBlob(ref blobHeap, new byte[] { 0xB7, 0x7A, 0x5C, 0x56, 0x19, 0x34, 0xE0, 0x89 });
+			assemblyRefTokens[(int)ProjectionAssembly.System_Runtime] = AddAssemblyReference("System.Runtime", publicKeyTokenMicrosoft);
+			assemblyRefTokens[(int)ProjectionAssembly.System_Runtime_InteropServices_WindowsRuntime] = AddAssemblyReference("System.Runtime.InteropServices.WindowsRuntime", publicKeyTokenMicrosoft);
+			assemblyRefTokens[(int)ProjectionAssembly.System_ObjectModel] = AddAssemblyReference("System.ObjectModel", publicKeyTokenMicrosoft);
+			assemblyRefTokens[(int)ProjectionAssembly.System_Runtime_WindowsRuntime] = AddAssemblyReference("System.Runtime.WindowsRuntime", publicKeyTokenEcma);
+			assemblyRefTokens[(int)ProjectionAssembly.System_Runtime_WindowsRuntime_UI_Xaml] = AddAssemblyReference("System.Runtime.WindowsRuntime.UI.Xaml", publicKeyTokenEcma);
+		}
+
+		private void PatchTypeRef()
+		{
+			TypeRefTable.Record[] typeRefs = module.TypeRef.records;
+			projectedTypeRefs = new bool[typeRefs.Length];
+			for (int i = 0; i < typeRefs.Length; i++)
+			{
+				Mapping mapping;
+				TypeName typeName = GetTypeRefName(i);
+				projections.TryGetValue(typeName, out mapping);
+				if (mapping != null)
+				{
+					typeRefs[i].ResolutionScope = assemblyRefTokens[(int)mapping.Assembly];
+					typeRefs[i].TypeNameSpace = GetString(mapping.TypeNamespace);
+					typeRefs[i].TypeName = GetString(mapping.TypeName);
+					projectedTypeRefs[i] = true;
+				}
+				switch (typeName.Namespace)
+				{
+					case "System":
+						switch (typeName.Name)
+						{
+							case "Attribute":
+								typeofSystemAttribute = (TypeRefTable.Index << 24) + i + 1;
+								break;
+							case "Enum":
+								typeofSystemEnum = (TypeRefTable.Index << 24) + i + 1;
+								break;
+							case "MulticastDelegate":
+								typeofSystemMulticastDelegate = (TypeRefTable.Index << 24) + i + 1;
+								break;
+						}
+						break;
+					case "Windows.Foundation":
+						switch (typeName.Name)
+						{
+							case "IClosable":
+								typeofSystemIDisposable = (TypeRefTable.Index << 24) + i + 1;
+								break;
+						}
+						break;
+					case "Windows.Foundation.Metadata":
+						switch (typeName.Name)
+						{
+							case "AllowMultipleAttribute":
+								typeofWindowsFoundationMetadataAllowMultipleAttribute = (TypeRefTable.Index << 24) + i + 1;
+								break;
+							case "AttributeUsageAttribute":
+								typeofSystemAttributeUsageAttribute = (TypeRefTable.Index << 24) + i + 1;
+								break;
+						}
+						break;
+				}
+			}
+		}
+
+		private void PatchTypes(bool clr)
+		{
+			TypeDefTable.Record[] types = module.TypeDef.records;
+			MethodDefTable.Record[] methods = module.MethodDef.records;
+			FieldTable.Record[] fields = module.Field.records;
+			for (int i = 0; i < types.Length; i++)
+			{
+				TypeAttributes attr = (TypeAttributes)types[i].Flags;
+				if ((attr & TypeAttributes.WindowsRuntime) != 0)
+				{
+					if (clr && (attr & (TypeAttributes.VisibilityMask | TypeAttributes.WindowsRuntime | TypeAttributes.Interface)) == (TypeAttributes.Public | TypeAttributes.WindowsRuntime))
+					{
+						types[i].TypeName = GetString("<WinRT>" + module.GetString(types[i].TypeName));
+						types[i].Flags &= (int)~TypeAttributes.Public;
+					}
+
+					if (types[i].Extends != typeofSystemAttribute && (!clr || (attr & TypeAttributes.Interface) == 0))
+					{
+						types[i].Flags |= (int)TypeAttributes.Import;
+					}
+					if (projections.ContainsKey(GetTypeDefName(i)))
+					{
+						types[i].Flags &= (int)~TypeAttributes.Public;
+					}
+
+					int endOfMethodList = i == types.Length - 1 ? methods.Length : types[i + 1].MethodList - 1;
+					for (int j = types[i].MethodList - 1; j < endOfMethodList; j++)
+					{
+						if (types[i].Extends == typeofSystemMulticastDelegate)
+						{
+							if (module.GetString(methods[j].Name) == ".ctor")
+							{
+								methods[j].Flags &= (int)~MethodAttributes.MemberAccessMask;
+								methods[j].Flags |= (int)MethodAttributes.Public;
+							}
+						}
+						else if (methods[j].RVA == 0)
+						{
+							methods[j].ImplFlags = (int)(MethodImplAttributes.Runtime | MethodImplAttributes.Managed | MethodImplAttributes.InternalCall);
+						}
+					}
+
+					if (types[i].Extends == typeofSystemEnum)
+					{
+						int endOfFieldList = i == types.Length - 1 ? fields.Length : types[i + 1].FieldList - 1;
+						for (int j = types[i].FieldList - 1; j < endOfFieldList; j++)
+						{
+							fields[j].Flags &= (int)~FieldAttributes.FieldAccessMask;
+							fields[j].Flags |= (int)FieldAttributes.Public;
+						}
+					}
+				}
+				else if (clr && (attr & (TypeAttributes.VisibilityMask | TypeAttributes.SpecialName)) == (TypeAttributes.NotPublic | TypeAttributes.SpecialName))
+				{
+					string name = module.GetString(types[i].TypeName);
+					if (name.StartsWith("<CLR>", StringComparison.Ordinal))
+					{
+						types[i].TypeName = GetString(name.Substring(5));
+						types[i].Flags |= (int)TypeAttributes.Public;
+						types[i].Flags &= (int)~TypeAttributes.SpecialName;
+					}
+				}
+			}
+		}
+
+		private void PatchMethodImpl()
+		{
+			MethodImplTable.Record[] methodImpls = module.MethodImpl.records;
+			MemberRefTable.Record[] memberRefs = module.MemberRef.records;
+			MethodDefTable.Record[] methods = module.MethodDef.records;
+			int[] typeSpecs = module.TypeSpec.records;
+			for (int i = 0; i < methodImpls.Length; i++)
+			{
+				int methodDefOrMemberRef = methodImpls[i].MethodDeclaration;
+				if ((methodDefOrMemberRef >> 24) == MemberRefTable.Index)
+				{
+					int typeDefOrRef = memberRefs[(methodDefOrMemberRef & 0xFFFFFF) - 1].Class;
+					if ((typeDefOrRef >> 24) == TypeSpecTable.Index)
+					{
+						typeDefOrRef = ReadTypeSpec(module.GetBlob(typeSpecs[(typeDefOrRef & 0xFFFFFF) - 1]));
+					}
+					if ((typeDefOrRef >> 24) == TypeRefTable.Index)
+					{
+						if (typeDefOrRef == typeofSystemIDisposable)
+						{
+							int dispose = GetString("Dispose");
+							methods[(methodImpls[i].MethodBody & 0xFFFFFF) - 1].Name = dispose;
+							memberRefs[(methodImpls[i].MethodDeclaration & 0xFFFFFF) - 1].Name = dispose;
+						}
+						else if (projectedTypeRefs[(typeDefOrRef & 0xFFFFFF) - 1])
+						{
+							methods[(methodImpls[i].MethodBody & 0xFFFFFF) - 1].Flags &= (int)~MethodAttributes.MemberAccessMask;
+							methods[(methodImpls[i].MethodBody & 0xFFFFFF) - 1].Flags |= (int)MethodAttributes.Private;
+							methodImpls[i].MethodBody = 0;
+							methodImpls[i].MethodDeclaration = 0;
+						}
+					}
+					else if ((typeDefOrRef >> 24) == TypeDefTable.Index)
+					{
+					}
+					else if ((typeDefOrRef >> 24) == TypeSpecTable.Index)
+					{
+						throw new NotImplementedException();
+					}
+					else
+					{
+						throw new BadImageFormatException();
+					}
+				}
+			}
+		}
+
+		private void PatchCustomAttribute(ref byte[] blobHeap)
+		{
+			MemberRefTable.Record[] memberRefs = module.MemberRef.records;
+			int ctorSystemAttributeUsageAttribute = -1;
+			int ctorWindowsFoundationMetadataAllowMultipleAttribute = -1;
+			for (int i = 0; i < memberRefs.Length; i++)
+			{
+				if (memberRefs[i].Class == typeofSystemAttributeUsageAttribute
+					&& module.GetString(memberRefs[i].Name) == ".ctor")
+				{
+					ctorSystemAttributeUsageAttribute = (MemberRefTable.Index << 24) + i + 1;
+				}
+				else if (memberRefs[i].Class == typeofWindowsFoundationMetadataAllowMultipleAttribute
+					&& module.GetString(memberRefs[i].Name) == ".ctor")
+				{
+					ctorWindowsFoundationMetadataAllowMultipleAttribute = (MemberRefTable.Index << 24) + i + 1;
+				}
+			}
+
+			if (ctorSystemAttributeUsageAttribute != -1)
+			{
+				CustomAttributeTable.Record[] customAttributes = module.CustomAttribute.records;
+				Dictionary<int, int> map = new Dictionary<int, int>();
+				for (int i = 0; i < customAttributes.Length; i++)
+				{
+					if (customAttributes[i].Type == ctorSystemAttributeUsageAttribute)
+					{
+						ByteReader br = module.GetBlob(customAttributes[i].Value);
+						br.ReadInt16();
+						AttributeTargets targets = MapAttributeTargets(br.ReadInt32());
+						if ((targets & AttributeTargets.Method) != 0)
+						{
+							// apart from the two types special cased below, Method implies Constructor
+							targets |= AttributeTargets.Constructor;
+							if (customAttributes[i].Parent >> 24 == TypeDefTable.Index)
+							{
+								TypeName typeName = GetTypeDefName((customAttributes[i].Parent & 0xFFFFFF) - 1);
+								if (typeName.Namespace == "Windows.Foundation.Metadata" && (typeName.Name == "OverloadAttribute" || typeName.Name == "DefaultOverloadAttribute"))
+								{
+									targets &= ~AttributeTargets.Constructor;
+								}
+							}
+						}
+						customAttributes[i].Value = GetAttributeUsageAttributeBlob(ref blobHeap, map, targets, HasAllowMultipleAttribute(customAttributes, i, ctorWindowsFoundationMetadataAllowMultipleAttribute));
+					}
+				}
+			}
+		}
+
+		private int AddAssemblyReference(string name, int publicKeyToken)
+		{
+			AssemblyRefTable.Record rec;
+			Version ver = GetMscorlibVersion();
+			rec.MajorVersion = (ushort)ver.Major;
+			rec.MinorVersion = (ushort)ver.Minor;
+			rec.BuildNumber = (ushort)ver.Build;
+			rec.RevisionNumber = (ushort)ver.Revision;
+			rec.Flags = 0;
+			rec.PublicKeyOrToken = publicKeyToken;
+			rec.Name = GetString(name);
+			rec.Culture = 0;
+			rec.HashValue = 0;
+			int token = 0x23000000 | module.AssemblyRef.FindOrAddRecord(rec);
+			Array.Resize(ref module.AssemblyRef.records, module.AssemblyRef.RowCount);
+			return token;
+		}
+
+		private TypeName GetTypeRefName(int index)
+		{
+			return new TypeName(module.GetString(module.TypeRef.records[index].TypeNameSpace), module.GetString(module.TypeRef.records[index].TypeName));
+		}
+
+		private TypeName GetTypeDefName(int index)
+		{
+			return new TypeName(module.GetString(module.TypeDef.records[index].TypeNamespace), module.GetString(module.TypeDef.records[index].TypeName));
+		}
+
+		private int GetString(string str)
+		{
+			int index;
+			if (!added.TryGetValue(str, out index))
+			{
+				index = -(added.Count + 1);
+				added.Add(str, index);
+				strings.Add(index, str);
+			}
+			return index;
+		}
+
+		private Version GetMscorlibVersion()
+		{
+			Assembly mscorlib = module.universe.Mscorlib;
+			return mscorlib.__IsMissing ? new Version(4, 0, 0, 0) : mscorlib.GetName().Version;
+		}
+
+		private static bool HasAllowMultipleAttribute(CustomAttributeTable.Record[] customAttributes, int i, int ctorWindowsFoundationMetadataAllowMultipleAttribute)
+		{
+			// we can assume that the CustomAttribute table is sorted, because we've checked the Sorted flag earlier
+			int owner = customAttributes[i].Parent;
+			while (i > 0 && customAttributes[i - 1].Parent == owner)
+			{
+				i--;
+			}
+			while (i < customAttributes.Length && customAttributes[i].Parent == owner)
+			{
+				if (customAttributes[i].Type == ctorWindowsFoundationMetadataAllowMultipleAttribute)
+				{
+					return true;
+				}
+				i++;
+			}
+			return false;
+		}
+
+		private static AttributeTargets MapAttributeTargets(int targets)
+		{
+			if (targets == -1)
+			{
+				return AttributeTargets.All;
+			}
+			AttributeTargets result = 0;
+			if ((targets & 1) != 0)
+			{
+				result |= AttributeTargets.Delegate;
+			}
+			if ((targets & 2) != 0)
+			{
+				result |= AttributeTargets.Enum;
+			}
+			if ((targets & 4) != 0)
+			{
+				result |= AttributeTargets.Event;
+			}
+			if ((targets & 8) != 0)
+			{
+				result |= AttributeTargets.Field;
+			}
+			if ((targets & 16) != 0)
+			{
+				result |= AttributeTargets.Interface;
+			}
+			if ((targets & 64) != 0)
+			{
+				result |= AttributeTargets.Method;
+			}
+			if ((targets & 128) != 0)
+			{
+				result |= AttributeTargets.Parameter;
+			}
+			if ((targets & 256) != 0)
+			{
+				result |= AttributeTargets.Property;
+			}
+			if ((targets & 512) != 0)
+			{
+				result |= AttributeTargets.Class;
+			}
+			if ((targets & 1024) != 0)
+			{
+				result |= AttributeTargets.Struct;
+			}
+			return result;
+		}
+
+		private static int GetAttributeUsageAttributeBlob(ref byte[] blobHeap, Dictionary<int, int> map, AttributeTargets targets, bool allowMultiple)
+		{
+			int key = (int)targets;
+			if (allowMultiple)
+			{
+				key |= unchecked((int)0x80000000);
+			}
+			int blob;
+			if (!map.TryGetValue(key, out blob))
+			{
+				blob = AddBlob(ref blobHeap, new byte[] { 0x01, 0x00, (byte)targets, (byte)((int)targets >> 8), (byte)((int)targets >> 16), (byte)((int)targets >> 24),
+					0x01, 0x00, 0x54, 0x02, 0x0D, 0x41, 0x6C, 0x6C, 0x6F, 0x77, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x65, allowMultiple ? (byte)0x01 : (byte)0x00 });
+				map.Add(key, blob);
+			}
+			return blob;
+		}
+
+		private static int ReadTypeSpec(ByteReader br)
+		{
+			if (br.ReadByte() != Signature.ELEMENT_TYPE_GENERICINST)
+			{
+				throw new NotImplementedException("Expected ELEMENT_TYPE_GENERICINST");
+			}
+			switch (br.ReadByte())
+			{
+				case Signature.ELEMENT_TYPE_CLASS:
+				case Signature.ELEMENT_TYPE_VALUETYPE:
+					break;
+				default:
+					throw new NotImplementedException("Expected ELEMENT_TYPE_CLASS or ELEMENT_TYPE_VALUETYPE");
+			}
+			int encoded = br.ReadCompressedUInt();
+			switch (encoded & 3)
+			{
+				case 0:
+					return (TypeDefTable.Index << 24) + (encoded >> 2);
+				case 1:
+					return (TypeRefTable.Index << 24) + (encoded >> 2);
+				case 2:
+					return (TypeSpecTable.Index << 24) + (encoded >> 2);
+				default:
+					throw new BadImageFormatException();
+			}
+		}
+
+		private static int AddBlob(ref byte[] blobHeap, byte[] blob)
+		{
+			if (blob.Length > 127)
+			{
+				throw new NotImplementedException();
+			}
+			int offset = blobHeap.Length;
+			Array.Resize(ref blobHeap, offset + blob.Length + 1);
+			blobHeap[offset] = (byte)blob.Length;
+			Buffer.BlockCopy(blob, 0, blobHeap, offset + 1, blob.Length);
+			return offset;
+		}
+
+		internal static bool IsProjectedValueType(string ns, string name, Module module)
+		{
+			return ((ns == "System.Collections.Generic" && name == "KeyValuePair`2")
+					|| (ns == "System" && name == "Nullable`1"))
+				&& module.Assembly.GetName().Name == "System.Runtime";
+		}
+
+		internal static bool IsProjectedReferenceType(string ns, string name, Module module)
+		{
+			return ((ns == "System" && name == "Exception")
+					|| (ns == "System" && name == "Type"))
+				&& module.Assembly.GetName().Name == "System.Runtime";
+		}
+	}
+}
diff --git a/external/ikvm/reflect/Reader/AssemblyReader.cs b/external/ikvm/reflect/Reader/AssemblyReader.cs
index 683d467..868ec2c 100644
--- a/external/ikvm/reflect/Reader/AssemblyReader.cs
+++ b/external/ikvm/reflect/Reader/AssemblyReader.cs
@@ -46,7 +46,7 @@ namespace IKVM.Reflection.Reader
 
 		public override string Location
 		{
-			get { return location; }
+			get { return location ?? ""; }
 		}
 
 		public override AssemblyName GetName()
@@ -200,7 +200,7 @@ namespace IKVM.Reflection.Reader
 
 		public override Module GetModule(string name)
 		{
-			if (name.Equals(manifestModule.ScopeName, StringComparison.InvariantCultureIgnoreCase))
+			if (name.Equals(manifestModule.ScopeName, StringComparison.OrdinalIgnoreCase))
 			{
 				return manifestModule;
 			}
@@ -216,7 +216,7 @@ namespace IKVM.Reflection.Reader
 		{
 			for (int i = 0; i < manifestModule.File.records.Length; i++)
 			{
-				if (name.Equals(manifestModule.GetString(manifestModule.File.records[i].Name), StringComparison.InvariantCultureIgnoreCase))
+				if (name.Equals(manifestModule.GetString(manifestModule.File.records[i].Name), StringComparison.OrdinalIgnoreCase))
 				{
 					return i;
 				}
@@ -269,7 +269,7 @@ namespace IKVM.Reflection.Reader
 						throw;
 					}
 				}
-				return externalModules[index] = new ModuleReader(this, manifestModule.universe, new MemoryStream(rawModule), location);
+				return externalModules[index] = new ModuleReader(this, manifestModule.universe, new MemoryStream(rawModule), location, false);
 			}
 		}
 
diff --git a/external/ikvm/reflect/Reader/ModuleReader.cs b/external/ikvm/reflect/Reader/ModuleReader.cs
index 97c46e1..5f3f7a8 100644
--- a/external/ikvm/reflect/Reader/ModuleReader.cs
+++ b/external/ikvm/reflect/Reader/ModuleReader.cs
@@ -91,16 +91,31 @@ namespace IKVM.Reflection.Reader
 
 			internal Type GetType(ModuleReader module)
 			{
-				return type ?? (type = module.ResolveExportedType(index));
+				// guard against circular type forwarding
+				if (type == MarkerType.Pinned)
+				{
+					TypeName typeName = module.GetTypeName(module.ExportedType.records[index].TypeNamespace, module.ExportedType.records[index].TypeName);
+					return module.universe.GetMissingTypeOrThrow(module, module, null, typeName).SetCyclicTypeForwarder();
+				}
+				else if (type == null)
+				{
+					type = MarkerType.Pinned;
+					type = module.ResolveExportedType(index);
+				}
+				return type;
 			}
 		}
 
-		internal ModuleReader(AssemblyReader assembly, Universe universe, Stream stream, string location)
+		internal ModuleReader(AssemblyReader assembly, Universe universe, Stream stream, string location, bool mapped)
 			: base(universe)
 		{
 			this.stream = universe != null && universe.MetadataOnly ? null : stream;
 			this.location = location;
-			Read(stream);
+			Read(stream, mapped);
+			if (universe != null && universe.WindowsRuntimeProjection && imageRuntimeVersion.StartsWith("WindowsRuntime ", StringComparison.Ordinal))
+			{
+				WindowsRuntimeProjection.Patch(this, strings, ref imageRuntimeVersion, ref blobHeap);
+			}
 			if (assembly == null && AssemblyTable.records.Length != 0)
 			{
 				assembly = new AssemblyReader(location, this);
@@ -108,10 +123,10 @@ namespace IKVM.Reflection.Reader
 			this.assembly = assembly;
 		}
 
-		private void Read(Stream stream)
+		private void Read(Stream stream, bool mapped)
 		{
 			BinaryReader br = new BinaryReader(stream);
-			peFile.Read(br);
+			peFile.Read(br, mapped);
 			stream.Seek(peFile.RvaToFileOffset(peFile.GetComDescriptorVirtualAddress()), SeekOrigin.Begin);
 			cliHeader.Read(br);
 			stream.Seek(peFile.RvaToFileOffset(cliHeader.MetaData.VirtualAddress), SeekOrigin.Begin);
@@ -511,37 +526,18 @@ namespace IKVM.Reflection.Reader
 		private Assembly ResolveAssemblyRefImpl(ref AssemblyRefTable.Record rec)
 		{
 			const int PublicKey = 0x0001;
-			string name = String.Format("{0}, Version={1}.{2}.{3}.{4}, Culture={5}, {6}={7}",
+			string name = AssemblyName.GetFullName(
 				GetString(rec.Name),
 				rec.MajorVersion,
 				rec.MinorVersion,
 				rec.BuildNumber,
 				rec.RevisionNumber,
 				rec.Culture == 0 ? "neutral" : GetString(rec.Culture),
-				(rec.Flags & PublicKey) == 0 ? "PublicKeyToken" : "PublicKey",
-				PublicKeyOrTokenToString(rec.PublicKeyOrToken));
+				rec.PublicKeyOrToken == 0 ? Empty<byte>.Array : (rec.Flags & PublicKey) == 0 ? GetBlobCopy(rec.PublicKeyOrToken) : AssemblyName.ComputePublicKeyToken(GetBlobCopy(rec.PublicKeyOrToken)),
+				rec.Flags);
 			return universe.Load(name, this, true);
 		}
 
-		private string PublicKeyOrTokenToString(int publicKeyOrToken)
-		{
-			if (publicKeyOrToken == 0)
-			{
-				return "null";
-			}
-			ByteReader br = GetBlob(publicKeyOrToken);
-			if (br.Length == 0)
-			{
-				return "null";
-			}
-			StringBuilder sb = new StringBuilder(br.Length * 2);
-			while (br.Length > 0)
-			{
-				sb.AppendFormat("{0:x2}", br.ReadByte());
-			}
-			return sb.ToString();
-		}
-
 		public override Guid ModuleVersionId
 		{
 			get
diff --git a/external/ikvm/reflect/Reader/PEReader.cs b/external/ikvm/reflect/Reader/PEReader.cs
index a8dadb3..7d2b4eb 100644
--- a/external/ikvm/reflect/Reader/PEReader.cs
+++ b/external/ikvm/reflect/Reader/PEReader.cs
@@ -261,9 +261,11 @@ namespace IKVM.Reflection.Reader
 		private MSDOS_HEADER msdos = new MSDOS_HEADER();
 		private IMAGE_NT_HEADERS headers = new IMAGE_NT_HEADERS();
 		private SectionHeader[] sections;
+		private bool mapped;
 
-		internal void Read(BinaryReader br)
+		internal void Read(BinaryReader br, bool mapped)
 		{
+			this.mapped = mapped;
 			msdos.signature = br.ReadUInt16();
 			br.BaseStream.Seek(58, SeekOrigin.Current);
 			msdos.peSignatureOffset = br.ReadUInt32();
@@ -306,6 +308,10 @@ namespace IKVM.Reflection.Reader
 
 		internal long RvaToFileOffset(DWORD rva)
 		{
+			if (mapped)
+			{
+				return rva;
+			}
 			for (int i = 0; i < sections.Length; i++)
 			{
 				if (rva >= sections[i].VirtualAddress && rva < sections[i].VirtualAddress + sections[i].VirtualSize)
diff --git a/external/ikvm/reflect/Reader/TypeDefImpl.cs b/external/ikvm/reflect/Reader/TypeDefImpl.cs
index e4a036d..7fb166a 100644
--- a/external/ikvm/reflect/Reader/TypeDefImpl.cs
+++ b/external/ikvm/reflect/Reader/TypeDefImpl.cs
@@ -351,49 +351,6 @@ namespace IKVM.Reflection.Reader
 			}
 		}
 
-		public override StructLayoutAttribute StructLayoutAttribute
-		{
-			get
-			{
-				StructLayoutAttribute layout;
-				switch (this.Attributes & TypeAttributes.LayoutMask)
-				{
-					case TypeAttributes.AutoLayout:
-						layout = new StructLayoutAttribute(LayoutKind.Auto);
-						break;
-					case TypeAttributes.SequentialLayout:
-						layout = new StructLayoutAttribute(LayoutKind.Sequential);
-						break;
-					case TypeAttributes.ExplicitLayout:
-						layout = new StructLayoutAttribute(LayoutKind.Explicit);
-						break;
-					default:
-						throw new BadImageFormatException();
-				}
-				switch (this.Attributes & TypeAttributes.StringFormatMask)
-				{
-					case TypeAttributes.AnsiClass:
-						layout.CharSet = CharSet.Ansi;
-						break;
-					case TypeAttributes.UnicodeClass:
-						layout.CharSet = CharSet.Unicode;
-						break;
-					case TypeAttributes.AutoClass:
-						layout.CharSet = CharSet.Auto;
-						break;
-					default:
-						layout.CharSet = CharSet.None;
-						break;
-				}
-				if (!__GetLayout(out layout.Pack, out layout.Size))
-				{
-					// compatibility with System.Reflection
-					layout.Pack = 8;
-				}
-				return layout;
-			}
-		}
-
 		public override bool __GetLayout(out int packingSize, out int typeSize)
 		{
 			foreach (int i in module.ClassLayout.Filter(this.MetadataToken))
diff --git a/external/ikvm/reflect/Type.cs b/external/ikvm/reflect/Type.cs
index fa9197b..3b70c99 100644
--- a/external/ikvm/reflect/Type.cs
+++ b/external/ikvm/reflect/Type.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2009-2012 Jeroen Frijters
+  Copyright (C) 2009-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -353,9 +353,47 @@ namespace IKVM.Reflection
 			throw new InvalidOperationException();
 		}
 
-		public virtual StructLayoutAttribute StructLayoutAttribute
+		public StructLayoutAttribute StructLayoutAttribute
 		{
-			get { return null; }
+			get
+			{
+				StructLayoutAttribute layout;
+				switch (this.Attributes & TypeAttributes.LayoutMask)
+				{
+					case TypeAttributes.AutoLayout:
+						layout = new StructLayoutAttribute(LayoutKind.Auto);
+						break;
+					case TypeAttributes.SequentialLayout:
+						layout = new StructLayoutAttribute(LayoutKind.Sequential);
+						break;
+					case TypeAttributes.ExplicitLayout:
+						layout = new StructLayoutAttribute(LayoutKind.Explicit);
+						break;
+					default:
+						throw new BadImageFormatException();
+				}
+				switch (this.Attributes & TypeAttributes.StringFormatMask)
+				{
+					case TypeAttributes.AnsiClass:
+						layout.CharSet = CharSet.Ansi;
+						break;
+					case TypeAttributes.UnicodeClass:
+						layout.CharSet = CharSet.Unicode;
+						break;
+					case TypeAttributes.AutoClass:
+						layout.CharSet = CharSet.Auto;
+						break;
+					default:
+						layout.CharSet = CharSet.None;
+						break;
+				}
+				if (!__GetLayout(out layout.Pack, out layout.Size))
+				{
+					// compatibility with System.Reflection
+					layout.Pack = 8;
+				}
+				return layout;
+			}
 		}
 
 		public virtual bool __GetLayout(out int packingSize, out int typeSize)
@@ -1908,28 +1946,6 @@ namespace IKVM.Reflection
 			}
 		}
 
-		internal bool IsPseudoCustomAttribute
-		{
-			get
-			{
-				Universe u = this.Module.universe;
-				return this == u.System_NonSerializedAttribute
-					|| this == u.System_SerializableAttribute
-					|| this == u.System_Runtime_InteropServices_DllImportAttribute
-					|| this == u.System_Runtime_InteropServices_FieldOffsetAttribute
-					|| this == u.System_Runtime_InteropServices_InAttribute
-					|| this == u.System_Runtime_InteropServices_MarshalAsAttribute
-					|| this == u.System_Runtime_InteropServices_OutAttribute
-					|| this == u.System_Runtime_InteropServices_StructLayoutAttribute
-					|| this == u.System_Runtime_InteropServices_OptionalAttribute
-					|| this == u.System_Runtime_InteropServices_PreserveSigAttribute
-					|| this == u.System_Runtime_InteropServices_ComImportAttribute
-					|| this == u.System_Runtime_CompilerServices_SpecialNameAttribute
-					|| this == u.System_Runtime_CompilerServices_MethodImplAttribute
-					;
-			}
-		}
-
 		internal Type MarkNotValueType()
 		{
 			typeFlags |= TypeFlags.NotValueType;
@@ -2004,6 +2020,11 @@ namespace IKVM.Reflection
 			return this;
 		}
 
+		internal virtual Type SetCyclicTypeForwarder()
+		{
+			return this;
+		}
+
 		protected void MarkEnumOrValueType(string typeNamespace, string typeName)
 		{
 			// we assume that mscorlib won't have nested types with these names,
@@ -2082,6 +2103,11 @@ namespace IKVM.Reflection
 		{
 			get { return false; }
 		}
+
+		public virtual bool __IsCyclicTypeForwarder
+		{
+			get { return false; }
+		}
 	}
 
 	abstract class ElementHolderType : TypeInfo
@@ -2933,9 +2959,9 @@ namespace IKVM.Reflection
 			get { return type.__ContainsMissingType || ContainsMissingType(args); }
 		}
 
-		public override StructLayoutAttribute StructLayoutAttribute
+		public override bool __GetLayout(out int packingSize, out int typeSize)
 		{
-			get { return type.StructLayoutAttribute; }
+			return type.__GetLayout(out packingSize, out typeSize);
 		}
 
 		internal override int GetModuleBuilderToken()
diff --git a/external/ikvm/reflect/Universe.cs b/external/ikvm/reflect/Universe.cs
index c4446ca..1b4b351 100644
--- a/external/ikvm/reflect/Universe.cs
+++ b/external/ikvm/reflect/Universe.cs
@@ -127,6 +127,7 @@ namespace IKVM.Reflection
 		DontProvideAutomaticDefaultConstructor = 8,
 		MetadataOnly = 16,
 		ResolveMissingMembers = 32,
+		DisableWindowsRuntimeProjection = 64,
 	}
 
 	public sealed class Universe : IDisposable
@@ -237,17 +238,17 @@ namespace IKVM.Reflection
 			get { return Load("mscorlib"); }
 		}
 
-		private Type ImportMscorlibType(System.Type type)
+		private Type ImportMscorlibType(string ns, string name)
 		{
 			if (Mscorlib.__IsMissing)
 			{
-				return Mscorlib.ResolveType(null, new TypeName(type.Namespace, type.Name));
+				return Mscorlib.ResolveType(null, new TypeName(ns, name));
 			}
 			// We use FindType instead of ResolveType here, because on some versions of mscorlib some of
 			// the special types we use/support are missing and the type properties are defined to
 			// return null in that case.
 			// Note that we don't have to unescape type.Name here, because none of the names contain special characters.
-			return Mscorlib.FindType(new TypeName(type.Namespace, type.Name));
+			return Mscorlib.FindType(new TypeName(ns, name));
 		}
 
 		private Type ResolvePrimitive(string name)
@@ -375,172 +376,172 @@ namespace IKVM.Reflection
 
 		internal Type System_DateTime
 		{
-			get { return typeof_System_DateTime ?? (typeof_System_DateTime = ImportMscorlibType(typeof(System.DateTime))); }
+			get { return typeof_System_DateTime ?? (typeof_System_DateTime = ImportMscorlibType("System", "DateTime")); }
 		}
 
 		internal Type System_DBNull
 		{
-			get { return typeof_System_DBNull ?? (typeof_System_DBNull = ImportMscorlibType(typeof(System.DBNull))); }
+			get { return typeof_System_DBNull ?? (typeof_System_DBNull = ImportMscorlibType("System", "DBNull")); }
 		}
 
 		internal Type System_Decimal
 		{
-			get { return typeof_System_Decimal ?? (typeof_System_Decimal = ImportMscorlibType(typeof(System.Decimal))); }
+			get { return typeof_System_Decimal ?? (typeof_System_Decimal = ImportMscorlibType("System", "Decimal")); }
 		}
 
 		internal Type System_NonSerializedAttribute
 		{
-			get { return typeof_System_NonSerializedAttribute ?? (typeof_System_NonSerializedAttribute = ImportMscorlibType(typeof(System.NonSerializedAttribute))); }
+			get { return typeof_System_NonSerializedAttribute ?? (typeof_System_NonSerializedAttribute = ImportMscorlibType("System", "NonSerializedAttribute")); }
 		}
 
 		internal Type System_SerializableAttribute
 		{
-			get { return typeof_System_SerializableAttribute ?? (typeof_System_SerializableAttribute = ImportMscorlibType(typeof(System.SerializableAttribute))); }
+			get { return typeof_System_SerializableAttribute ?? (typeof_System_SerializableAttribute = ImportMscorlibType("System", "SerializableAttribute")); }
 		}
 
 		internal Type System_AttributeUsageAttribute
 		{
-			get { return typeof_System_AttributeUsageAttribute ?? (typeof_System_AttributeUsageAttribute = ImportMscorlibType(typeof(System.AttributeUsageAttribute))); }
+			get { return typeof_System_AttributeUsageAttribute ?? (typeof_System_AttributeUsageAttribute = ImportMscorlibType("System", "AttributeUsageAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_DllImportAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_DllImportAttribute ?? (typeof_System_Runtime_InteropServices_DllImportAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.DllImportAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_DllImportAttribute ?? (typeof_System_Runtime_InteropServices_DllImportAttribute = ImportMscorlibType("System.Runtime.InteropServices", "DllImportAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_FieldOffsetAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_FieldOffsetAttribute ?? (typeof_System_Runtime_InteropServices_FieldOffsetAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.FieldOffsetAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_FieldOffsetAttribute ?? (typeof_System_Runtime_InteropServices_FieldOffsetAttribute = ImportMscorlibType("System.Runtime.InteropServices", "FieldOffsetAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_InAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_InAttribute ?? (typeof_System_Runtime_InteropServices_InAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.InAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_InAttribute ?? (typeof_System_Runtime_InteropServices_InAttribute = ImportMscorlibType("System.Runtime.InteropServices", "InAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_MarshalAsAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_MarshalAsAttribute ?? (typeof_System_Runtime_InteropServices_MarshalAsAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.MarshalAsAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_MarshalAsAttribute ?? (typeof_System_Runtime_InteropServices_MarshalAsAttribute = ImportMscorlibType("System.Runtime.InteropServices", "MarshalAsAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_UnmanagedType
 		{
-			get { return typeof_System_Runtime_InteropServices_UnmanagedType ?? (typeof_System_Runtime_InteropServices_UnmanagedType = ImportMscorlibType(typeof(System.Runtime.InteropServices.UnmanagedType))); }
+			get { return typeof_System_Runtime_InteropServices_UnmanagedType ?? (typeof_System_Runtime_InteropServices_UnmanagedType = ImportMscorlibType("System.Runtime.InteropServices", "UnmanagedType")); }
 		}
 
 		internal Type System_Runtime_InteropServices_VarEnum
 		{
-			get { return typeof_System_Runtime_InteropServices_VarEnum ?? (typeof_System_Runtime_InteropServices_VarEnum = ImportMscorlibType(typeof(System.Runtime.InteropServices.VarEnum))); }
+			get { return typeof_System_Runtime_InteropServices_VarEnum ?? (typeof_System_Runtime_InteropServices_VarEnum = ImportMscorlibType("System.Runtime.InteropServices", "VarEnum")); }
 		}
 
 		internal Type System_Runtime_InteropServices_OutAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_OutAttribute ?? (typeof_System_Runtime_InteropServices_OutAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.OutAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_OutAttribute ?? (typeof_System_Runtime_InteropServices_OutAttribute = ImportMscorlibType("System.Runtime.InteropServices", "OutAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_StructLayoutAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_StructLayoutAttribute ?? (typeof_System_Runtime_InteropServices_StructLayoutAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.StructLayoutAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_StructLayoutAttribute ?? (typeof_System_Runtime_InteropServices_StructLayoutAttribute = ImportMscorlibType("System.Runtime.InteropServices", "StructLayoutAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_OptionalAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_OptionalAttribute ?? (typeof_System_Runtime_InteropServices_OptionalAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.OptionalAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_OptionalAttribute ?? (typeof_System_Runtime_InteropServices_OptionalAttribute = ImportMscorlibType("System.Runtime.InteropServices", "OptionalAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_PreserveSigAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_PreserveSigAttribute ?? (typeof_System_Runtime_InteropServices_PreserveSigAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.PreserveSigAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_PreserveSigAttribute ?? (typeof_System_Runtime_InteropServices_PreserveSigAttribute = ImportMscorlibType("System.Runtime.InteropServices", "PreserveSigAttribute")); }
 		}
 
 		internal Type System_Runtime_InteropServices_CallingConvention
 		{
-			get { return typeof_System_Runtime_InteropServices_CallingConvention ?? (typeof_System_Runtime_InteropServices_CallingConvention = ImportMscorlibType(typeof(System.Runtime.InteropServices.CallingConvention))); }
+			get { return typeof_System_Runtime_InteropServices_CallingConvention ?? (typeof_System_Runtime_InteropServices_CallingConvention = ImportMscorlibType("System.Runtime.InteropServices", "CallingConvention")); }
 		}
 
 		internal Type System_Runtime_InteropServices_CharSet
 		{
-			get { return typeof_System_Runtime_InteropServices_CharSet ?? (typeof_System_Runtime_InteropServices_CharSet = ImportMscorlibType(typeof(System.Runtime.InteropServices.CharSet))); }
+			get { return typeof_System_Runtime_InteropServices_CharSet ?? (typeof_System_Runtime_InteropServices_CharSet = ImportMscorlibType("System.Runtime.InteropServices", "CharSet")); }
 		}
 
 		internal Type System_Runtime_InteropServices_ComImportAttribute
 		{
-			get { return typeof_System_Runtime_InteropServices_ComImportAttribute ?? (typeof_System_Runtime_InteropServices_ComImportAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.ComImportAttribute))); }
+			get { return typeof_System_Runtime_InteropServices_ComImportAttribute ?? (typeof_System_Runtime_InteropServices_ComImportAttribute = ImportMscorlibType("System.Runtime.InteropServices", "ComImportAttribute")); }
 		}
 
 		internal Type System_Runtime_CompilerServices_DecimalConstantAttribute
 		{
-			get { return typeof_System_Runtime_CompilerServices_DecimalConstantAttribute ?? (typeof_System_Runtime_CompilerServices_DecimalConstantAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.DecimalConstantAttribute))); }
+			get { return typeof_System_Runtime_CompilerServices_DecimalConstantAttribute ?? (typeof_System_Runtime_CompilerServices_DecimalConstantAttribute = ImportMscorlibType("System.Runtime.CompilerServices", "DecimalConstantAttribute")); }
 		}
 
 		internal Type System_Runtime_CompilerServices_SpecialNameAttribute
 		{
-			get { return typeof_System_Runtime_CompilerServices_SpecialNameAttribute ?? (typeof_System_Runtime_CompilerServices_SpecialNameAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.SpecialNameAttribute))); }
+			get { return typeof_System_Runtime_CompilerServices_SpecialNameAttribute ?? (typeof_System_Runtime_CompilerServices_SpecialNameAttribute = ImportMscorlibType("System.Runtime.CompilerServices", "SpecialNameAttribute")); }
 		}
 
 		internal Type System_Runtime_CompilerServices_MethodImplAttribute
 		{
-			get { return typeof_System_Runtime_CompilerServices_MethodImplAttribute ?? (typeof_System_Runtime_CompilerServices_MethodImplAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.MethodImplAttribute))); }
+			get { return typeof_System_Runtime_CompilerServices_MethodImplAttribute ?? (typeof_System_Runtime_CompilerServices_MethodImplAttribute = ImportMscorlibType("System.Runtime.CompilerServices", "MethodImplAttribute")); }
 		}
 
 		internal Type System_Security_SuppressUnmanagedCodeSecurityAttribute
 		{
-			get { return typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute ?? (typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute = ImportMscorlibType(typeof(System.Security.SuppressUnmanagedCodeSecurityAttribute))); }
+			get { return typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute ?? (typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute = ImportMscorlibType("System.Security", "SuppressUnmanagedCodeSecurityAttribute")); }
 		}
 
 		internal Type System_Reflection_AssemblyCopyrightAttribute
 		{
-			get { return typeof_System_Reflection_AssemblyCopyrightAttribute ?? (typeof_System_Reflection_AssemblyCopyrightAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyCopyrightAttribute))); }
+			get { return typeof_System_Reflection_AssemblyCopyrightAttribute ?? (typeof_System_Reflection_AssemblyCopyrightAttribute = ImportMscorlibType("System.Reflection", "AssemblyCopyrightAttribute")); }
 		}
 
 		internal Type System_Reflection_AssemblyTrademarkAttribute
 		{
-			get { return typeof_System_Reflection_AssemblyTrademarkAttribute ?? (typeof_System_Reflection_AssemblyTrademarkAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyTrademarkAttribute))); }
+			get { return typeof_System_Reflection_AssemblyTrademarkAttribute ?? (typeof_System_Reflection_AssemblyTrademarkAttribute = ImportMscorlibType("System.Reflection", "AssemblyTrademarkAttribute")); }
 		}
 
 		internal Type System_Reflection_AssemblyProductAttribute
 		{
-			get { return typeof_System_Reflection_AssemblyProductAttribute ?? (typeof_System_Reflection_AssemblyProductAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyProductAttribute))); }
+			get { return typeof_System_Reflection_AssemblyProductAttribute ?? (typeof_System_Reflection_AssemblyProductAttribute = ImportMscorlibType("System.Reflection", "AssemblyProductAttribute")); }
 		}
 
 		internal Type System_Reflection_AssemblyCompanyAttribute
 		{
-			get { return typeof_System_Reflection_AssemblyCompanyAttribute ?? (typeof_System_Reflection_AssemblyCompanyAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyCompanyAttribute))); }
+			get { return typeof_System_Reflection_AssemblyCompanyAttribute ?? (typeof_System_Reflection_AssemblyCompanyAttribute = ImportMscorlibType("System.Reflection", "AssemblyCompanyAttribute")); }
 		}
 
 		internal Type System_Reflection_AssemblyDescriptionAttribute
 		{
-			get { return typeof_System_Reflection_AssemblyDescriptionAttribute ?? (typeof_System_Reflection_AssemblyDescriptionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyDescriptionAttribute))); }
+			get { return typeof_System_Reflection_AssemblyDescriptionAttribute ?? (typeof_System_Reflection_AssemblyDescriptionAttribute = ImportMscorlibType("System.Reflection", "AssemblyDescriptionAttribute")); }
 		}
 
 		internal Type System_Reflection_AssemblyTitleAttribute
 		{
-			get { return typeof_System_Reflection_AssemblyTitleAttribute ?? (typeof_System_Reflection_AssemblyTitleAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyTitleAttribute))); }
+			get { return typeof_System_Reflection_AssemblyTitleAttribute ?? (typeof_System_Reflection_AssemblyTitleAttribute = ImportMscorlibType("System.Reflection", "AssemblyTitleAttribute")); }
 		}
 
 		internal Type System_Reflection_AssemblyInformationalVersionAttribute
 		{
-			get { return typeof_System_Reflection_AssemblyInformationalVersionAttribute ?? (typeof_System_Reflection_AssemblyInformationalVersionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyInformationalVersionAttribute))); }
+			get { return typeof_System_Reflection_AssemblyInformationalVersionAttribute ?? (typeof_System_Reflection_AssemblyInformationalVersionAttribute = ImportMscorlibType("System.Reflection", "AssemblyInformationalVersionAttribute")); }
 		}
 
 		internal Type System_Reflection_AssemblyFileVersionAttribute
 		{
-			get { return typeof_System_Reflection_AssemblyFileVersionAttribute ?? (typeof_System_Reflection_AssemblyFileVersionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyFileVersionAttribute))); }
+			get { return typeof_System_Reflection_AssemblyFileVersionAttribute ?? (typeof_System_Reflection_AssemblyFileVersionAttribute = ImportMscorlibType("System.Reflection", "AssemblyFileVersionAttribute")); }
 		}
 
 		internal Type System_Security_Permissions_CodeAccessSecurityAttribute
 		{
-			get { return typeof_System_Security_Permissions_CodeAccessSecurityAttribute ?? (typeof_System_Security_Permissions_CodeAccessSecurityAttribute = ImportMscorlibType(typeof(System.Security.Permissions.CodeAccessSecurityAttribute))); }
+			get { return typeof_System_Security_Permissions_CodeAccessSecurityAttribute ?? (typeof_System_Security_Permissions_CodeAccessSecurityAttribute = ImportMscorlibType("System.Security.Permissions", "CodeAccessSecurityAttribute")); }
 		}
 
 		internal Type System_Security_Permissions_PermissionSetAttribute
 		{
-			get { return typeof_System_Security_Permissions_PermissionSetAttribute ?? (typeof_System_Security_Permissions_PermissionSetAttribute = ImportMscorlibType(typeof(System.Security.Permissions.PermissionSetAttribute))); }
+			get { return typeof_System_Security_Permissions_PermissionSetAttribute ?? (typeof_System_Security_Permissions_PermissionSetAttribute = ImportMscorlibType("System.Security.Permissions", "PermissionSetAttribute")); }
 		}
 
 		internal Type System_Security_Permissions_SecurityAction
 		{
-			get { return typeof_System_Security_Permissions_SecurityAction ?? (typeof_System_Security_Permissions_SecurityAction = ImportMscorlibType(typeof(System.Security.Permissions.SecurityAction))); }
+			get { return typeof_System_Security_Permissions_SecurityAction ?? (typeof_System_Security_Permissions_SecurityAction = ImportMscorlibType("System.Security.Permissions", "SecurityAction")); }
 		}
 
 		internal bool HasMscorlib
@@ -664,11 +665,21 @@ namespace IKVM.Reflection
 
 		public RawModule OpenRawModule(Stream stream, string location)
 		{
+			return OpenRawModule(stream, location, false);
+		}
+
+		public RawModule OpenMappedRawModule(Stream stream, string location)
+		{
+			return OpenRawModule(stream, location, true);
+		}
+
+		private RawModule OpenRawModule(Stream stream, string location, bool mapped)
+		{
 			if (!stream.CanRead || !stream.CanSeek || stream.Position != 0)
 			{
 				throw new ArgumentException("Stream must support read/seek and current position must be zero.", "stream");
 			}
-			return new RawModule(new ModuleReader(null, this, stream, location));
+			return new RawModule(new ModuleReader(null, this, stream, location, mapped));
 		}
 
 		public Assembly LoadAssembly(RawModule module)
@@ -723,7 +734,7 @@ namespace IKVM.Reflection
 				for (int i = 0; i < assemblies.Count; i++)
 				{
 					AssemblyComparisonResult result;
-					if (simpleName.Equals(assemblies[i].Name, StringComparison.InvariantCultureIgnoreCase)
+					if (simpleName.Equals(assemblies[i].Name, StringComparison.OrdinalIgnoreCase)
 						&& CompareAssemblyIdentity(refname, false, assemblies[i].FullName, false, out result))
 					{
 						asm = assemblies[i];
@@ -741,7 +752,7 @@ namespace IKVM.Reflection
 			foreach (AssemblyBuilder asm in dynamicAssemblies)
 			{
 				AssemblyComparisonResult result;
-				if (simpleName.Equals(asm.Name, StringComparison.InvariantCultureIgnoreCase)
+				if (simpleName.Equals(asm.Name, StringComparison.OrdinalIgnoreCase)
 					&& CompareAssemblyIdentity(refname, false, asm.FullName, false, out result))
 				{
 					return asm;
@@ -914,22 +925,17 @@ namespace IKVM.Reflection
 
 		public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access)
 		{
-			return DefineDynamicAssemblyImpl(name, access, null, null, null, null);
+			return new AssemblyBuilder(this, name, null, null);
 		}
 
 		public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, IEnumerable<CustomAttributeBuilder> assemblyAttributes)
 		{
-			AssemblyBuilder ab = DefineDynamicAssembly(name, access);
-			foreach (CustomAttributeBuilder cab in assemblyAttributes)
-			{
-				ab.SetCustomAttribute(cab);
-			}
-			return ab;
+			return new AssemblyBuilder(this, name, null, assemblyAttributes);
 		}
 
 		public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, string dir)
 		{
-			return DefineDynamicAssemblyImpl(name, access, dir, null, null, null);
+			return new AssemblyBuilder(this, name, dir, null);
 		}
 
 #if NET_4_0
@@ -937,14 +943,24 @@ namespace IKVM.Reflection
 #endif
 		public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, string dir, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet refusedPermissions)
 		{
-			return DefineDynamicAssemblyImpl(name, access, dir, requiredPermissions, optionalPermissions, refusedPermissions);
+			AssemblyBuilder ab = new AssemblyBuilder(this, name, dir, null);
+			AddLegacyPermissionSet(ab, requiredPermissions, System.Security.Permissions.SecurityAction.RequestMinimum);
+			AddLegacyPermissionSet(ab, optionalPermissions, System.Security.Permissions.SecurityAction.RequestOptional);
+			AddLegacyPermissionSet(ab, refusedPermissions, System.Security.Permissions.SecurityAction.RequestRefuse);
+			return ab;
+		}
+
+		private static void AddLegacyPermissionSet(AssemblyBuilder ab, PermissionSet permissionSet, System.Security.Permissions.SecurityAction action)
+		{
+			if (permissionSet != null)
+			{
+				ab.__AddDeclarativeSecurity(CustomAttributeBuilder.__FromBlob(CustomAttributeBuilder.LegacyPermissionSet, (int)action, Encoding.Unicode.GetBytes(permissionSet.ToXml().ToString())));
+			}
 		}
 
-		private AssemblyBuilder DefineDynamicAssemblyImpl(AssemblyName name, AssemblyBuilderAccess access, string dir, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet refusedPermissions)
+		internal void RegisterDynamicAssembly(AssemblyBuilder asm)
 		{
-			AssemblyBuilder asm = new AssemblyBuilder(this, name, dir, requiredPermissions, optionalPermissions, refusedPermissions);
 			dynamicAssemblies.Add(asm);
-			return asm;
  		}
 
 		internal void RenameAssembly(Assembly assembly, AssemblyName oldName)
@@ -1167,6 +1183,11 @@ namespace IKVM.Reflection
 			}
 		}
 
+		public static Universe FromAssembly(Assembly assembly)
+		{
+			return assembly.universe;
+		}
+
 		internal bool ResolveMissingTypeIsValueType(MissingType missingType)
 		{
 			if (missingTypeIsValueType != null)
@@ -1190,5 +1211,10 @@ namespace IKVM.Reflection
 		{
 			get { return (options & UniverseOptions.MetadataOnly) != 0; }
 		}
+
+		internal bool WindowsRuntimeProjection
+		{
+			get { return (options & UniverseOptions.DisableWindowsRuntimeProjection) == 0; }
+		}
 	}
 }
diff --git a/external/ikvm/reflect/Writer/MetadataWriter.cs b/external/ikvm/reflect/Writer/MetadataWriter.cs
index 909b1c0..aa86e94 100644
--- a/external/ikvm/reflect/Writer/MetadataWriter.cs
+++ b/external/ikvm/reflect/Writer/MetadataWriter.cs
@@ -58,6 +58,15 @@ namespace IKVM.Reflection.Writer
 			bb.WriteTo(stream);
 		}
 
+		internal void WriteAsciiz(string value)
+		{
+			foreach (char c in value)
+			{
+				stream.WriteByte((byte)c);
+			}
+			stream.WriteByte(0);
+		}
+
 		internal void Write(byte[] value)
 		{
 			stream.Write(value, 0, value.Length);
diff --git a/external/ikvm/reflect/Writer/PEWriter.cs b/external/ikvm/reflect/Writer/PEWriter.cs
index fd6d979..da9a1a8 100644
--- a/external/ikvm/reflect/Writer/PEWriter.cs
+++ b/external/ikvm/reflect/Writer/PEWriter.cs
@@ -241,33 +241,15 @@ namespace IKVM.Reflection.Writer
 			if (Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
 			{
 				bw.Write((DWORD)SizeOfStackReserve);
-			}
-			else
-			{
-				bw.Write(SizeOfStackReserve);
-			}
-			if (Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
-			{
 				bw.Write((DWORD)SizeOfStackCommit);
-			}
-			else
-			{
-				bw.Write(SizeOfStackCommit);
-			}
-			if (Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
-			{
 				bw.Write((DWORD)SizeOfHeapReserve);
-			}
-			else
-			{
-				bw.Write(SizeOfHeapReserve);
-			}
-			if (Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
-			{
 				bw.Write((DWORD)SizeOfHeapCommit);
 			}
 			else
 			{
+				bw.Write(SizeOfStackReserve);
+				bw.Write(SizeOfStackCommit);
+				bw.Write(SizeOfHeapReserve);
 				bw.Write(SizeOfHeapCommit);
 			}
 			bw.Write(LoaderFlags);
diff --git a/external/ikvm/reflect/Writer/TextSection.cs b/external/ikvm/reflect/Writer/TextSection.cs
index b0c0fe3..d9b055b 100644
--- a/external/ikvm/reflect/Writer/TextSection.cs
+++ b/external/ikvm/reflect/Writer/TextSection.cs
@@ -606,14 +606,12 @@ namespace IKVM.Reflection.Writer
 
 				// Now write the actual names
 				text.AssertRVA(mw, namesRVA);
-				mw.Write(Encoding.ASCII.GetBytes(text.moduleBuilder.fileName));
-				mw.Write((byte)0);
+				mw.WriteAsciiz(text.moduleBuilder.fileName);
 				foreach (UnmanagedExport exp in text.moduleBuilder.unmanagedExports)
 				{
 					if (exp.name != null)
 					{
-						mw.Write(Encoding.ASCII.GetBytes(exp.name));
-						mw.Write((byte)0);
+						mw.WriteAsciiz(exp.name);
 					}
 				}
 				text.AssertRVA(mw, namesRVA + namesLength);
@@ -677,7 +675,7 @@ namespace IKVM.Reflection.Writer
 				{
 					return -1;
 				}
-				return x.name.CompareTo(y.name);
+				return String.CompareOrdinal(x.name, y.name);
 			}
 
 			private static int CompareUnmanagedExportOrdinals(UnmanagedExport x, UnmanagedExport y)
@@ -814,16 +812,15 @@ namespace IKVM.Reflection.Writer
 			mw.Write((ushort)0);		// Hint
 			if ((peWriter.Headers.FileHeader.Characteristics & IMAGE_FILE_HEADER.IMAGE_FILE_DLL) != 0)
 			{
-				mw.Write(System.Text.Encoding.ASCII.GetBytes("_CorDllMain"));
+				mw.WriteAsciiz("_CorDllMain");
 			}
 			else
 			{
-				mw.Write(System.Text.Encoding.ASCII.GetBytes("_CorExeMain"));
+				mw.WriteAsciiz("_CorExeMain");
 			}
-			mw.Write((byte)0);
 			// Name
-			mw.Write(System.Text.Encoding.ASCII.GetBytes("mscoree.dll"));
-			mw.Write((ushort)0);
+			mw.WriteAsciiz("mscoree.dll");
+			mw.Write((byte)0);
 		}
 
 		internal int Length
diff --git a/external/ikvm/reflect/reflect.build b/external/ikvm/reflect/reflect.build
index 336c5a5..3aeae30 100644
--- a/external/ikvm/reflect/reflect.build
+++ b/external/ikvm/reflect/reflect.build
@@ -1,4 +1,27 @@
 <?xml version="1.0"?>
+<!--
+  Copyright (C) 2002-2013 Jeroen Frijters
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jeroen Frijters
+  jeroen at frijters.net
+  
+-->
 <project name="reflect" default="IKVM.Reflection">
     <include buildfile="../ikvm.include" />
 
@@ -52,6 +75,7 @@
                 <include name="Module.cs" />
                 <include name="ParameterInfo.cs" />
                 <include name="ParameterModifier.cs" />
+                <include name="Projection.cs" />
                 <include name="PropertyInfo.cs" />
                 <include name="PropertySignature.cs" />
                 <include name="Signature.cs" />
diff --git a/external/ikvm/runtime/ClassFile.cs b/external/ikvm/runtime/ClassFile.cs
index c3cf3e8..db68411 100644
--- a/external/ikvm/runtime/ClassFile.cs
+++ b/external/ikvm/runtime/ClassFile.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2012 Jeroen Frijters
+  Copyright (C) 2002-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -65,8 +65,7 @@ namespace IKVM.Internal
 		private const ushort FLAG_MASK_MAJORVERSION = 0xFF;
 		private const ushort FLAG_MASK_DEPRECATED = 0x100;
 		private const ushort FLAG_MASK_INTERNAL = 0x200;
-		private const ushort FLAG_MASK_EFFECTIVELY_FINAL = 0x400;
-		private const ushort FLAG_HAS_CALLERID = 0x800;
+		private const ushort FLAG_CALLERSENSITIVE = 0x400;
 		private ConstantPoolItemClass[] interfaces;
 		private Field[] fields;
 		private Method[] methods;
@@ -84,7 +83,7 @@ namespace IKVM.Internal
 		private static class SupportedVersions
 		{
 			internal static readonly int Minimum = 45;
-			internal static readonly int Maximum = JVM.SafeGetEnvironmentVariable("IKVM_EXPERIMENTAL_JDK_8") != null ? 52 : 51;
+			internal static readonly int Maximum = Experimental.JDK_8 ? 52 : 51;
 		}
 
 #if STATIC_COMPILER
@@ -424,8 +423,9 @@ namespace IKVM.Internal
 							}
 							else
 							{
-								int class_index = br.ReadUInt16();
-								int method_index = br.ReadUInt16();
+								ushort class_index = br.ReadUInt16();
+								ushort method_index = br.ReadUInt16();
+								ValidateConstantPoolItemClass(inputClassName, class_index);
 								if(method_index == 0)
 								{
 									enclosingMethod = new string[] {
@@ -436,7 +436,11 @@ namespace IKVM.Internal
 								}
 								else
 								{
-									ConstantPoolItemNameAndType m = (ConstantPoolItemNameAndType)GetConstantPoolItem(method_index);
+									ConstantPoolItemNameAndType m = GetConstantPoolItem(method_index) as ConstantPoolItemNameAndType;
+									if(m == null)
+									{
+										throw new ClassFormatError("{0} (Bad constant pool index #{1})", inputClassName, method_index);
+									}
 									enclosingMethod = new string[] {
 										GetConstantPoolClass(class_index),
 										GetConstantPoolUtf8String(utf8_cp, m.name_index),
@@ -1211,19 +1215,6 @@ namespace IKVM.Internal
 			flags |= FLAG_MASK_INTERNAL;
 		}
 
-		internal void SetEffectivelyFinal()
-		{
-			flags |= FLAG_MASK_EFFECTIVELY_FINAL;
-		}
-
-		internal bool IsEffectivelyFinal
-		{
-			get
-			{
-				return (flags & FLAG_MASK_EFFECTIVELY_FINAL) != 0;
-			}
-		}
-
 		internal bool HasInitializedFields
 		{
 			get
@@ -1429,7 +1420,7 @@ namespace IKVM.Internal
 			{
 				if(typeWrapper == VerifierTypeWrapper.Null)
 				{
-					TypeWrapper tw = ClassLoaderWrapper.LoadClassNoThrow(thisType.GetClassLoader(), name);
+					TypeWrapper tw = ClassLoaderWrapper.LoadClassNoThrow(thisType.GetClassLoader(), name, true);
 #if !STATIC_COMPILER && !FIRST_PASS
 					if(!tw.IsUnloadable)
 					{
@@ -1765,6 +1756,10 @@ namespace IKVM.Internal
 
 			private static MethodWrapper GetInterfaceMethod(TypeWrapper wrapper, string name, string sig)
 			{
+				if(wrapper.IsUnloadable)
+				{
+					return null;
+				}
 				MethodWrapper method = wrapper.GetMethodWrapper(name, sig, false);
 				if(method != null)
 				{
@@ -1786,7 +1781,7 @@ namespace IKVM.Internal
 			{
 				base.Link(thisType);
 				TypeWrapper wrapper = GetClassType();
-				if(wrapper != null && !wrapper.IsUnloadable)
+				if(wrapper != null)
 				{
 					method = GetInterfaceMethod(wrapper, Name, Signature);
 					if(method == null)
@@ -1919,6 +1914,8 @@ namespace IKVM.Internal
 					case RefKind.invokeStatic:
 					case RefKind.newInvokeSpecial:
 						cpi = classFile.GetConstantPoolItem(method_index) as ConstantPoolItemMethodref;
+						if (cpi == null && classFile.MajorVersion >= 52 && (RefKind)ref_kind == RefKind.invokeStatic)
+							goto case RefKind.invokeInterface;
 						break;
 					case RefKind.invokeInterface:
 						cpi = classFile.GetConstantPoolItem(method_index) as ConstantPoolItemInterfaceMethodref;
@@ -2562,6 +2559,7 @@ namespace IKVM.Internal
 			private Code code;
 			private string[] exceptions;
 			private LowFreqData low;
+			private MethodParametersEntry[] parameters;
 
 			sealed class LowFreqData
 			{
@@ -2589,9 +2587,10 @@ namespace IKVM.Internal
 					if((ReferenceEquals(Name, StringConstants.INIT) && (IsStatic || IsSynchronized || IsFinal || IsAbstract || IsNative))
 						|| (IsPrivate && IsPublic) || (IsPrivate && IsProtected) || (IsPublic && IsProtected)
 						|| (IsAbstract && (IsFinal || IsNative || IsPrivate || IsStatic || IsSynchronized))
-						|| (classFile.IsInterface && (!IsPublic || !IsAbstract)))
+						|| (classFile.IsInterface && classFile.MajorVersion <= 51 && (!IsPublic || IsFinal || IsNative || IsSynchronized || !IsAbstract))
+						|| (classFile.IsInterface && classFile.MajorVersion >= 52 && (!(IsPublic || IsPrivate) || IsFinal || IsNative || IsSynchronized)))
 					{
-						throw new ClassFormatError("{0} (Illegal method modifiers: 0x{1:X})", classFile.Name, access_flags);
+						throw new ClassFormatError("Method {0} in class {1} has illegal modifiers: 0x{2:X}", Name, classFile.Name, (int)access_flags);
 					}
 				}
 				int attributes_count = br.ReadUInt16();
@@ -2656,6 +2655,15 @@ namespace IKVM.Internal
 								goto default;
 							}
 							annotations = ReadAnnotations(br, classFile, utf8_cp);
+#if STATIC_COMPILER
+							foreach(object[] annot in annotations)
+							{
+								if(annot[1].Equals("Lsun/reflect/CallerSensitive;"))
+								{
+									flags |= FLAG_CALLERSENSITIVE;
+								}
+							}
+#endif
 							break;
 						case "RuntimeVisibleParameterAnnotations":
 						{
@@ -2723,10 +2731,6 @@ namespace IKVM.Internal
 										flags |= FLAG_MASK_INTERNAL;
 									}
 								}
-								if(annot[1].Equals("Likvm/internal/HasCallerID;"))
-								{
-									flags |= FLAG_HAS_CALLERID;
-								}
 								if(annot[1].Equals("Likvm/lang/DllExport;"))
 								{
 									string name = null;
@@ -2762,6 +2766,30 @@ namespace IKVM.Internal
 							}
 							break;
 #endif
+						case "MethodParameters":
+						{
+							if(classFile.MajorVersion < 52)
+							{
+								goto default;
+							}
+							if(parameters != null)
+							{
+								throw new ClassFormatError("{0} (Duplicate MethodParameters attribute)", classFile.Name);
+							}
+							BigEndianBinaryReader rdr = br.Section(br.ReadUInt32());
+							byte parameters_count = rdr.ReadByte();
+							parameters = new MethodParametersEntry[parameters_count];
+							for(int j = 0; j < parameters_count; j++)
+							{
+								parameters[j].name = classFile.GetConstantPoolUtf8String(utf8_cp, rdr.ReadUInt16());
+								parameters[j].flags = rdr.ReadUInt16();
+							}
+							if(!rdr.IsAtEnd)
+							{
+								throw new ClassFormatError("{0} (MethodParameters attribute has wrong length)", classFile.Name);
+							}
+							break;
+						}
 						default:
 							br.Skip(br.ReadUInt32());
 							break;
@@ -2783,7 +2811,7 @@ namespace IKVM.Internal
 							code.verifyError = string.Format("Class {0}, method {1} signature {2}: No Code attribute", classFile.Name, this.Name, this.Signature);
 							return;
 						}
-						throw new ClassFormatError("Method has no Code attribute");
+						throw new ClassFormatError("Absent Code attribute in method that is not native or abstract in class file " + classFile.Name);
 					}
 				}
 			}
@@ -2821,14 +2849,15 @@ namespace IKVM.Internal
 				}
 			}
 
-			// for use by ikvmc only
-			internal bool HasCallerIDAnnotation
+#if STATIC_COMPILER
+			internal bool IsCallerSensitive
 			{
 				get
 				{
-					return (flags & FLAG_HAS_CALLERID) != 0;
+					return (flags & FLAG_CALLERSENSITIVE) != 0;
 				}
 			}
+#endif
 
 			internal string[] ExceptionsAttribute
 			{
@@ -2945,6 +2974,14 @@ namespace IKVM.Internal
 				}
 			}
 
+			internal MethodParametersEntry[] MethodParameters
+			{
+				get
+				{
+					return parameters;
+				}
+			}
+
 			internal bool HasJsr
 			{
 				get
@@ -3526,6 +3563,12 @@ namespace IKVM.Internal
 				internal string descriptor;
 				internal ushort index;
 			}
+
+			internal struct MethodParametersEntry
+			{
+				internal string name;
+				internal ushort flags;
+			}
 		}
 
 		internal Field GetField(string name, string sig)
diff --git a/external/ikvm/runtime/DynamicTypeWrapper.cs b/external/ikvm/runtime/DynamicTypeWrapper.cs
index 954f277..ad08619 100644
--- a/external/ikvm/runtime/DynamicTypeWrapper.cs
+++ b/external/ikvm/runtime/DynamicTypeWrapper.cs
@@ -45,7 +45,8 @@ namespace IKVM.Internal
 #if STATIC_COMPILER
 	abstract class DynamicTypeWrapper : TypeWrapper
 #else
-	class DynamicTypeWrapper : TypeWrapper
+#pragma warning disable 628 // don't complain about protected members in sealed type
+	sealed class DynamicTypeWrapper : TypeWrapper
 #endif
 	{
 #if STATIC_COMPILER
@@ -451,7 +452,7 @@ namespace IKVM.Internal
 			private MethodBuilder clinitMethod;
 			private MethodBuilder finalizeMethod;
 #if STATIC_COMPILER
-			private DynamicTypeWrapper outerClassWrapper;
+			private DynamicTypeWrapper enclosingClassWrapper;
 			private AnnotationBuilder annotationBuilder;
 			private TypeBuilder enumBuilder;
 			private Dictionary<string, TypeWrapper> nestedTypeNames;	// only keys are used, values are always null
@@ -500,13 +501,14 @@ namespace IKVM.Internal
 					{
 						flags |= MemberFlags.InternalAccess;
 					}
-					// we only support HasCallerID instance methods on final types, because we don't support interface stubs with CallerID
-					if (m.HasCallerIDAnnotation
-						&& (m.IsStatic || classFile.IsFinal)
-						&& CoreClasses.java.lang.Object.Wrapper.InternalsVisibleTo(wrapper))
+#if STATIC_COMPILER
+					if (m.IsCallerSensitive
+						&& CoreClasses.ikvm. at internal.CallerID.Wrapper.InternalsVisibleTo(wrapper)	// we only look at CallerSensitive when we're compiling the core class library
+						&& SupportsCallerID(m))
 					{
 						flags |= MemberFlags.CallerID;
 					}
+#endif
 					if (wrapper.IsGhost)
 					{
 						methods[i] = new GhostMethodWrapper(wrapper, m.Name, m.Signature, null, null, null, null, m.Modifiers, flags);
@@ -574,6 +576,63 @@ namespace IKVM.Internal
 				wrapper.SetFields(fields);
 			}
 
+#if STATIC_COMPILER
+			private bool SupportsCallerID(ClassFile.Method method)
+			{
+				if ((classFile.Name == "sun.reflect.Reflection" && method.Name == "getCallerClass")
+					|| (classFile.Name == "java.util.logging.Logger" && method.Name == "findResourceBundleFromStack"))
+				{
+					// ignore CallerSensitive on methods that don't need CallerID parameter
+					return false;
+				}
+				else if (method.IsStatic)
+				{
+					return true;
+				}
+				else if ((classFile.IsFinal || classFile.Name == "java.lang.Runtime" || classFile.Name == "java.io.ObjectStreamClass")
+					&& wrapper.BaseTypeWrapper.GetMethodWrapper(method.Name, method.Signature, true) == null
+					&& !HasInterfaceMethod(wrapper, method.Name, method.Signature))
+				{
+					// We only support CallerID instance methods on final or effectively final types,
+					// because we don't support interface stubs with CallerID.
+					// We also don't support a CallerID method overriding a method or implementing an interface.
+					return true;
+				}
+				else if (RequiresDynamicReflectionCallerClass(classFile.Name, method.Name, method.Signature))
+				{
+					// We don't support CallerID for virtual methods that can be overridden or implement an interface,
+					// so these methods will do a dynamic stack walk if when Reflection.getCallerClass() is used.
+					return false;
+				}
+				else
+				{
+					// If we end up here, we either have to add support or add them to the white-list in the above clause
+					// to allow them to fall back to dynamic stack walking.
+					StaticCompiler.IssueMessage(Message.CallerSensitiveOnUnsupportedMethod, classFile.Name, method.Name, method.Signature);
+					return false;
+				}
+			}
+
+			private static bool HasInterfaceMethod(TypeWrapper tw, string name, string signature)
+			{
+				for (; tw != null; tw = tw.BaseTypeWrapper)
+				{
+					foreach (TypeWrapper iface in tw.Interfaces)
+					{
+						if (iface.GetMethodWrapper(name, signature, false) != null)
+						{
+							return true;
+						}
+						if (HasInterfaceMethod(iface, name, signature))
+						{
+							return true;
+						}
+					}
+				}
+				return false;
+			}
+#endif
+
 			internal void CreateStep2()
 			{
 #if STATIC_COMPILER
@@ -608,50 +667,58 @@ namespace IKVM.Internal
 #if STATIC_COMPILER
 					bool cantNest = false;
 					bool setModifiers = false;
-					TypeBuilder outer = null;
+					TypeBuilder enclosing = null;
+					string enclosingClassName = null;
 					// we only compile inner classes as nested types in the static compiler, because it has a higher cost
 					// and doesn't buy us anything in dynamic mode (and if fact, due to an FXBUG it would make handling
 					// the TypeResolve event very hard)
 					ClassFile.InnerClass outerClass = getOuterClass();
 					if (outerClass.outerClass != 0)
 					{
-						string outerClassName = classFile.GetConstantPoolClass(outerClass.outerClass);
-						if (!CheckInnerOuterNames(f.Name, outerClassName))
+						enclosingClassName = classFile.GetConstantPoolClass(outerClass.outerClass);
+					}
+					else if (f.EnclosingMethod != null)
+					{
+						enclosingClassName = f.EnclosingMethod[0];
+					}
+					if (enclosingClassName != null)
+					{
+						if (!CheckInnerOuterNames(f.Name, enclosingClassName))
 						{
-							Tracer.Warning(Tracer.Compiler, "Incorrect InnerClasses attribute on {0}", f.Name);
+							Tracer.Warning(Tracer.Compiler, "Incorrect {0} attribute on {1}", outerClass.outerClass != 0 ? "InnerClasses" : "EnclosingMethod", f.Name);
 						}
 						else
 						{
 							try
 							{
-								outerClassWrapper = wrapper.classLoader.LoadClassByDottedNameFast(outerClassName) as DynamicTypeWrapper;
+								enclosingClassWrapper = wrapper.classLoader.LoadClassByDottedNameFast(enclosingClassName) as DynamicTypeWrapper;
 							}
 							catch (RetargetableJavaException x)
 							{
-								Tracer.Warning(Tracer.Compiler, "Unable to load outer class {0} for inner class {1} ({2}: {3})", outerClassName, f.Name, x.GetType().Name, x.Message);
+								Tracer.Warning(Tracer.Compiler, "Unable to load outer class {0} for inner class {1} ({2}: {3})", enclosingClassName, f.Name, x.GetType().Name, x.Message);
 							}
-							if (outerClassWrapper != null)
+							if (enclosingClassWrapper != null)
 							{
 								// make sure the relationship is reciprocal (otherwise we run the risk of
 								// baking the outer type before the inner type) and that the inner and outer
 								// class live in the same class loader (when doing a multi target compilation,
-								// it is possible to split the two classes acros assemblies)
-								JavaTypeImpl oimpl = outerClassWrapper.impl as JavaTypeImpl;
-								if (oimpl != null && outerClassWrapper.GetClassLoader() == wrapper.GetClassLoader())
+								// it is possible to split the two classes across assemblies)
+								JavaTypeImpl oimpl = enclosingClassWrapper.impl as JavaTypeImpl;
+								if (oimpl != null && enclosingClassWrapper.GetClassLoader() == wrapper.GetClassLoader())
 								{
 									ClassFile outerClassFile = oimpl.classFile;
 									ClassFile.InnerClass[] outerInnerClasses = outerClassFile.InnerClasses;
 									if (outerInnerClasses == null)
 									{
-										outerClassWrapper = null;
+										enclosingClassWrapper = null;
 									}
 									else
 									{
 										bool ok = false;
 										for (int i = 0; i < outerInnerClasses.Length; i++)
 										{
-											if (outerInnerClasses[i].outerClass != 0
-												&& outerClassFile.GetConstantPoolClass(outerInnerClasses[i].outerClass) == outerClassFile.Name
+											if (((outerInnerClasses[i].outerClass != 0 && outerClassFile.GetConstantPoolClass(outerInnerClasses[i].outerClass) == outerClassFile.Name)
+													|| (outerInnerClasses[i].outerClass == 0 && outerClass.outerClass == 0))
 												&& outerInnerClasses[i].innerClass != 0
 												&& outerClassFile.GetConstantPoolClass(outerInnerClasses[i].innerClass) == f.Name)
 											{
@@ -661,18 +728,23 @@ namespace IKVM.Internal
 										}
 										if (!ok)
 										{
-											outerClassWrapper = null;
+											enclosingClassWrapper = null;
 										}
 									}
 								}
 								else
 								{
-									outerClassWrapper = null;
+									enclosingClassWrapper = null;
 								}
-								if (outerClassWrapper != null)
+								if (enclosingClassWrapper != null)
 								{
-									outerClassWrapper.CreateStep2();
-									outer = oimpl.typeBuilder;
+									enclosingClassWrapper.CreateStep2();
+									enclosing = oimpl.typeBuilder;
+									if (outerClass.outerClass == 0)
+									{
+										// we need to record that we're not an inner classes, but an enclosed class
+										typeAttribs |= TypeAttributes.SpecialName;
+									}
 								}
 								else
 								{
@@ -683,9 +755,9 @@ namespace IKVM.Internal
 					}
 					if (f.IsPublic)
 					{
-						if (outer != null)
+						if (enclosing != null)
 						{
-							if (outerClassWrapper.IsPublic)
+							if (enclosingClassWrapper.IsPublic)
 							{
 								typeAttribs |= TypeAttributes.NestedPublic;
 							}
@@ -702,7 +774,7 @@ namespace IKVM.Internal
 							typeAttribs |= TypeAttributes.Public;
 						}
 					}
-					else if (outer != null)
+					else if (enclosing != null)
 					{
 						typeAttribs |= TypeAttributes.NestedAssembly;
 					}
@@ -720,7 +792,7 @@ namespace IKVM.Internal
 						setModifiers |= (f.Modifiers & (Modifiers)0x99CE) != 0;
 						// by default we assume interfaces are abstract, so in the exceptional case we need a ModifiersAttribute
 						setModifiers |= (f.Modifiers & Modifiers.Abstract) == 0;
-						if (outer != null && !cantNest)
+						if (enclosing != null && !cantNest)
 						{
 							if (wrapper.IsGhost)
 							{
@@ -730,7 +802,7 @@ namespace IKVM.Internal
 							}
 							// LAMESPEC the CLI spec says interfaces cannot contain nested types (Part.II, 9.6), but that rule isn't enforced
 							// (and broken by J# as well), so we'll just ignore it too.
-							typeBuilder = outer.DefineNestedType(GetInnerClassName(outerClassWrapper.Name, f.Name), typeAttribs);
+							typeBuilder = enclosing.DefineNestedType(AllocNestedTypeName(enclosingClassWrapper.Name, f.Name), typeAttribs);
 						}
 						else
 						{
@@ -755,17 +827,11 @@ namespace IKVM.Internal
 						setModifiers |= (f.Modifiers & (Modifiers)0x99CE) != 0;
 						// by default we assume ACC_SUPER for classes, so in the exceptional case we need a ModifiersAttribute
 						setModifiers |= !f.IsSuper;
-						if (f.IsEffectivelyFinal)
-						{
-							setModifiers = true;
-							typeAttribs |= TypeAttributes.Sealed;
-							Tracer.Info(Tracer.Compiler, "Sealing type {0}", f.Name);
-						}
-						if (outer != null && !cantNest)
+						if (enclosing != null && !cantNest)
 						{
 							// LAMESPEC the CLI spec says interfaces cannot contain nested types (Part.II, 9.6), but that rule isn't enforced
 							// (and broken by J# as well), so we'll just ignore it too.
-							typeBuilder = outer.DefineNestedType(GetInnerClassName(outerClassWrapper.Name, f.Name), typeAttribs);
+							typeBuilder = enclosing.DefineNestedType(AllocNestedTypeName(enclosingClassWrapper.Name, f.Name), typeAttribs);
 						}
 						else
 #endif // STATIC_COMPILER
@@ -777,14 +843,16 @@ namespace IKVM.Internal
 					// When we're statically compiling, we associate the typeBuilder with the wrapper. This enables types in referenced assemblies to refer back to
 					// types that we're currently compiling (i.e. a cyclic dependency between the currently assembly we're compiling and a referenced assembly).
 					wrapper.GetClassLoader().SetWrapperForType(typeBuilder, wrapper);
-					if (outer != null && cantNest)
-					{
-						AttributeHelper.SetNonNestedOuterClass(typeBuilder, outerClassWrapper.Name);
-						AttributeHelper.SetNonNestedInnerClass(outer, f.Name);
-					}
-					if (outerClass.outerClass != 0 && outer == null)
+					if (outerClass.outerClass != 0)
 					{
-						AttributeHelper.SetNonNestedOuterClass(typeBuilder, classFile.GetConstantPoolClass(outerClass.outerClass));
+						if (enclosing != null && cantNest)
+						{
+							AttributeHelper.SetNonNestedInnerClass(enclosing, f.Name);
+						}
+						if (enclosing == null || cantNest)
+						{
+							AttributeHelper.SetNonNestedOuterClass(typeBuilder, enclosingClassName);
+						}
 					}
 					if (classFile.InnerClasses != null)
 					{
@@ -803,11 +871,6 @@ namespace IKVM.Internal
 							}
 						}
 					}
-					if (outer == null && mangledTypeName != wrapper.Name)
-					{
-						// HACK we abuse the InnerClassAttribute to record to real name
-						AttributeHelper.SetInnerClass(typeBuilder, wrapper.Name, wrapper.Modifiers);
-					}
 					if (typeBuilder.FullName != wrapper.Name
 						&& wrapper.Name.Replace('$', '+') != typeBuilder.FullName)
 					{
@@ -815,54 +878,17 @@ namespace IKVM.Internal
 					}
 					if (f.IsAnnotation && Annotation.HasRetentionPolicyRuntime(f.Annotations))
 					{
-						annotationBuilder = new AnnotationBuilder(this, outer);
+						annotationBuilder = new AnnotationBuilder(this, enclosing);
 						wrapper.SetAnnotation(annotationBuilder);
 					}
 					// For Java 5 Enum types, we generate a nested .NET enum.
 					// This is primarily to support annotations that take enum parameters.
 					if (f.IsEnum && f.IsPublic)
 					{
-						CompilerClassLoader ccl = wrapper.classLoader;
-						string name = "__Enum";
-						while (!ccl.ReserveName(f.Name + "$" + name))
-						{
-							name += "_";
-						}
-						enumBuilder = typeBuilder.DefineNestedType(name, TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.NestedPublic | TypeAttributes.Serializable, Types.Enum);
-						AttributeHelper.HideFromJava(enumBuilder);
-						enumBuilder.DefineField("value__", Types.Int32, FieldAttributes.Public | FieldAttributes.SpecialName | FieldAttributes.RTSpecialName);
-						for (int i = 0; i < f.Fields.Length; i++)
-						{
-							if (f.Fields[i].IsEnum)
-							{
-								FieldBuilder fieldBuilder = enumBuilder.DefineField(f.Fields[i].Name, enumBuilder, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal);
-								fieldBuilder.SetConstant(i);
-							}
-						}
-						wrapper.SetEnumType(enumBuilder);
-					}
-					TypeWrapper[] interfaces = wrapper.Interfaces;
-					string[] implements = new string[interfaces.Length];
-					for (int i = 0; i < implements.Length; i++)
-					{
-						implements[i] = interfaces[i].Name;
+						AddCliEnum();
 					}
-					if (outer != null)
-					{
-						Modifiers innerClassModifiers = outerClass.accessFlags;
-						string innerClassName = classFile.GetConstantPoolClass(outerClass.innerClass);
-						if (innerClassName == classFile.Name && innerClassName == outerClassWrapper.Name + "$" + typeBuilder.Name)
-						{
-							innerClassName = null;
-						}
-						AttributeHelper.SetInnerClass(typeBuilder, innerClassName, innerClassModifiers);
-					}
-					else if (outerClass.innerClass != 0)
-					{
-						AttributeHelper.SetInnerClass(typeBuilder, null, outerClass.accessFlags);
-					}
-					AttributeHelper.SetImplementsAttribute(typeBuilder, interfaces);
-					if (classFile.DeprecatedAttribute)
+					AddInnerClassAttribute(enclosing != null, outerClass.innerClass != 0, mangledTypeName, outerClass.accessFlags);
+					if (classFile.DeprecatedAttribute && !Annotation.HasObsoleteAttribute(classFile.Annotations))
 					{
 						AttributeHelper.SetDeprecatedAttribute(typeBuilder);
 					}
@@ -872,13 +898,26 @@ namespace IKVM.Internal
 					}
 					if (classFile.EnclosingMethod != null)
 					{
-						AttributeHelper.SetEnclosingMethodAttribute(typeBuilder, classFile.EnclosingMethod[0], classFile.EnclosingMethod[1], classFile.EnclosingMethod[2]);
+						if (outerClass.outerClass == 0 && enclosing != null && !cantNest)
+						{
+							// we don't need to record the enclosing type, if we're compiling the current type as a nested type because of the EnclosingMethod attribute
+							AttributeHelper.SetEnclosingMethodAttribute(typeBuilder, null, classFile.EnclosingMethod[1], classFile.EnclosingMethod[2]);
+						}
+						else
+						{
+							AttributeHelper.SetEnclosingMethodAttribute(typeBuilder, classFile.EnclosingMethod[0], classFile.EnclosingMethod[1], classFile.EnclosingMethod[2]);
+						}
 					}
 					if (wrapper.classLoader.EmitStackTraceInfo)
 					{
 						if (f.SourceFileAttribute != null)
 						{
-							if (f.SourceFileAttribute != typeBuilder.Name + ".java")
+							if ((enclosingClassWrapper == null && f.SourceFileAttribute == typeBuilder.Name + ".java")
+								|| (enclosingClassWrapper != null && f.SourceFileAttribute == enclosingClassWrapper.sourceFileName))
+							{
+								// we don't need to record the name because it matches our heuristic
+							}
+							else
 							{
 								AttributeHelper.SetSourceFile(typeBuilder, f.SourceFileAttribute);
 							}
@@ -896,33 +935,7 @@ namespace IKVM.Internal
 #endif // STATIC_COMPILER
 					if (hasclinit)
 					{
-						// We create a empty method that we can use to trigger our .cctor
-						// (previously we used RuntimeHelpers.RunClassConstructor, but that is slow and requires additional privileges)
-						MethodAttributes attribs = MethodAttributes.Static | MethodAttributes.SpecialName;
-						if (classFile.IsAbstract)
-						{
-							bool hasfields = false;
-							// If we have any public static fields, the cctor trigger must (and may) be public as well
-							foreach (ClassFile.Field fld in classFile.Fields)
-							{
-								if (fld.IsPublic && fld.IsStatic)
-								{
-									hasfields = true;
-									break;
-								}
-							}
-							attribs |= hasfields ? MethodAttributes.Public : MethodAttributes.FamORAssem;
-						}
-						else
-						{
-							attribs |= MethodAttributes.Public;
-						}
-						clinitMethod = typeBuilder.DefineMethod("__<clinit>", attribs, null, null);
-						clinitMethod.GetILGenerator().Emit(OpCodes.Ret);
-						// FXBUG on .NET 2.0 RTM x64 the JIT sometimes throws an InvalidProgramException while trying to inline this method,
-						// so we prevent inlining for now (it also turns out that on x86 not inlining this method actually has a positive perf impact in some cases...)
-						// http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=285772
-						clinitMethod.SetImplementationFlags(clinitMethod.GetMethodImplementationFlags() | MethodImplAttributes.NoInlining);
+						AddClinitTrigger();
 					}
 					if (HasStructLayoutAttributeAnnotation(classFile))
 					{
@@ -944,6 +957,84 @@ namespace IKVM.Internal
 #endif
 			}
 
+#if STATIC_COMPILER
+			private void AddInnerClassAttribute(bool isNestedType, bool isInnerClass, string mangledTypeName, Modifiers innerClassFlags)
+			{
+				string name = classFile.Name;
+
+				if (isNestedType)
+				{
+					if (name == enclosingClassWrapper.Name + "$" + typeBuilder.Name)
+					{
+						name = null;
+					}
+				}
+				else if (name == mangledTypeName)
+				{
+					name = null;
+				}
+
+				if ((isInnerClass && CompiledTypeWrapper.PredictReflectiveModifiers(wrapper) != innerClassFlags) || name != null)
+				{
+					// HACK we abuse the InnerClassAttribute to record to real name for non-inner classes as well
+					AttributeHelper.SetInnerClass(typeBuilder, name, isInnerClass ? innerClassFlags : wrapper.Modifiers);
+				}
+			}
+
+			private void AddCliEnum()
+			{
+				CompilerClassLoader ccl = wrapper.classLoader;
+				string name = "__Enum";
+				while (!ccl.ReserveName(classFile.Name + "$" + name))
+				{
+					name += "_";
+				}
+				enumBuilder = typeBuilder.DefineNestedType(name, TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.NestedPublic | TypeAttributes.Serializable, Types.Enum);
+				AttributeHelper.HideFromJava(enumBuilder);
+				enumBuilder.DefineField("value__", Types.Int32, FieldAttributes.Public | FieldAttributes.SpecialName | FieldAttributes.RTSpecialName);
+				for (int i = 0; i < classFile.Fields.Length; i++)
+				{
+					if (classFile.Fields[i].IsEnum)
+					{
+						FieldBuilder fieldBuilder = enumBuilder.DefineField(classFile.Fields[i].Name, enumBuilder, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal);
+						fieldBuilder.SetConstant(i);
+					}
+				}
+				wrapper.SetEnumType(enumBuilder);
+			}
+#endif
+
+			private void AddClinitTrigger()
+			{
+				// We create a empty method that we can use to trigger our .cctor
+				// (previously we used RuntimeHelpers.RunClassConstructor, but that is slow and requires additional privileges)
+				MethodAttributes attribs = MethodAttributes.Static | MethodAttributes.SpecialName;
+				if (classFile.IsAbstract)
+				{
+					bool hasfields = false;
+					// If we have any public static fields, the cctor trigger must (and may) be public as well
+					foreach (ClassFile.Field fld in classFile.Fields)
+					{
+						if (fld.IsPublic && fld.IsStatic)
+						{
+							hasfields = true;
+							break;
+						}
+					}
+					attribs |= hasfields ? MethodAttributes.Public : MethodAttributes.FamORAssem;
+				}
+				else
+				{
+					attribs |= MethodAttributes.Public;
+				}
+				clinitMethod = typeBuilder.DefineMethod("__<clinit>", attribs, null, null);
+				clinitMethod.GetILGenerator().Emit(OpCodes.Ret);
+				// FXBUG on .NET 2.0 RTM x64 the JIT sometimes throws an InvalidProgramException while trying to inline this method,
+				// so we prevent inlining for now (it also turns out that on x86 not inlining this method actually has a positive perf impact in some cases...)
+				// http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=285772
+				clinitMethod.SetImplementationFlags(clinitMethod.GetMethodImplementationFlags() | MethodImplAttributes.NoInlining);
+			}
+
 			private sealed class DelegateConstructorMethodWrapper : MethodWrapper
 			{
 				private MethodBuilder constructor;
@@ -1131,11 +1222,16 @@ namespace IKVM.Internal
 								MethodWrapper mw = GetMethodWrapperDuringCtor(lookup, methods, ifmethod.Name, ifmethod.Signature);
 								if (mw == null)
 								{
-									mw = new TypicalMethodWrapper(wrapper, ifmethod.Name, ifmethod.Signature, null, null, null, Modifiers.Public | Modifiers.Abstract, MemberFlags.HideFromReflection | MemberFlags.MirandaMethod);
+									mw = MirandaMethodWrapper.Create(wrapper, ifmethod);
 									methods.Add(mw);
 									baseMethods.Add(new MethodWrapper[] { ifmethod });
 									break;
 								}
+								if (mw.IsMirandaMethod && mw.DeclaringType == wrapper)
+								{
+									methods[methods.IndexOf(mw)] = ((MirandaMethodWrapper)mw).Update(ifmethod);
+									break;
+								}
 								if (!mw.IsStatic || mw.DeclaringType == wrapper)
 								{
 									break;
@@ -1158,8 +1254,7 @@ namespace IKVM.Internal
 						MethodWrapper mw = new DelegateInvokeStubMethodWrapper(wrapper, iface.DeclaringTypeWrapper.TypeAsBaseType, iface.GetMethods()[0].Signature);
 						if (GetMethodWrapperDuringCtor(wrapper, methods, mw.Name, mw.Signature) == null)
 						{
-							Array.Resize(ref methods, methods.Length + 1);
-							methods[methods.Length - 1] = mw;
+							methods = ArrayUtil.Concat(methods, mw);
 						}
 					}
 					AddDelegateInvokeStubs(iface, ref methods);
@@ -1267,10 +1362,10 @@ namespace IKVM.Internal
 			private static bool CheckInnerOuterNames(string inner, string outer)
 			{
 				// do some sanity checks on the inner/outer class names
-				return inner.Length > outer.Length + 1 && inner[outer.Length] == '$' && inner.StartsWith(outer);
+				return inner.Length > outer.Length + 1 && inner[outer.Length] == '$' && inner.StartsWith(outer, StringComparison.Ordinal);
 			}
 
-			private string GetInnerClassName(string outer, string inner)
+			private string AllocNestedTypeName(string outer, string inner)
 			{
 				Debug.Assert(CheckInnerOuterNames(inner, outer));
 				if (nestedTypeNames == null)
@@ -1501,7 +1596,7 @@ namespace IKVM.Internal
 					{
 						AttributeHelper.SetModifiers(field, fld.Modifiers, fld.IsInternal);
 					}
-					if (fld.DeprecatedAttribute)
+					if (fld.DeprecatedAttribute && !Annotation.HasObsoleteAttribute(fld.Annotations))
 					{
 						AttributeHelper.SetDeprecatedAttribute(field);
 					}
@@ -1790,7 +1885,7 @@ namespace IKVM.Internal
 					}
 
 					TypeAttributes typeAttributes = TypeAttributes.Class | TypeAttributes.Sealed;
-					if (o.outerClassWrapper != null)
+					if (o.enclosingClassWrapper != null)
 					{
 						if (o.wrapper.IsPublic)
 						{
@@ -1800,7 +1895,7 @@ namespace IKVM.Internal
 						{
 							typeAttributes |= TypeAttributes.NestedAssembly;
 						}
-						attributeTypeBuilder = outer.DefineNestedType(o.GetInnerClassName(o.outerClassWrapper.Name, name + "Attribute"), typeAttributes, annotationAttributeBaseType.TypeAsBaseType);
+						attributeTypeBuilder = outer.DefineNestedType(o.AllocNestedTypeName(o.enclosingClassWrapper.Name, name + "Attribute"), typeAttributes, annotationAttributeBaseType.TypeAsBaseType);
 					}
 					else
 					{
@@ -1929,10 +2024,14 @@ namespace IKVM.Internal
 						{
 							argType = Types.Type;
 						}
-						else if (tw.EnumType != null)
+						else if (tw.EnumType != null)	// is it a Java enum?
 						{
 							argType = tw.EnumType;
 						}
+						else if (IsDotNetEnum(tw))
+						{
+							argType = tw.DeclaringTypeWrapper.TypeAsSignatureType;
+						}
 						else
 						{
 							argType = tw.TypeAsSignatureType;
@@ -1945,6 +2044,11 @@ namespace IKVM.Internal
 					}
 				}
 
+				private static bool IsDotNetEnum(TypeWrapper tw)
+				{
+					return tw.IsFakeNestedType && (tw.Modifiers & Modifiers.Enum) != 0;
+				}
+
 				internal string AttributeTypeName
 				{
 					get
@@ -1967,10 +2071,14 @@ namespace IKVM.Internal
 					{
 						ilgen.Emit(OpCodes.Box, tw.TypeAsSignatureType);
 					}
-					else if (tw.EnumType != null)
+					else if (tw.EnumType != null)	// is it a Java enum?
 					{
 						ilgen.Emit(OpCodes.Box, tw.EnumType);
 					}
+					else if (IsDotNetEnum(tw))
+					{
+						ilgen.Emit(OpCodes.Box, tw.DeclaringTypeWrapper.TypeAsSignatureType);
+					}
 					MethodWrapper setValueMethod = annotationAttributeBaseType.GetMethodWrapper("setValue", "(Ljava.lang.String;Ljava.lang.Object;)V", false);
 					setValueMethod.Link();
 					setValueMethod.EmitCall(ilgen);
@@ -2180,64 +2288,43 @@ namespace IKVM.Internal
 					attributeTypeBuilder.CreateType();
 				}
 
-				internal override void Apply(ClassLoaderWrapper loader, TypeBuilder tb, object annotation)
+				private CustomAttributeBuilder MakeCustomAttributeBuilder(ClassLoaderWrapper loader, object annotation)
 				{
 					Link();
-					if (annotationTypeBuilder != null)
-					{
-						annotation = QualifyClassNames(loader, annotation);
-						tb.SetCustomAttribute(new CustomAttributeBuilder(defineConstructor.__AsConstructorInfo(), new object[] { annotation }));
-					}
+					ConstructorInfo ctor = defineConstructor != null
+						? defineConstructor.__AsConstructorInfo()
+						: StaticCompiler.GetRuntimeType("IKVM.Attributes.DynamicAnnotationAttribute").GetConstructor(new Type[] { Types.Object.MakeArrayType() });
+					return new CustomAttributeBuilder(ctor, new object[] { QualifyClassNames(loader, annotation) });
+				}
+
+				internal override void Apply(ClassLoaderWrapper loader, TypeBuilder tb, object annotation)
+				{
+					tb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 				}
 
 				internal override void Apply(ClassLoaderWrapper loader, MethodBuilder mb, object annotation)
 				{
-					Link();
-					if (annotationTypeBuilder != null)
-					{
-						annotation = QualifyClassNames(loader, annotation);
-						mb.SetCustomAttribute(new CustomAttributeBuilder(defineConstructor.__AsConstructorInfo(), new object[] { annotation }));
-					}
+					mb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 				}
 
 				internal override void Apply(ClassLoaderWrapper loader, FieldBuilder fb, object annotation)
 				{
-					Link();
-					if (annotationTypeBuilder != null)
-					{
-						annotation = QualifyClassNames(loader, annotation);
-						fb.SetCustomAttribute(new CustomAttributeBuilder(defineConstructor.__AsConstructorInfo(), new object[] { annotation }));
-					}
+					fb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 				}
 
 				internal override void Apply(ClassLoaderWrapper loader, ParameterBuilder pb, object annotation)
 				{
-					Link();
-					if (annotationTypeBuilder != null)
-					{
-						annotation = QualifyClassNames(loader, annotation);
-						pb.SetCustomAttribute(new CustomAttributeBuilder(defineConstructor.__AsConstructorInfo(), new object[] { annotation }));
-					}
+					pb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 				}
 
 				internal override void Apply(ClassLoaderWrapper loader, AssemblyBuilder ab, object annotation)
 				{
-					Link();
-					if (annotationTypeBuilder != null)
-					{
-						annotation = QualifyClassNames(loader, annotation);
-						ab.SetCustomAttribute(new CustomAttributeBuilder(defineConstructor.__AsConstructorInfo(), new object[] { annotation }));
-					}
+					ab.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 				}
 
 				internal override void Apply(ClassLoaderWrapper loader, PropertyBuilder pb, object annotation)
 				{
-					Link();
-					if (annotationTypeBuilder != null)
-					{
-						annotation = QualifyClassNames(loader, annotation);
-						pb.SetCustomAttribute(new CustomAttributeBuilder(defineConstructor.__AsConstructorInfo(), new object[] { annotation }));
-					}
+					pb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 				}
 
 				internal override bool IsCustomAttribute
@@ -2753,10 +2840,11 @@ namespace IKVM.Internal
 					{
 						if (methods[index].IsMirandaMethod)
 						{
-							// We're a Miranda method
+							// We're a Miranda method or we're an inherited default interface method
 							Debug.Assert(baseMethods[index].Length == 1 && baseMethods[index][0].DeclaringType.IsInterface);
+							MirandaMethodWrapper mmw = (MirandaMethodWrapper)methods[index];
 							MethodAttributes attr = MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.CheckAccessOnOverride;
-							if (wrapper.IsAbstract)
+							if (wrapper.IsInterface || (wrapper.IsAbstract && mmw.BaseMethod.IsAbstract && mmw.Error == null))
 							{
 								attr |= MethodAttributes.Abstract;
 							}
@@ -2771,12 +2859,19 @@ namespace IKVM.Internal
 							{
 								typeBuilder.DefineMethodOverride(mb, (MethodInfo)baseMethods[index][0].GetMethod());
 							}
-							if (!wrapper.IsAbstract)
+							if ((!wrapper.IsAbstract && mmw.BaseMethod.IsAbstract) || (!wrapper.IsInterface && mmw.Error != null))
 							{
 								CodeEmitter ilgen = CodeEmitter.Create(mb);
-								ilgen.EmitThrow("java.lang.AbstractMethodError", wrapper.Name + "." + methods[index].Name + methods[index].Signature);
+								ilgen.EmitThrow("java.lang.AbstractMethodError", mmw.Error ?? (wrapper.Name + "." + methods[index].Name + methods[index].Signature));
 								ilgen.DoEmit();
 							}
+#if STATIC_COMPILER
+							if (wrapper.IsInterface && !mmw.IsAbstract)
+							{
+								// even though we're not visible to reflection., we need to record the fact that we have a default implementation
+								AttributeHelper.SetModifiers(mb, mmw.Modifiers, false);
+							}
+#endif
 							return mb;
 						}
 						else
@@ -2826,7 +2921,7 @@ namespace IKVM.Internal
 						AttributeHelper.SetEditorBrowsableNever(method);
 						// TODO on WHIDBEY apply CompilerGeneratedAttribute
 					}
-					if (m.DeprecatedAttribute)
+					if (m.DeprecatedAttribute && !Annotation.HasObsoleteAttribute(m.Annotations))
 					{
 						AttributeHelper.SetDeprecatedAttribute(method);
 					}
@@ -2881,7 +2976,7 @@ namespace IKVM.Internal
 				{
 					attribs |= GetMethodAccess(methods[index]);
 				}
-				if (m.IsAbstract)
+				if (m.IsAbstract || (!m.IsStatic && classFile.IsInterface))
 				{
 					// only if the classfile is abstract, we make the CLR method abstract, otherwise,
 					// we have to generate a method that throws an AbstractMethodError (because the JVM
@@ -2894,6 +2989,10 @@ namespace IKVM.Internal
 						}
 						else
 						{
+							if (!m.IsAbstract)
+							{
+								setModifiers = true;
+							}
 							attribs |= MethodAttributes.Abstract;
 						}
 					}
@@ -3576,6 +3675,7 @@ namespace IKVM.Internal
 			private List<Item> items;
 			private Dictionary<FieldWrapper, MethodBuilder> arfuMap;
 			private Dictionary<MethodKey, MethodInfo> invokespecialstubcache;
+			private Dictionary<string, MethodInfo> dynamicClassLiteral;
 
 			private struct Item
 			{
@@ -3613,6 +3713,36 @@ namespace IKVM.Internal
 				return val;
 			}
 
+			internal void EmitDynamicClassLiteral(CodeEmitter ilgen, TypeWrapper tw)
+			{
+				Debug.Assert(tw.IsUnloadable);
+				if (dynamicClassLiteral == null)
+				{
+					dynamicClassLiteral = new Dictionary<string, MethodInfo>();
+				}
+				MethodInfo method;
+				if (!dynamicClassLiteral.TryGetValue(tw.Name, out method))
+				{
+					FieldBuilder fb = typeBuilder.DefineField("__<>class", CoreClasses.java.lang.Class.Wrapper.TypeAsSignatureType, FieldAttributes.PrivateScope | FieldAttributes.Static);
+					MethodBuilder mb = typeBuilder.DefineMethod("__<>class", MethodAttributes.PrivateScope | MethodAttributes.Static, CoreClasses.java.lang.Class.Wrapper.TypeAsSignatureType, Type.EmptyTypes);
+					CodeEmitter ilgen2 = CodeEmitter.Create(mb);
+					ilgen2.Emit(OpCodes.Ldsfld, fb);
+					CodeEmitterLabel label = ilgen2.DefineLabel();
+					ilgen2.EmitBrtrue(label);
+					ilgen2.Emit(OpCodes.Ldstr, tw.Name);
+					EmitCallerID(ilgen2);
+					ilgen2.Emit(OpCodes.Call, ByteCodeHelperMethods.DynamicClassLiteral);
+					ilgen2.Emit(OpCodes.Stsfld, fb);
+					ilgen2.MarkLabel(label);
+					ilgen2.Emit(OpCodes.Ldsfld, fb);
+					ilgen2.Emit(OpCodes.Ret);
+					ilgen2.DoEmit();
+					method = mb;
+					dynamicClassLiteral.Add(tw.Name, method);
+				}
+				ilgen.Emit(OpCodes.Call, method);
+			}
+
 			internal void EmitCallerID(CodeEmitter ilgen)
 			{
 				if (callerIDMethod == null)
@@ -3732,6 +3862,9 @@ namespace IKVM.Internal
 						parent = parent.BaseTypeWrapper;
 					}
 				}
+#if STATIC_COMPILER
+				TypeBuilder tbDefaultMethods = null;
+#endif
 				bool basehasclinit = wrapper.BaseTypeWrapper != null && wrapper.BaseTypeWrapper.HasStaticInitializer;
 				int clinitIndex = -1;
 				bool hasConstructor = false;
@@ -3762,6 +3895,12 @@ namespace IKVM.Internal
 					}
 					else
 					{
+#if STATIC_COMPILER
+						if (methods[i].GetParameters().Length > MethodHandleUtil.MaxArity && methods[i].RequiresNonVirtualDispatcher && wrapper.GetClassLoader().EmitNoRefEmitHelpers)
+						{
+							wrapper.GetClassLoader().GetTypeWrapperFactory().DefineDelegate(methods[i].GetParameters().Length, methods[i].ReturnType == PrimitiveTypeWrapper.VOID);
+						}
+#endif
 						if (m.IsAbstract)
 						{
 							bool stub = false;
@@ -3816,7 +3955,7 @@ namespace IKVM.Internal
 								if (nativeCodeType == null)
 								{
 									// simple JNI like class name mangling
-									nativeCodeType = StaticCompiler.GetType(wrapper.GetClassLoader(), "Java_" + classFile.Name.Replace('.', '_'));
+									nativeCodeType = StaticCompiler.GetType(wrapper.GetClassLoader(), "Java_" + classFile.Name.Replace('.', '_').Replace("$", "_00024"));
 								}
 #endif
 								MethodInfo nativeMethod = null;
@@ -3826,9 +3965,7 @@ namespace IKVM.Internal
 									TypeWrapper[] nargs = args;
 									if (!m.IsStatic)
 									{
-										nargs = new TypeWrapper[args.Length + 1];
-										args.CopyTo(nargs, 1);
-										nargs[0] = this.wrapper;
+										nargs = ArrayUtil.Concat(wrapper, args);
 									}
 									MethodInfo[] nativeCodeTypeMethods = nativeCodeType.GetMethods(BindingFlags.Static | BindingFlags.Public);
 									foreach (MethodInfo method in nativeCodeTypeMethods)
@@ -3905,6 +4042,14 @@ namespace IKVM.Internal
 						}
 						else
 						{
+							if (!m.IsStatic && classFile.IsInterface)
+							{
+								mb = methods[i].GetDefineMethodHelper().DefineMethod(wrapper.GetClassLoader().GetTypeWrapperFactory(),
+									typeBuilder, NamePrefix.DefaultMethod + mb.Name, MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.SpecialName, typeBuilder, false);
+#if STATIC_COMPILER
+								CreateDefaultMethodInterop(ref tbDefaultMethods, mb, methods[i]);
+#endif
+							}
 							CodeEmitter ilGenerator = CodeEmitter.Create(mb);
 							TraceHelper.EmitMethodTrace(ilGenerator, classFile.Name + "." + m.Name + m.Signature);
 #if STATIC_COMPILER
@@ -3924,7 +4069,7 @@ namespace IKVM.Internal
 								mb.SetImplementationFlags(mb.GetMethodImplementationFlags() | MethodImplAttributes.NoInlining);
 							}
 #if STATIC_COMPILER
-							ilGenerator.EmitLineNumberTable((MethodBuilder)methods[i].GetMethod());
+							ilGenerator.EmitLineNumberTable(mb);
 #else // STATIC_COMPILER
 							byte[] linenumbers = ilGenerator.GetLineNumberTable();
 							if (linenumbers != null)
@@ -3940,6 +4085,8 @@ namespace IKVM.Internal
 					}
 				}
 
+				AddInheritedDefaultInterfaceMethods(methods);
+
 				if (clinitIndex != -1 || (basehasclinit && !classFile.IsInterface) || classFile.HasInitializedFields)
 				{
 					MethodBuilder cb;
@@ -4025,45 +4172,11 @@ namespace IKVM.Internal
 #if STATIC_COMPILER
 				// If we're an interface that has public/protected fields, we create an inner class
 				// to expose these fields to C# (which stubbornly refuses to see fields in interfaces).
-				TypeBuilder tbFields = null;
-				if (classFile.IsInterface && classFile.IsPublic && !wrapper.IsGhost && classFile.Fields.Length > 0)
-				{
-					CompilerClassLoader ccl = wrapper.classLoader;
-					string name = "__Fields";
-					while (!ccl.ReserveName(classFile.Name + "$" + name))
-					{
-						name += "_";
-					}
-					tbFields = typeBuilder.DefineNestedType(name, TypeAttributes.Class | TypeAttributes.NestedPublic | TypeAttributes.Sealed | TypeAttributes.Abstract);
-					AttributeHelper.HideFromJava(tbFields);
-					CodeEmitter ilgenClinit = null;
-					for (int i = 0; i < classFile.Fields.Length; i++)
-					{
-						ClassFile.Field f = classFile.Fields[i];
-						if (f.ConstantValue != null)
-						{
-							FieldAttributes attribs = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
-							FieldBuilder fb = tbFields.DefineField(f.Name, fields[i].FieldTypeWrapper.TypeAsSignatureType, attribs);
-							fb.SetConstant(f.ConstantValue);
-						}
-						else
-						{
-							FieldAttributes attribs = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.InitOnly;
-							FieldBuilder fb = tbFields.DefineField(f.Name, ToPublicSignatureType(fields[i].FieldTypeWrapper), attribs);
-							if (ilgenClinit == null)
-							{
-								ilgenClinit = CodeEmitter.Create(ReflectUtil.DefineTypeInitializer(tbFields));
-							}
-							wrapper.GetFieldWrapper(f.Name, f.Signature).EmitGet(ilgenClinit);
-							ilgenClinit.Emit(OpCodes.Stsfld, fb);
-						}
-					}
-					if (ilgenClinit != null)
-					{
-						ilgenClinit.Emit(OpCodes.Ret);
-						ilgenClinit.DoEmit();
-					}
-				}
+				AddInterfaceFieldsInterop(fields);
+
+				// If we're a Java 8 interface with static methods, we create an inner class
+				// to expose these methods to C#.
+				AddInterfaceMethodsInterop(methods);
 
 				// See if there is any additional metadata
 				wrapper.EmitMapXmlMetadata(typeBuilder, classFile, fields, methods);
@@ -4083,39 +4196,9 @@ namespace IKVM.Internal
 					{
 						continue;
 					}
-					ParameterBuilder returnParameter = null;
-					ParameterBuilder[] parameterBuilders = null;
-					string[] parameterNames = null;
-					if (wrapper.GetClassLoader().EmitDebugInfo
-#if STATIC_COMPILER
- || (classFile.IsPublic && (m.IsPublic || m.IsProtected))
-#endif
-)
-					{
-						parameterNames = new string[methods[i].GetParameters().Length];
-						GetParameterNamesFromLVT(m, parameterNames);
-						GetParameterNamesFromSig(m.Signature, parameterNames);
-#if STATIC_COMPILER
-						wrapper.GetParameterNamesFromXml(m.Name, m.Signature, parameterNames);
-#endif
-						parameterBuilders = GetParameterBuilders(mb, parameterNames.Length, parameterNames);
-					}
-#if STATIC_COMPILER
-					if ((m.Modifiers & Modifiers.VarArgs) != 0 && !methods[i].HasCallerID)
-					{
-						if (parameterBuilders == null)
-						{
-							parameterBuilders = GetParameterBuilders(mb, methods[i].GetParameters().Length, null);
-						}
-						if (parameterBuilders.Length > 0)
-						{
-							AttributeHelper.SetParamArrayAttribute(parameterBuilders[parameterBuilders.Length - 1]);
-						}
-					}
-					wrapper.AddXmlMapParameterAttributes(mb, classFile.Name, m.Name, m.Signature, ref parameterBuilders);
-#endif
 					if (m.Annotations != null)
 					{
+						ParameterBuilder returnParameter = null;
 						foreach (object[] def in m.Annotations)
 						{
 							Annotation annotation = Annotation.Load(wrapper.GetClassLoader(), def);
@@ -4126,25 +4209,8 @@ namespace IKVM.Internal
 							}
 						}
 					}
-					if (m.ParameterAnnotations != null)
-					{
-						if (parameterBuilders == null)
-						{
-							parameterBuilders = GetParameterBuilders(mb, methods[i].GetParameters().Length, null);
-						}
-						object[][] defs = m.ParameterAnnotations;
-						for (int j = 0; j < defs.Length; j++)
-						{
-							foreach (object[] def in defs[j])
-							{
-								Annotation annotation = Annotation.Load(wrapper.GetClassLoader(), def);
-								if (annotation != null)
-								{
-									annotation.Apply(wrapper.GetClassLoader(), parameterBuilders[j], def);
-								}
-							}
-						}
-					}
+					string[] parameterNames;
+					AddMethodParameterInfo(m, methods[i], mb, out parameterNames);
 #if STATIC_COMPILER
 					if (methods[i].HasCallerID)
 					{
@@ -4195,6 +4261,10 @@ namespace IKVM.Internal
 					}
 				}
 
+#if STATIC_COMPILER
+				AddImplementsAttribute();
+#endif
+
 				Type type;
 				Profiler.Enter("TypeBuilder.CreateType");
 				try
@@ -4209,12 +4279,6 @@ namespace IKVM.Internal
 							tb.CreateType();
 						}
 					}
-#if STATIC_COMPILER
-					if (tbFields != null)
-					{
-						tbFields.CreateType();
-					}
-#endif
 				}
 				finally
 				{
@@ -4231,6 +4295,268 @@ namespace IKVM.Internal
 				return type;
 			}
 
+			private void AddMethodParameterInfo(ClassFile.Method m, MethodWrapper mw, MethodBuilder mb, out string[] parameterNames)
+			{
+				parameterNames = null;
+				ParameterBuilder[] parameterBuilders = null;
+				if (wrapper.GetClassLoader().EmitDebugInfo
+#if STATIC_COMPILER
+					|| (classFile.IsPublic && (m.IsPublic || m.IsProtected))
+#endif
+					)
+				{
+					parameterNames = new string[mw.GetParameters().Length];
+					GetParameterNamesFromMP(m, parameterNames);
+					GetParameterNamesFromLVT(m, parameterNames);
+					GetParameterNamesFromSig(m.Signature, parameterNames);
+#if STATIC_COMPILER
+					wrapper.GetParameterNamesFromXml(m.Name, m.Signature, parameterNames);
+#endif
+					parameterBuilders = GetParameterBuilders(mb, parameterNames.Length, parameterNames);
+				}
+#if STATIC_COMPILER
+				if ((m.Modifiers & Modifiers.VarArgs) != 0 && !mw.HasCallerID)
+				{
+					if (parameterBuilders == null)
+					{
+						parameterBuilders = GetParameterBuilders(mb, mw.GetParameters().Length, null);
+					}
+					if (parameterBuilders.Length > 0)
+					{
+						AttributeHelper.SetParamArrayAttribute(parameterBuilders[parameterBuilders.Length - 1]);
+					}
+				}
+				wrapper.AddXmlMapParameterAttributes(mb, classFile.Name, m.Name, m.Signature, ref parameterBuilders);
+#endif
+				if (m.ParameterAnnotations != null)
+				{
+					if (parameterBuilders == null)
+					{
+						parameterBuilders = GetParameterBuilders(mb, mw.GetParameters().Length, null);
+					}
+					object[][] defs = m.ParameterAnnotations;
+					for (int j = 0; j < defs.Length; j++)
+					{
+						foreach (object[] def in defs[j])
+						{
+							Annotation annotation = Annotation.Load(wrapper.GetClassLoader(), def);
+							if (annotation != null)
+							{
+								annotation.Apply(wrapper.GetClassLoader(), parameterBuilders[j], def);
+							}
+						}
+					}
+				}
+			}
+
+#if STATIC_COMPILER
+			private void AddImplementsAttribute()
+			{
+				TypeWrapper[] interfaces = wrapper.Interfaces;
+				if (wrapper.BaseTypeWrapper == CoreClasses.java.lang.Object.Wrapper)
+				{
+					// We special case classes extending java.lang.Object to optimize the metadata encoding
+					// for anonymous classes that implement an interface.
+					Type[] actualInterfaces = typeBuilder.GetInterfaces();
+					if (actualInterfaces.Length == 0)
+					{
+						return;
+					}
+					else if (actualInterfaces.Length == 1
+						&& interfaces.Length == 1
+						&& !interfaces[0].IsRemapped
+						&& interfaces[0].TypeAsBaseType == actualInterfaces[0])
+					{
+						// We extend java.lang.Object and implement only a single (non-remapped) interface,
+						// in this case we can omit the ImplementAttribute since the runtime will be able
+						// to reliable reproduce the "list" of implemented interfaces.
+						return;
+					}
+				}
+				else if (interfaces.Length == 0)
+				{
+					return;
+				}
+				AttributeHelper.SetImplementsAttribute(typeBuilder, interfaces);
+			}
+
+			private TypeBuilder DefineNestedInteropType(string name)
+			{
+				CompilerClassLoader ccl = wrapper.classLoader;
+				while (!ccl.ReserveName(classFile.Name + "$" + name))
+				{
+					name += "_";
+				}
+				TypeBuilder tb = typeBuilder.DefineNestedType(name, TypeAttributes.Class | TypeAttributes.NestedPublic | TypeAttributes.Sealed | TypeAttributes.Abstract);
+				RegisterNestedTypeBuilder(tb);
+				AttributeHelper.HideFromJava(tb);
+				return tb;
+			}
+	
+			private void AddInterfaceFieldsInterop(FieldWrapper[] fields)
+			{
+				if (classFile.IsInterface && classFile.IsPublic && !wrapper.IsGhost && classFile.Fields.Length > 0)
+				{
+					TypeBuilder tbFields = DefineNestedInteropType("__Fields");
+					CodeEmitter ilgenClinit = null;
+					for (int i = 0; i < classFile.Fields.Length; i++)
+					{
+						ClassFile.Field f = classFile.Fields[i];
+						if (f.ConstantValue != null)
+						{
+							FieldAttributes attribs = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
+							FieldBuilder fb = tbFields.DefineField(f.Name, fields[i].FieldTypeWrapper.TypeAsSignatureType, attribs);
+							fb.SetConstant(f.ConstantValue);
+						}
+						else
+						{
+							FieldAttributes attribs = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.InitOnly;
+							FieldBuilder fb = tbFields.DefineField(f.Name, fields[i].FieldTypeWrapper.TypeAsPublicSignatureType, attribs);
+							if (ilgenClinit == null)
+							{
+								ilgenClinit = CodeEmitter.Create(ReflectUtil.DefineTypeInitializer(tbFields));
+							}
+							wrapper.GetFieldWrapper(f.Name, f.Signature).EmitGet(ilgenClinit);
+							ilgenClinit.Emit(OpCodes.Stsfld, fb);
+						}
+					}
+					if (ilgenClinit != null)
+					{
+						ilgenClinit.Emit(OpCodes.Ret);
+						ilgenClinit.DoEmit();
+					}
+				}
+			}
+
+			private void AddInterfaceMethodsInterop(MethodWrapper[] methods)
+			{
+				if (classFile.IsInterface && classFile.IsPublic && classFile.MajorVersion >= 52 && !wrapper.IsGhost && methods.Length > 0)
+				{
+					TypeBuilder tbMethods = null;
+					foreach (MethodWrapper mw in methods)
+					{
+						if (mw.IsStatic && ParametersAreAccessible(mw))
+						{
+							if (tbMethods == null)
+							{
+								tbMethods = DefineNestedInteropType("__Methods");
+							}
+							MethodBuilder mb = mw.GetDefineMethodHelper().DefineMethod(wrapper.GetClassLoader().GetTypeWrapperFactory(), tbMethods, mw.Name, MethodAttributes.Public | MethodAttributes.Static, null, true);
+							CodeEmitter ilgen = CodeEmitter.Create(mb);
+							TypeWrapper[] parameters = mw.GetParameters();
+							for (int i = 0; i < parameters.Length; i++)
+							{
+								ilgen.EmitLdarg(i);
+								if (!parameters[i].IsUnloadable && !parameters[i].IsPublic)
+								{
+									parameters[i].EmitCheckcast(ilgen);
+								}
+							}
+							mw.EmitCall(ilgen);
+							ilgen.Emit(OpCodes.Ret);
+							ilgen.DoEmit();
+						}
+					}
+				}
+			}
+
+			private void CreateDefaultMethodInterop(ref TypeBuilder tbDefaultMethods, MethodBuilder defaultMethod, MethodWrapper mw)
+			{
+				if (!ParametersAreAccessible(mw))
+				{
+					return;
+				}
+				if (tbDefaultMethods == null)
+				{
+					tbDefaultMethods = DefineNestedInteropType("__DefaultMethods");
+				}
+				MethodBuilder mb = mw.GetDefineMethodHelper().DefineMethod(wrapper.GetClassLoader().GetTypeWrapperFactory(), tbDefaultMethods, mw.Name, MethodAttributes.Public | MethodAttributes.Static, wrapper.TypeAsSignatureType, true);
+				CodeEmitter ilgen = CodeEmitter.Create(mb);
+				ilgen.EmitLdarg(0);
+				ilgen.Emit(OpCodes.Dup);
+				ilgen.EmitNullCheck();
+				TypeWrapper[] parameters = mw.GetParameters();
+				for (int i = 0; i < parameters.Length; i++)
+				{
+					ilgen.EmitLdarg(i + 1);
+					if (!parameters[i].IsUnloadable && !parameters[i].IsPublic)
+					{
+						parameters[i].EmitCheckcast(ilgen);
+					}
+				}
+				ilgen.Emit(OpCodes.Call, defaultMethod);
+				ilgen.Emit(OpCodes.Ret);
+				ilgen.DoEmit();
+			}
+#endif
+
+			private void AddInheritedDefaultInterfaceMethods(MethodWrapper[] methods)
+			{
+				// look at the miranda methods to see if we inherit any default interface methods
+				for (int i = classFile.Methods.Length; i < methods.Length; i++)
+				{
+					if (methods[i].IsMirandaMethod)
+					{
+						MirandaMethodWrapper mmw = (MirandaMethodWrapper)methods[i];
+						if (mmw.Error == null && !mmw.BaseMethod.IsAbstract)
+						{
+							// we inherited a default interface method, so we need to forward the miranda method to the default method
+							MethodBuilder mb = (MethodBuilder)mmw.GetMethod();
+							if (classFile.IsInterface)
+							{
+								// if we're an interface with a default miranda method, we need to create a new default method that forwards to the original
+								mb = methods[i].GetDefineMethodHelper().DefineMethod(wrapper.GetClassLoader().GetTypeWrapperFactory(),
+									typeBuilder, NamePrefix.DefaultMethod + mb.Name, MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.SpecialName, typeBuilder, false);
+							}
+							CodeEmitter ilgen = CodeEmitter.Create(mb);
+							ilgen.EmitLdarg(0);
+							for (int j = 0, count = mmw.GetParameters().Length; j < count; j++)
+							{
+								ilgen.EmitLdarg(j + 1);
+							}
+							ilgen.Emit(OpCodes.Call, GetDefaultInterfaceMethod(mmw.BaseMethod));
+							ilgen.Emit(OpCodes.Ret);
+							ilgen.DoEmit();
+						}
+					}
+				}
+			}
+
+			private static MethodInfo GetDefaultInterfaceMethod(MethodWrapper mw)
+			{
+#if !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR
+				mw.ResolveMethod();
+#endif
+				MethodInfo mi = (MethodInfo)mw.GetMethod();
+				ParameterInfo[] parameters = mi.GetParameters();
+				foreach (MethodInfo candidate in mi.DeclaringType.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly))
+				{
+					if (candidate.Name.StartsWith(NamePrefix.DefaultMethod, StringComparison.Ordinal)
+						&& candidate.Name.Length == mi.Name.Length + NamePrefix.DefaultMethod.Length
+						&& candidate.Name.EndsWith(mi.Name, StringComparison.Ordinal))
+					{
+						ParameterInfo[] candidateParameters = candidate.GetParameters();
+						if (parameters.Length + 1 == candidateParameters.Length)
+						{
+							bool match = true;
+							for (int i = 0; i < parameters.Length; i++)
+							{
+								if (ReflectUtil.MatchParameterInfos(parameters[i], candidateParameters[i + 1]))
+								{
+									match = false;
+									break;
+								}
+							}
+							if (match)
+							{
+								return candidate;
+							}
+						}
+					}
+				}
+				throw new InvalidOperationException();
+			}
+
 #if STATIC_COMPILER
 			private void AddAccessStubs()
 			{
@@ -4322,7 +4648,7 @@ namespace IKVM.Internal
 				}
 				else
 				{
-					Type propType = ToPublicSignatureType(fw.FieldTypeWrapper);
+					Type propType = fw.FieldTypeWrapper.TypeAsPublicSignatureType;
 					Type[] modopt = wrapper.GetModOpt(fw.FieldTypeWrapper, true);
 					PropertyBuilder pb = typeBuilder.DefineProperty(fw.Name, PropertyAttributes.None, propType, null, modopt, Type.EmptyTypes, null, null);
 					if (type1)
@@ -4341,9 +4667,7 @@ namespace IKVM.Internal
 					}
 					// we append the IKVM.Attributes.AccessStub type to the modopt array for use in the property accessor method signature
 					// to make sure they never conflict with any user defined methhods
-					Type[] modopt2 = modopt;
-					Array.Resize(ref modopt2, modopt2.Length + 1);
-					modopt2[modopt2.Length - 1] = JVM.LoadType(typeof(IKVM.Attributes.AccessStub));
+					Type[] modopt2 = ArrayUtil.Concat(modopt, JVM.LoadType(typeof(IKVM.Attributes.AccessStub)));
 					MethodBuilder getter = typeBuilder.DefineMethod("get_" + fw.Name, attribs, CallingConventions.Standard, propType, null, modopt2, Type.EmptyTypes, null, null);
 					AttributeHelper.HideFromJava(getter);
 					pb.SetGetMethod(getter);
@@ -4441,13 +4765,11 @@ namespace IKVM.Internal
 				for (int i = 0; i < parameters.Length; i++)
 				{
 					realParameterTypes[i] = parameters[i].TypeAsSignatureType;
-					parameterTypes[i] = ToPublicSignatureType(parameters[i]);
+					parameterTypes[i] = parameters[i].TypeAsPublicSignatureType;
 					modopt[i] = wrapper.GetModOpt(parameters[i], true);
 				}
-				Type returnType = ToPublicSignatureType(mw.ReturnType);
-				Type[] modoptReturnType = wrapper.GetModOpt(mw.ReturnType, true);
-				Array.Resize(ref modoptReturnType, modoptReturnType.Length + 1);
-				modoptReturnType[modoptReturnType.Length - 1] = JVM.LoadType(typeof(IKVM.Attributes.AccessStub));
+				Type returnType = mw.ReturnType.TypeAsPublicSignatureType;
+				Type[] modoptReturnType = ArrayUtil.Concat(wrapper.GetModOpt(mw.ReturnType, true), JVM.LoadType(typeof(IKVM.Attributes.AccessStub)));
 				string name;
 				if (mw.Name == StringConstants.INIT)
 				{
@@ -4501,11 +4823,6 @@ namespace IKVM.Internal
 				ilgen.DoEmit();
 			}
 
-			private static Type ToPublicSignatureType(TypeWrapper tw)
-			{
-				return (tw.IsPublic ? tw : tw.GetPublicBaseTypeWrapper()).TypeAsSignatureType;
-			}
-
 			private bool ParametersAreAccessible(MethodWrapper mw)
 			{
 				foreach (TypeWrapper tw in mw.GetParameters())
@@ -5133,6 +5450,10 @@ namespace IKVM.Internal
 					if (!interfaceList.Contains(iface))
 					{
 						interfaceList.Add(iface);
+						if (!iface.IsAccessibleFrom(wrapper))
+						{
+							continue;
+						}
 						// NOTE we're using TypeAsBaseType for the interfaces!
 						typeBuilder.AddInterfaceImplementation(iface.TypeAsBaseType);
 #if STATIC_COMPILER
@@ -5589,6 +5910,21 @@ namespace IKVM.Internal
 			ilgen.DoEmit();
 		}
 
+		private static void GetParameterNamesFromMP(ClassFile.Method m, string[] parameterNames)
+		{
+			ClassFile.Method.MethodParametersEntry[] methodParameters = m.MethodParameters;
+			if (methodParameters != null)
+			{
+				for (int i = 0, count = Math.Min(parameterNames.Length, methodParameters.Length); i < count; i++)
+				{
+					if (parameterNames[i] == null)
+					{
+						parameterNames[i] = methodParameters[i].name;
+					}
+				}
+			}
+		}
+
 		protected static void GetParameterNamesFromLVT(ClassFile.Method m, string[] parameterNames)
 		{
 			ClassFile.Method.LocalVariableTableEntry[] localVars = m.LocalVariableTableAttribute;
@@ -5769,9 +6105,35 @@ namespace IKVM.Internal
 		protected abstract TypeBuilder DefineGhostType(string mangledTypeName, TypeAttributes typeAttribs);
 #endif // STATIC_COMPILER
 
-		protected virtual bool IsPInvokeMethod(ClassFile.Method m)
+		private bool IsPInvokeMethod(ClassFile.Method m)
 		{
-#if CLASSGC
+#if STATIC_COMPILER
+			Dictionary<string, IKVM.Internal.MapXml.Class> mapxml = classLoader.GetMapXmlClasses();
+			if (mapxml != null)
+			{
+				IKVM.Internal.MapXml.Class clazz;
+				if (mapxml.TryGetValue(this.Name, out clazz) && clazz.Methods != null)
+				{
+					foreach (IKVM.Internal.MapXml.Method method in clazz.Methods)
+					{
+						if (method.Name == m.Name && method.Sig == m.Signature)
+						{
+							if (method.Attributes != null)
+							{
+								foreach (IKVM.Internal.MapXml.Attribute attr in method.Attributes)
+								{
+									if (StaticCompiler.GetType(classLoader, attr.Type) == JVM.Import(typeof(System.Runtime.InteropServices.DllImportAttribute)))
+									{
+										return true;
+									}
+								}
+							}
+							break;
+						}
+					}
+				}
+			}
+#elif CLASSGC
 			// TODO PInvoke is not supported in RunAndCollect assemblies,
 			if (JVM.classUnloading)
 			{
@@ -5886,19 +6248,28 @@ namespace IKVM.Internal
 			return -1;
 		}
 
-		internal override object[] GetDeclaredAnnotations()
+		private object[] DecodeAnnotations(object[] definitions)
 		{
-			object[] annotations = impl.GetDeclaredAnnotations();
-			if (annotations != null)
+			if (definitions == null)
 			{
-				object[] objs = new object[annotations.Length];
-				for (int i = 0; i < annotations.Length; i++)
+				return null;
+			}
+			java.lang.ClassLoader loader = GetClassLoader().GetJavaClassLoader();
+			List<object> annotations = new List<object>();
+			for (int i = 0; i < definitions.Length; i++)
+			{
+				object obj = JVM.NewAnnotation(loader, definitions[i]);
+				if (obj != null)
 				{
-					objs[i] = JVM.NewAnnotation(GetClassLoader().GetJavaClassLoader(), annotations[i]);
+					annotations.Add(obj);
 				}
-				return objs;
 			}
-			return null;
+			return annotations.ToArray();
+		}
+
+		internal override object[] GetDeclaredAnnotations()
+		{
+			return DecodeAnnotations(impl.GetDeclaredAnnotations());
 		}
 
 		internal override object[] GetMethodAnnotations(MethodWrapper mw)
@@ -5908,17 +6279,7 @@ namespace IKVM.Internal
 			{
 				if (methods[i] == mw)
 				{
-					object[] annotations = impl.GetMethodAnnotations(i);
-					if (annotations != null)
-					{
-						object[] objs = new object[annotations.Length];
-						for (int j = 0; j < annotations.Length; j++)
-						{
-							objs[j] = JVM.NewAnnotation(GetClassLoader().GetJavaClassLoader(), annotations[j]);
-						}
-						return objs;
-					}
-					return null;
+					return DecodeAnnotations(impl.GetMethodAnnotations(i));
 				}
 			}
 			Debug.Fail("Unreachable code");
@@ -5938,11 +6299,7 @@ namespace IKVM.Internal
 						object[][] objs = new object[annotations.Length][];
 						for (int j = 0; j < annotations.Length; j++)
 						{
-							objs[j] = new object[annotations[j].Length];
-							for (int k = 0; k < annotations[j].Length; k++)
-							{
-								objs[j][k] = JVM.NewAnnotation(GetClassLoader().GetJavaClassLoader(), annotations[j][k]);
-							}
+							objs[j] = DecodeAnnotations(annotations[j]);
 						}
 						return objs;
 					}
@@ -5960,17 +6317,7 @@ namespace IKVM.Internal
 			{
 				if (fields[i] == fw)
 				{
-					object[] annotations = impl.GetFieldAnnotations(i);
-					if (annotations != null)
-					{
-						object[] objs = new object[annotations.Length];
-						for (int j = 0; j < annotations.Length; j++)
-						{
-							objs[j] = JVM.NewAnnotation(GetClassLoader().GetJavaClassLoader(), annotations[j]);
-						}
-						return objs;
-					}
-					return null;
+					return DecodeAnnotations(impl.GetFieldAnnotations(i));
 				}
 			}
 			Debug.Fail("Unreachable code");
@@ -5995,14 +6342,19 @@ namespace IKVM.Internal
 			Debug.Fail("Unreachable code");
 			return null;
 		}
+
+		private Type GetBaseTypeForDefineType()
+		{
+			return BaseTypeWrapper.TypeAsBaseType;
+		}
 #endif
 
+#if STATIC_COMPILER
 		protected virtual Type GetBaseTypeForDefineType()
 		{
 			return BaseTypeWrapper.TypeAsBaseType;
 		}
 
-#if STATIC_COMPILER
 		internal virtual MethodWrapper[] GetReplacedMethodsFor(MethodWrapper mw)
 		{
 			return null;
@@ -6072,6 +6424,14 @@ namespace IKVM.Internal
 					&& (fw.IsPublic || (fw.IsProtected && !this.IsFinal))
 					&& (fw.FieldTypeWrapper.IsUnloadable || fw.FieldTypeWrapper.IsAccessibleFrom(this) || fw.FieldTypeWrapper.InternalsVisibleTo(this)));
 		}
+
+		internal static bool RequiresDynamicReflectionCallerClass(string classFile, string method, string signature)
+		{
+			return (classFile == "java.lang.ClassLoader" && method == "getParent" && signature == "()Ljava.lang.ClassLoader;")
+				|| (classFile == "java.lang.Thread" && method == "getContextClassLoader" && signature == "()Ljava.lang.ClassLoader;")
+				|| (classFile == "java.io.ObjectStreamField" && method == "getType" && signature == "()Ljava.lang.Class;")
+				;
+		}
 #endif
 	}
 
@@ -6091,26 +6451,42 @@ namespace IKVM.Internal
 
 		internal MethodBuilder DefineMethod(DynamicTypeWrapper context, TypeBuilder tb, string name, MethodAttributes attribs)
 		{
-			return DefineMethod(context.GetClassLoader().GetTypeWrapperFactory(), tb, name, attribs);
+			return DefineMethod(context.GetClassLoader().GetTypeWrapperFactory(), tb, name, attribs, null, false);
 		}
 
 		internal MethodBuilder DefineMethod(TypeWrapperFactory context, TypeBuilder tb, string name, MethodAttributes attribs)
 		{
+			return DefineMethod(context, tb, name, attribs, null, false);
+		}
+
+		internal MethodBuilder DefineMethod(TypeWrapperFactory context, TypeBuilder tb, string name, MethodAttributes attribs, Type firstParameter, bool mustBePublic)
+		{
 			// we add optional modifiers to make the signature unique
+			int firstParam = firstParameter == null ? 0 : 1;
 			TypeWrapper[] parameters = mw.GetParameters();
-			Type[] parameterTypes = new Type[parameters.Length + (mw.HasCallerID ? 1 : 0)];
+			Type[] parameterTypes = new Type[parameters.Length + (mw.HasCallerID ? 1 : 0) + firstParam];
 			Type[][] modopt = new Type[parameterTypes.Length][];
+			if (firstParameter != null)
+			{
+				parameterTypes[0] = firstParameter;
+				modopt[0] = Type.EmptyTypes;
+			}
 			for (int i = 0; i < parameters.Length; i++)
 			{
-				parameterTypes[i] = parameters[i].TypeAsSignatureType;
-				modopt[i] = DynamicTypeWrapper.GetModOpt(context, parameters[i], false);
+				parameterTypes[i + firstParam] = mustBePublic
+					? parameters[i].TypeAsPublicSignatureType
+					: parameters[i].TypeAsSignatureType;
+				modopt[i + firstParam] = DynamicTypeWrapper.GetModOpt(context, parameters[i], mustBePublic);
 			}
 			if (mw.HasCallerID)
 			{
 				parameterTypes[parameterTypes.Length - 1] = CoreClasses.ikvm. at internal.CallerID.Wrapper.TypeAsSignatureType;
 			}
-			Type[] modoptReturnType = DynamicTypeWrapper.GetModOpt(context, mw.ReturnType, false);
-			return tb.DefineMethod(name, attribs, CallingConventions.Standard, mw.ReturnType.TypeAsSignatureType, null, modoptReturnType, parameterTypes, null, modopt);
+			Type returnType = mustBePublic
+				? mw.ReturnType.TypeAsPublicSignatureType
+				: mw.ReturnType.TypeAsSignatureType;
+			Type[] modoptReturnType = DynamicTypeWrapper.GetModOpt(context, mw.ReturnType, mustBePublic);
+			return tb.DefineMethod(name, attribs, CallingConventions.Standard, returnType, null, modoptReturnType, parameterTypes, null, modopt);
 		}
 
 		internal MethodBuilder DefineConstructor(DynamicTypeWrapper context, TypeBuilder tb, MethodAttributes attribs)
diff --git a/external/ikvm/runtime/ExceptionHelper.cs b/external/ikvm/runtime/ExceptionHelper.cs
index eeb7a3d..e69ae97 100644
--- a/external/ikvm/runtime/ExceptionHelper.cs
+++ b/external/ikvm/runtime/ExceptionHelper.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2011 Jeroen Frijters
+  Copyright (C) 2002-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -294,6 +294,10 @@ namespace IKVM.Internal
 			{
 				return "<clinit>";
 			}
+			else if(mb.Name.StartsWith(NamePrefix.DefaultMethod, StringComparison.Ordinal))
+			{
+				return mb.Name.Substring(NamePrefix.DefaultMethod.Length);
+			}
 			else
 			{
 				return mb.Name;
@@ -305,7 +309,7 @@ namespace IKVM.Internal
 #if FIRST_PASS
 			return false;
 #else
-			return NativeCode.sun.reflect.Reflection.IsHideFromJava(mb) || (mb.DeclaringType == typeof(ikvm.runtime.Util) && mb.Name == "mapException");
+			return Java_sun_reflect_Reflection.IsHideFromJava(mb) || (mb.DeclaringType == typeof(ikvm.runtime.Util) && mb.Name == "mapException");
 #endif
 		}
 
@@ -553,11 +557,11 @@ namespace IKVM.Internal
 #if !FIRST_PASS
 			if (_this_cause != _this)
 			{
-				throw new java.lang.IllegalStateException("Can't overwrite cause");
+				throw new java.lang.IllegalStateException("Can't overwrite cause with " + java.util.Objects.toString(cause, "a null"), _this);
 			}
 			if (cause == _this)
 			{
-				throw new java.lang.IllegalArgumentException("Self-causation not permitted");
+				throw new java.lang.IllegalArgumentException("Self-causation not permitted", _this);
 			}
 #endif
 		}
@@ -569,7 +573,7 @@ namespace IKVM.Internal
 			{
 				if (_this == x)
 				{
-					throw new java.lang.IllegalArgumentException("Self-suppression not permitted");
+					throw new java.lang.IllegalArgumentException("Self-suppression not permitted", x);
 				}
 				if (x == null)
 				{
diff --git a/external/ikvm/runtime/JniInterface.cs b/external/ikvm/runtime/JniInterface.cs
index aee0a47..d81576d 100644
--- a/external/ikvm/runtime/JniInterface.cs
+++ b/external/ikvm/runtime/JniInterface.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2009 Jeroen Frijters
+  Copyright (C) 2002-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -350,7 +350,7 @@ namespace IKVM.Runtime
 		{
 			private const string library = "ikvm-native-win32-x86";
 
-			[DllImport(library)]
+			[DllImport(library, SetLastError = true)]
 			private static extern IntPtr ikvm_LoadLibrary(string filename);
 			[DllImport(library)]
 			private static extern void ikvm_FreeLibrary(IntPtr handle);
@@ -398,7 +398,7 @@ namespace IKVM.Runtime
 		{
 			private const string library = "ikvm-native-win32-x64";
 
-			[DllImport(library)]
+			[DllImport(library, SetLastError = true)]
 			private static extern IntPtr ikvm_LoadLibrary(string filename);
 			[DllImport(library)]
 			private static extern void ikvm_FreeLibrary(IntPtr handle);
@@ -446,7 +446,7 @@ namespace IKVM.Runtime
 		{
 			private const string library = "ikvm-native";
 
-			[DllImport(library)]
+			[DllImport(library, SetLastError = true)]
 			private static extern IntPtr ikvm_LoadLibrary(string filename);
 			[DllImport(library)]
 			private static extern void ikvm_FreeLibrary(IntPtr handle);
@@ -553,7 +553,8 @@ namespace IKVM.Runtime
 				IntPtr p = NativeLibrary.LoadLibrary(filename);
 				if(p == IntPtr.Zero)
 				{
-					Tracer.Info(Tracer.Jni, "Library not found: {0}", filename);
+					Tracer.Info(Tracer.Jni, "Failed to load library: path = '{0}', error = {1}, message = {2}", filename,
+						Marshal.GetLastWin32Error(), new System.ComponentModel.Win32Exception().Message);
 					return 0;
 				}
 				try
@@ -1127,7 +1128,7 @@ namespace IKVM.Runtime
 				return JNIEnv.JNI_ERR;
 			}
 			JNI.jvmDestroyed = true;
-			IKVM.NativeCode.java.lang.Thread.WaitUntilLastJniThread();
+			Java_java_lang_Thread.WaitUntilLastJniThread();
 			return JNIEnv.JNI_OK;
 		}
 
@@ -1172,7 +1173,7 @@ namespace IKVM.Runtime
 				object threadGroup = GlobalRefs.Unwrap(pAttachArgs->group.ToInt32());
 				if(threadGroup != null)
 				{
-					IKVM.NativeCode.java.lang.Thread.AttachThreadFromJni(threadGroup);
+					Java_java_lang_Thread.AttachThreadFromJni(threadGroup);
 				}
 			}
 			*penv = JNIEnv.CreateJNIEnv();
@@ -1188,7 +1189,7 @@ namespace IKVM.Runtime
 			}
 			// TODO if we set Thread.IsBackground to false when we attached, now might be a good time to set it back to true.
 			JNIEnv.FreeJNIEnv();
-			IKVM.NativeCode.ikvm.runtime.Startup.jniDetach();
+			Java_ikvm_runtime_Startup.jniDetach();
 			return JNIEnv.JNI_OK;
 		}
 
@@ -1243,7 +1244,7 @@ namespace IKVM.Runtime
 		static JNIEnv()
 		{
 			// we set the field here so that IKVM.Runtime.dll doesn't have to load us if we're not otherwise needed
-			IKVM.NativeCode.java.lang.SecurityManager.jniAssembly = typeof(JNIEnv).Assembly;
+			Java_java_lang_SecurityManager.jniAssembly = typeof(JNIEnv).Assembly;
 		}
 
 		internal ManagedJNIEnv GetManagedJNIEnv()
@@ -1622,7 +1623,7 @@ namespace IKVM.Runtime
 				// TODO what should the protection domain be?
 				// NOTE I'm assuming name is platform encoded (as opposed to UTF-8), but the Sun JVM only seems to work for ASCII.
 				global::java.lang.ClassLoader classLoader = (global::java.lang.ClassLoader)pEnv->UnwrapRef(loader);
-				return pEnv->MakeLocalRef(IKVM.NativeCode.java.lang.ClassLoader.defineClass0(classLoader, name != null ? StringFromOEM(name) : null, buf, 0, buf.Length, null));
+				return pEnv->MakeLocalRef(Java_java_lang_ClassLoader.defineClass0(classLoader, name != null ? StringFromOEM(name) : null, buf, 0, buf.Length, null));
 			}
 			catch(Exception x)
 			{
@@ -1690,7 +1691,7 @@ namespace IKVM.Runtime
 
 		internal static jfieldID FromReflectedField(JNIEnv* pEnv, jobject field)
 		{
-			return FieldWrapper.FromField(pEnv->UnwrapRef(field)).Cookie;
+			return FieldWrapper.FromField((java.lang.reflect.Field)pEnv->UnwrapRef(field)).Cookie;
 		}
 
 		internal static jobject ToReflectedMethod(JNIEnv* pEnv, jclass clazz_ignored, jmethodID method, jboolean isStatic)
@@ -1725,7 +1726,10 @@ namespace IKVM.Runtime
 		{
 			ManagedJNIEnv env = pEnv->GetManagedJNIEnv();
 			Exception x = UnwrapRef(env, throwable) as Exception;
-			env.pendingException = x;
+			if (x != null)
+			{
+				env.pendingException = x;
+			}
 			return JNI_OK;
 		}
 
@@ -1733,7 +1737,7 @@ namespace IKVM.Runtime
 		{
 			ManagedJNIEnv env = pEnv->GetManagedJNIEnv();
 			TypeWrapper wrapper = TypeWrapper.FromClass((java.lang.Class)UnwrapRef(env, clazz));
-			MethodWrapper mw = wrapper.GetMethodWrapper("<init>", "(Ljava.lang.String;)V", false);
+			MethodWrapper mw = wrapper.GetMethodWrapper("<init>", msg == null ? "()V" : "(Ljava.lang.String;)V", false);
 			if(mw != null)
 			{
 				jint rc;
@@ -1742,7 +1746,7 @@ namespace IKVM.Runtime
 				{
 					wrapper.Finish();
 					java.lang.reflect.Constructor cons = (java.lang.reflect.Constructor)mw.ToMethodOrConstructor(false);
-					exception = (Exception)cons.newInstance(new object[] { StringFromOEM(msg) }, env.callerID);
+					exception = (Exception)cons.newInstance(msg == null ? new object[0] : new object[] { StringFromOEM(msg) }, env.callerID);
 					rc = JNI_OK;
 				}
 				catch(RetargetableJavaException x)
@@ -1925,50 +1929,104 @@ namespace IKVM.Runtime
 			public jobject l;
 		}
 
-		private static object InvokeHelper(JNIEnv* pEnv, jobject obj, jmethodID methodID, jvalue *args, bool nonVirtual)
+		private static object InvokeHelper(JNIEnv* pEnv, jobject objHandle, jmethodID methodID, jvalue* pArgs, bool nonVirtual)
 		{
 			ManagedJNIEnv env = pEnv->GetManagedJNIEnv();
+			object obj = UnwrapRef(env, objHandle);
 			MethodWrapper mw = MethodWrapper.FromCookie(methodID);
+			mw.Link();
+			mw.ResolveMethod();
 			TypeWrapper[] argTypes = mw.GetParameters();
-			object[] argarray = new object[argTypes.Length];
-			for (int i = 0; i < argarray.Length; i++)
+			object[] args = new object[argTypes.Length + (mw.HasCallerID ? 1 : 0)];
+			for (int i = 0; i < argTypes.Length; i++)
 			{
 				TypeWrapper type = argTypes[i];
 				if (type == PrimitiveTypeWrapper.BOOLEAN)
-					argarray[i] = java.lang.Boolean.valueOf(args[i].z != JNI_FALSE);
+					args[i] = pArgs[i].z != JNI_FALSE;
 				else if (type == PrimitiveTypeWrapper.BYTE)
-					argarray[i] = java.lang.Byte.valueOf((byte)args[i].b);
+					args[i] = (byte)pArgs[i].b;
 				else if (type == PrimitiveTypeWrapper.CHAR)
-					argarray[i] = java.lang.Character.valueOf((char)args[i].c);
+					args[i] = (char)pArgs[i].c;
 				else if (type == PrimitiveTypeWrapper.SHORT)
-					argarray[i] = java.lang.Short.valueOf(args[i].s);
+					args[i] = pArgs[i].s;
 				else if (type == PrimitiveTypeWrapper.INT)
-					argarray[i] = java.lang.Integer.valueOf(args[i].i);
+					args[i] = pArgs[i].i;
 				else if (type == PrimitiveTypeWrapper.LONG)
-					argarray[i] = java.lang.Long.valueOf(args[i].j);
+					args[i] = pArgs[i].j;
 				else if (type == PrimitiveTypeWrapper.FLOAT)
-					argarray[i] = java.lang.Float.valueOf(args[i].f);
+					args[i] = pArgs[i].f;
 				else if (type == PrimitiveTypeWrapper.DOUBLE)
-					argarray[i] = java.lang.Double.valueOf(args[i].d);
+					args[i] = pArgs[i].d;
 				else
-					argarray[i] = UnwrapRef(env, args[i].l);
+					args[i] = argTypes[i].GhostWrap(UnwrapRef(env, pArgs[i].l));
 			}
-			try
+			if (mw.HasCallerID)
 			{
-				return mw.InvokeJNI(UnwrapRef(env, obj), argarray, nonVirtual, env.callerID);
+				args[args.Length - 1] = env.callerID;
 			}
-			catch(java.lang.reflect.InvocationTargetException x)
+			try
 			{
-				SetPendingException(pEnv, ikvm.runtime.Util.mapException(x.getCause()));
-				return null;
+				if (nonVirtual && mw.RequiresNonVirtualDispatcher)
+				{
+					return InvokeNonVirtual(env, mw, obj, args);
+				}
+				if (mw.IsConstructor)
+				{
+					if (obj == null)
+					{
+						return mw.CreateInstance(args);
+					}
+					else
+					{
+						MethodBase mb = mw.GetMethod();
+						if (mb.IsStatic)
+						{
+							// we're dealing with a constructor on a remapped type, if obj is supplied, it means
+							// that we should call the constructor on an already existing instance, but that isn't
+							// possible with remapped types
+							throw new NotSupportedException(string.Format("Remapped type {0} doesn't support constructor invocation on an existing instance", mw.DeclaringType.Name));
+						}
+						else if (!mb.DeclaringType.IsInstanceOfType(obj))
+						{
+							// we're trying to initialize an existing instance of a remapped type
+							throw new NotSupportedException("Unable to partially construct object of type " + obj.GetType().FullName + " to type " + mb.DeclaringType.FullName);
+						}
+					}
+				}
+				return mw.Invoke(obj, args);
 			}
-			catch(Exception x)
+			catch (Exception x)
 			{
 				SetPendingException(pEnv, ikvm.runtime.Util.mapException(x));
 				return null;
 			}
 		}
 
+		private static object InvokeNonVirtual(ManagedJNIEnv env, MethodWrapper mw, object obj, object[] argarray)
+		{
+			if (mw.HasCallerID || mw.IsDynamicOnly)
+			{
+				throw new NotSupportedException();
+			}
+			if (mw.DeclaringType.IsRemapped && !mw.DeclaringType.TypeAsBaseType.IsInstanceOfType(obj))
+			{
+				return mw.InvokeNonvirtualRemapped(obj, argarray);
+			}
+			else
+			{
+				Delegate del = (Delegate)Activator.CreateInstance(mw.GetDelegateType(),
+					new object[] { obj, mw.GetMethod().MethodHandle.GetFunctionPointer() });
+				try
+				{
+					return del.DynamicInvoke(argarray);
+				}
+				catch (TargetInvocationException x)
+				{
+					throw ikvm.runtime.Util.mapException(x.InnerException);
+				}
+			}
+		}
+
 		internal static jobject NewObjectA(JNIEnv* pEnv, jclass clazz, jmethodID methodID, jvalue *args)
 		{
 			TypeWrapper wrapper = TypeWrapper.FromClass((java.lang.Class)pEnv->UnwrapRef(clazz));
@@ -2657,6 +2715,11 @@ namespace IKVM.Runtime
 
 		internal static jobject NewStringUTF(JNIEnv* pEnv, byte* psz)
 		{
+			if (psz == null)
+			{
+				// The JNI spec does not explicitly allow a null pointer, but the JDK accepts it
+				return IntPtr.Zero;
+			}
 			return pEnv->MakeLocalRef(StringFromUTF8(psz));
 		}
 
diff --git a/external/ikvm/runtime/MemberWrapper.cs b/external/ikvm/runtime/MemberWrapper.cs
index fb58917..6dcf22d 100644
--- a/external/ikvm/runtime/MemberWrapper.cs
+++ b/external/ikvm/runtime/MemberWrapper.cs
@@ -169,7 +169,7 @@ namespace IKVM.Internal
 
 		private bool IsPublicOrProtectedMemberAccessible(TypeWrapper caller, TypeWrapper instance)
 		{
-			if (IsPublic || (IsProtected && caller.IsSubTypeOf(DeclaringType) && (IsStatic || instance.IsSubTypeOf(caller))))
+			if (IsPublic || (IsProtected && caller.IsSubTypeOf(DeclaringType) && (IsStatic || instance.IsUnloadable || instance.IsSubTypeOf(caller))))
 			{
 				return DeclaringType.IsPublic || InPracticeInternalsVisibleTo(caller);
 			}
@@ -188,7 +188,7 @@ namespace IKVM.Internal
 			}
 #endif
 #if CLASSGC
-			if (DeclaringType is DynamicTypeWrapper)
+			if (DeclaringType.IsDynamic)
 			{
 				// if we are dynamic, we can just become friends with the caller
 				DeclaringType.GetClassLoader().GetTypeWrapperFactory().AddInternalsVisibleTo(caller.TypeAsTBD.Assembly);
@@ -353,17 +353,9 @@ namespace IKVM.Internal
 		}
 	}
 
-	interface ICustomInvoke
-	{
-#if !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR
-		object Invoke(object obj, object[] args);
-#endif
-	}
-
 	abstract class MethodWrapper : MemberWrapper
 	{
 #if !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR
-		private static Dictionary<MethodWrapper, sun.reflect.MethodAccessor> invokenonvirtualCache;
 		private volatile object reflectionMethod;
 #endif
 		internal static readonly MethodWrapper[] EmptyArray  = new MethodWrapper[0];
@@ -372,7 +364,7 @@ namespace IKVM.Internal
 		private TypeWrapper returnTypeWrapper;
 		private TypeWrapper[] parameterTypeWrappers;
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal virtual void EmitCall(CodeEmitter ilgen)
 		{
 			throw new InvalidOperationException();
@@ -397,7 +389,7 @@ namespace IKVM.Internal
 		{
 			return Intrinsics.Emit(context);
 		}
-#endif // STUB_GENERATOR
+#endif // EMITTERS
 
 		internal virtual bool IsDynamicOnly
 		{
@@ -571,20 +563,31 @@ namespace IKVM.Internal
 		}
 #endif // !FIRST_PASS
 
-		internal static MethodWrapper FromMethodOrConstructor(object methodOrConstructor)
+		internal static MethodWrapper FromMethod(java.lang.reflect.Method method)
+		{
+#if FIRST_PASS
+			return null;
+#else
+			return TypeWrapper.FromClass(method.getDeclaringClass()).GetMethods()[method._slot()];
+#endif
+		}
+
+		internal static MethodWrapper FromConstructor(java.lang.reflect.Constructor constructor)
 		{
 #if FIRST_PASS
 			return null;
 #else
-			java.lang.reflect.Method method = methodOrConstructor as java.lang.reflect.Method;
-			if (method != null)
-			{
-				return TypeWrapper.FromClass(method.getDeclaringClass()).GetMethods()[method._slot()];
-			}
-			java.lang.reflect.Constructor constructor = (java.lang.reflect.Constructor)methodOrConstructor;
 			return TypeWrapper.FromClass(constructor.getDeclaringClass()).GetMethods()[constructor._slot()];
 #endif
 		}
+		
+		internal static MethodWrapper FromMethodOrConstructor(object methodOrConstructor)
+		{
+			java.lang.reflect.Method method = methodOrConstructor as java.lang.reflect.Method;
+			return method != null
+				? FromMethod(method)
+				: FromConstructor((java.lang.reflect.Constructor)methodOrConstructor);
+		}
 #endif // !STATIC_COMPILER && !STUB_GENERATOR
 
 		[System.Security.SecurityCritical]
@@ -731,262 +734,111 @@ namespace IKVM.Internal
 			}
 		}
 
-		// this returns the Java method's attributes in .NET terms (e.g. used to create stubs for this method)
-		internal MethodAttributes GetMethodAttributes()
+		internal bool IsAbstract
 		{
-			MethodAttributes attribs = MethodAttributes.HideBySig;
-			if(IsStatic)
-			{
-				attribs |= MethodAttributes.Static;
-			}
-			if(IsPublic)
-			{
-				attribs |= MethodAttributes.Public;
-			}
-			else if(IsPrivate)
-			{
-				attribs |= MethodAttributes.Private;
-			}
-			else if(IsProtected)
-			{
-				attribs |= MethodAttributes.FamORAssem;
-			}
-			else
-			{
-				attribs |= MethodAttributes.Family;
-			}
-			// constructors aren't virtual
-			if(!IsStatic && !IsPrivate && Name != "<init>")
-			{
-				attribs |= MethodAttributes.Virtual;
-			}
-			if(IsFinal)
-			{
-				attribs |= MethodAttributes.Final;
-			}
-			if(IsAbstract)
+			get
 			{
-				attribs |= MethodAttributes.Abstract;
+				return (Modifiers & Modifiers.Abstract) != 0;
 			}
-			return attribs;
 		}
 
-		internal bool IsAbstract
+		internal bool RequiresNonVirtualDispatcher
 		{
 			get
 			{
-				return (Modifiers & Modifiers.Abstract) != 0;
+				return !IsConstructor
+					&& !IsStatic
+					&& !IsPrivate
+					&& !IsAbstract
+					&& !IsFinal
+					&& !DeclaringType.IsFinal;
 			}
 		}
 
 #if !STATIC_COMPILER && !STUB_GENERATOR
-		[HideFromJava]
-		internal object InvokeJNI(object obj, object[] args, bool nonVirtual, object callerID)
+		internal Type GetDelegateType()
 		{
-#if FIRST_PASS
-			return null;
-#else
-			if (IsConstructor)
-			{
-				java.lang.reflect.Constructor cons = (java.lang.reflect.Constructor)ToMethodOrConstructor(false);
-				if (obj == null)
-				{
-					sun.reflect.ConstructorAccessor acc = cons.getConstructorAccessor();
-					if (acc == null)
-					{
-						acc = (sun.reflect.ConstructorAccessor)IKVM.NativeCode.sun.reflect.ReflectionFactory.newConstructorAccessor0(null, cons);
-						cons.setConstructorAccessor(acc);
-					}
-					return acc.newInstance(args);
-				}
-				else if (!ReflectUtil.IsConstructor(method))
-				{
-					Debug.Assert(method.IsStatic);
-					// we're dealing with a constructor on a remapped type, if obj is supplied, it means
-					// that we should call the constructor on an already existing instance, but that isn't
-					// possible with remapped types
-					// the type of this exception is a bit random (note that this can only happen through JNI reflection)
-					throw new java.lang.IncompatibleClassChangeError(string.Format("Remapped type {0} doesn't support constructor invocation on an existing instance", DeclaringType.Name));
-				}
-				else if (!method.DeclaringType.IsInstanceOfType(obj))
-				{
-					// we're trying to initialize an existing instance of a remapped type
-					throw new NotSupportedException("Unable to partially construct object of type " + obj.GetType().FullName + " to type " + method.DeclaringType.FullName);
-				}
-				else
-				{
-					try
-					{
-						ResolveMethod();
-						InvokeArgsProcessor proc = new InvokeArgsProcessor(this, method, obj, UnboxArgs(args), (ikvm. at internal.CallerID)callerID);
-						object o = method.Invoke(proc.GetObj(), proc.GetArgs());
-						TypeWrapper retType = this.ReturnType;
-						if (!retType.IsUnloadable && retType.IsGhost)
-						{
-							o = retType.GhostRefField.GetValue(o);
-						}
-						return o;
-					}
-					catch (ArgumentException x1)
-					{
-						throw new java.lang.IllegalArgumentException(x1.Message);
-					}
-					catch (TargetInvocationException x)
-					{
-						throw new java.lang.reflect.InvocationTargetException(ikvm.runtime.Util.mapException(x.InnerException));
-					}
-				}
-			}
-			else if (nonVirtual
-				&& !this.IsStatic
-				&& !this.IsPrivate
-				&& !this.IsAbstract
-				&& !this.IsFinal
-				&& !this.DeclaringType.IsFinal)
-			{
-				if (this.DeclaringType.IsRemapped && !this.DeclaringType.TypeAsBaseType.IsInstanceOfType(obj))
-				{
-					ResolveMethod();
-					return InvokeNonvirtualRemapped(obj, UnboxArgs(args));
-				}
-				else
-				{
-					if (invokenonvirtualCache == null)
-					{
-						Interlocked.CompareExchange(ref invokenonvirtualCache, new Dictionary<MethodWrapper, sun.reflect.MethodAccessor>(), null);
-					}
-					sun.reflect.MethodAccessor acc;
-					lock (invokenonvirtualCache)
-					{
-						if (!invokenonvirtualCache.TryGetValue(this, out acc))
-						{
-							acc = new IKVM.NativeCode.sun.reflect.ReflectionFactory.FastMethodAccessorImpl((java.lang.reflect.Method)ToMethodOrConstructor(false), true);
-							invokenonvirtualCache.Add(this, acc);
-						}
-					}
-					object val = acc.invoke(obj, args, (ikvm. at internal.CallerID)callerID);
-					if (this.ReturnType.IsPrimitive && this.ReturnType != PrimitiveTypeWrapper.VOID)
-					{
-						val = JVM.Unbox(val);
-					}
-					return val;
-				}
-			}
-			else
+			TypeWrapper[] paramTypes = GetParameters();
+			if (paramTypes.Length > MethodHandleUtil.MaxArity)
 			{
-				java.lang.reflect.Method method = (java.lang.reflect.Method)ToMethodOrConstructor(false);
-				sun.reflect.MethodAccessor acc = method.getMethodAccessor();
-				if (acc == null)
+				Type type = DeclaringType.TypeAsBaseType.Assembly.GetType(
+					ReturnType == PrimitiveTypeWrapper.VOID ? "__<>NVIV`" + paramTypes.Length : "__<>NVI`" + (paramTypes.Length + 1));
+				if (type == null)
 				{
-					acc = (sun.reflect.MethodAccessor)IKVM.NativeCode.sun.reflect.ReflectionFactory.newMethodAccessor(null, method);
-					method.setMethodAccessor(acc);
+					type = DeclaringType.GetClassLoader().GetTypeWrapperFactory().DefineDelegate(paramTypes.Length, ReturnType == PrimitiveTypeWrapper.VOID);
 				}
-				object val = acc.invoke(obj, args, (ikvm. at internal.CallerID)callerID);
-				if (this.ReturnType.IsPrimitive && this.ReturnType != PrimitiveTypeWrapper.VOID)
+				Type[] types = new Type[paramTypes.Length + (ReturnType == PrimitiveTypeWrapper.VOID ? 0 : 1)];
+				for (int i = 0; i < paramTypes.Length; i++)
 				{
-					val = JVM.Unbox(val);
+					types[i] = paramTypes[i].TypeAsSignatureType;
 				}
-				return val;
-			}
-#endif
-		}
-
-		private object[] UnboxArgs(object[] args)
-		{
-			TypeWrapper[] paramTypes = GetParameters();
-			for (int i = 0; i < paramTypes.Length; i++)
-			{
-				if (paramTypes[i].IsPrimitive)
+				if (ReturnType != PrimitiveTypeWrapper.VOID)
 				{
-					args[i] = JVM.Unbox(args[i]);
+					types[types.Length - 1] = ReturnType.TypeAsSignatureType;
 				}
+				return type.MakeGenericType(types);
 			}
-			return args;
+			return MethodHandleUtil.CreateDelegateType(paramTypes, ReturnType);
 		}
-#endif // !STATIC_COMPILER && !STUB_GENERATOR
 
-#if !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR
 		internal void ResolveMethod()
 		{
+#if !FIRST_PASS
 			// if we've still got the builder object, we need to replace it with the real thing before we can call it
-			if(method is MethodBuilder)
+			MethodBuilder mb = method as MethodBuilder;
+			if (mb != null)
 			{
-				method = method.Module.ResolveMethod(((MethodBuilder)method).GetToken().Token);
+				method = mb.Module.ResolveMethod(mb.GetToken().Token);
 			}
+#endif
 		}
 
 		[HideFromJava]
-		protected virtual object InvokeNonvirtualRemapped(object obj, object[] args)
+		internal virtual object InvokeNonvirtualRemapped(object obj, object[] args)
 		{
 			throw new InvalidOperationException();
 		}
 
-		private struct InvokeArgsProcessor
+		[HideFromJava]
+		protected static object InvokeAndUnwrapException(MethodBase mb, object obj, object[] args)
 		{
-			private object obj;
-			private object[] args;
-
-			internal InvokeArgsProcessor(MethodWrapper mw, MethodBase method, object original_obj, object[] original_args, ikvm. at internal.CallerID callerID)
+#if FIRST_PASS
+			return null;
+#else
+			try
 			{
-				TypeWrapper[] argTypes = mw.GetParameters();
-
-				if(!mw.IsStatic && method.IsStatic && mw.Name != "<init>")
-				{
-					// we've been redirected to a static method, so we have to copy the 'obj' into the args
-					object[] nargs = new object[original_args.Length + 1];
-					nargs[0] = original_obj;
-					original_args.CopyTo(nargs, 1);
-					this.obj = null;
-					this.args = nargs;
-					for(int i = 0; i < argTypes.Length; i++)
-					{
-						if(!argTypes[i].IsUnloadable && argTypes[i].IsGhost)
-						{
-							object v = Activator.CreateInstance(argTypes[i].TypeAsSignatureType);
-							argTypes[i].GhostRefField.SetValue(v, args[i + 1]);
-							args[i + 1] = v;
-						}
-					}
-				}
-				else
-				{
-					this.obj = original_obj;
-					this.args = original_args;
-					for(int i = 0; i < argTypes.Length; i++)
-					{
-						if(!argTypes[i].IsUnloadable && argTypes[i].IsGhost)
-						{
-							if(this.args == original_args)
-							{
-								this.args = (object[])args.Clone();
-							}
-							object v = Activator.CreateInstance(argTypes[i].TypeAsSignatureType);
-							argTypes[i].GhostRefField.SetValue(v, args[i]);
-							this.args[i] = v;
-						}
-					}
-				}
-
-				if(mw.HasCallerID)
-				{
-					object[] nargs = new object[args.Length + 1];
-					Array.Copy(args, nargs, args.Length);
-					nargs[args.Length] = callerID;
-					args = nargs;
-				}
+				return mb.Invoke(obj, args);
 			}
-
-			internal object GetObj()
+			catch (TargetInvocationException x)
 			{
-				return obj;
+				throw ikvm.runtime.Util.mapException(x.InnerException);
 			}
+#endif
+		}
+
+		[HideFromJava]
+		internal virtual object Invoke(object obj, object[] args)
+		{
+			return InvokeAndUnwrapException(method, obj, args);
+		}
 
-			internal object[] GetArgs()
+		[HideFromJava]
+		internal virtual object CreateInstance(object[] args)
+		{
+#if FIRST_PASS
+			return null;
+#else
+			try
 			{
-				return args;
+				return ((ConstructorInfo)method).Invoke(args);
 			}
+			catch (TargetInvocationException x)
+			{
+				throw ikvm.runtime.Util.mapException(x.InnerException);
+			}
+#endif
 		}
-#endif // !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR
+#endif // !STATIC_COMPILER && !STUB_GENERATOR
 
 		internal static OpCode SimpleOpCodeToOpCode(SimpleOpCode opc)
 		{
@@ -1037,7 +889,7 @@ namespace IKVM.Internal
 		{
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal sealed override void EmitCall(CodeEmitter ilgen)
 		{
 			AssertLinked();
@@ -1083,7 +935,7 @@ namespace IKVM.Internal
 		{
 			throw new InvalidOperationException();
 		}
-#endif // STUB_GENERATOR
+#endif // EMITTERS
 	}
 
 	enum SimpleOpCode : byte
@@ -1105,7 +957,7 @@ namespace IKVM.Internal
 			this.callvirt = callvirt;
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal override void EmitCall(CodeEmitter ilgen)
 		{
 			ilgen.Emit(SimpleOpCodeToOpCode(call), GetMethod());
@@ -1115,7 +967,7 @@ namespace IKVM.Internal
 		{
 			ilgen.Emit(SimpleOpCodeToOpCode(callvirt), GetMethod());
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 	}
 
 	sealed class TypicalMethodWrapper : SmartMethodWrapper
@@ -1125,7 +977,7 @@ namespace IKVM.Internal
 		{
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void CallImpl(CodeEmitter ilgen)
 		{
 			ilgen.Emit(OpCodes.Call, GetMethod());
@@ -1140,7 +992,117 @@ namespace IKVM.Internal
 		{
 			ilgen.Emit(OpCodes.Newobj, GetMethod());
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
+	}
+
+	abstract class MirandaMethodWrapper : SmartMethodWrapper
+	{
+		private readonly MethodWrapper ifmethod;
+
+		private MirandaMethodWrapper(TypeWrapper declaringType, MethodWrapper ifmethod, Modifiers modifiers)
+			: base(declaringType, ifmethod.Name, ifmethod.Signature, null, null, null, modifiers, MemberFlags.HideFromReflection | MemberFlags.MirandaMethod)
+		{
+			this.ifmethod = ifmethod;
+		}
+
+		private sealed class AbstractMirandaMethodWrapper : MirandaMethodWrapper
+		{
+			internal AbstractMirandaMethodWrapper(TypeWrapper declaringType, MethodWrapper ifmethod)
+				: base(declaringType, ifmethod, Modifiers.Public | Modifiers.Abstract)
+			{
+			}
+		}
+
+		private sealed class DefaultMirandaMethodWrapper : MirandaMethodWrapper
+		{
+			internal DefaultMirandaMethodWrapper(TypeWrapper declaringType, MethodWrapper ifmethod)
+				: base(declaringType, ifmethod, Modifiers.Public)
+			{
+			}
+		}
+
+		private sealed class ErrorMirandaMethodWrapper : MirandaMethodWrapper
+		{
+			private string error;
+
+			internal ErrorMirandaMethodWrapper(TypeWrapper declaringType, MethodWrapper ifmethod, string error)
+				: base(declaringType, ifmethod, Modifiers.Public)
+			{
+				this.error = error;
+			}
+
+			protected override MirandaMethodWrapper AddConflictError(MethodWrapper mw)
+			{
+				error += " " + mw.DeclaringType.Name + "." + mw.Name;
+				return this;
+			}
+
+			internal override string Error
+			{
+				get { return error; }
+			}
+		}
+
+		internal static MirandaMethodWrapper Create(TypeWrapper declaringType, MethodWrapper ifmethod)
+		{
+			return ifmethod.IsAbstract
+				? (MirandaMethodWrapper)new AbstractMirandaMethodWrapper(declaringType, ifmethod)
+				: (MirandaMethodWrapper)new DefaultMirandaMethodWrapper(declaringType, ifmethod);
+		}
+
+		internal MirandaMethodWrapper Update(MethodWrapper mw)
+		{
+			if (ifmethod == mw)
+			{
+				// an interface can be implemented multiple times
+				return this;
+			}
+			else if (mw.DeclaringType.ImplementsInterface(ifmethod.DeclaringType))
+			{
+				return Create(DeclaringType, mw);
+			}
+			else if (!ifmethod.IsAbstract && !mw.IsAbstract)
+			{
+				return AddConflictError(mw);
+			}
+			else if (!ifmethod.IsAbstract && mw.IsAbstract)
+			{
+				return new ErrorMirandaMethodWrapper(DeclaringType, mw, DeclaringType.Name + "." + Name + Signature);
+			}
+			else
+			{
+				return this;
+			}
+		}
+
+		protected virtual MirandaMethodWrapper AddConflictError(MethodWrapper mw)
+		{
+			return new ErrorMirandaMethodWrapper(DeclaringType, ifmethod, "Conflicting default methods:")
+				.AddConflictError(ifmethod)
+				.AddConflictError(mw);
+		}
+
+		internal MethodWrapper BaseMethod
+		{
+			get { return ifmethod; }
+		}
+
+		internal virtual string Error
+		{
+			get { return null; }
+		}
+
+#if EMITTERS
+		protected override void CallImpl(CodeEmitter ilgen)
+		{
+			ilgen.Emit(OpCodes.Call, GetMethod());
+		}
+
+		protected override void CallvirtImpl(CodeEmitter ilgen)
+		{
+			ilgen.Emit(OpCodes.Callvirt, GetMethod());
+		}
+#endif // EMITTERS
 	}
 
 	sealed class GhostMethodWrapper : SmartMethodWrapper
@@ -1167,13 +1129,22 @@ namespace IKVM.Internal
 			}
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void CallvirtImpl(CodeEmitter ilgen)
 		{
 			ResolveGhostMethod();
 			ilgen.Emit(OpCodes.Call, ghostMethod);
 		}
 #endif
+
+#if !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
+		[HideFromJava]
+		internal override object Invoke(object obj, object[] args)
+		{
+			ResolveGhostMethod();
+			return InvokeAndUnwrapException(ghostMethod, DeclaringType.GhostWrap(obj), args);
+		}
+#endif
 	}
 
 	sealed class AccessStubMethodWrapper : SmartMethodWrapper
@@ -1188,7 +1159,7 @@ namespace IKVM.Internal
 			this.stubNonVirtual = stubNonVirtual;
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void CallImpl(CodeEmitter ilgen)
 		{
 			ilgen.Emit(OpCodes.Call, stubNonVirtual);
@@ -1198,7 +1169,7 @@ namespace IKVM.Internal
 		{
 			ilgen.Emit(OpCodes.Callvirt, stubVirtual);
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 	}
 
 	sealed class AccessStubConstructorMethodWrapper : SmartMethodWrapper
@@ -1211,7 +1182,7 @@ namespace IKVM.Internal
 			this.stub = stub;
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void CallImpl(CodeEmitter ilgen)
 		{
 			ilgen.Emit(OpCodes.Call, stub);
@@ -1221,7 +1192,7 @@ namespace IKVM.Internal
 		{
 			ilgen.Emit(OpCodes.Newobj, stub);
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 	}
 
 	abstract class FieldWrapper : MemberWrapper
@@ -1248,7 +1219,7 @@ namespace IKVM.Internal
 				&& !DeclaringType.IsInterface
 				&& (IsPublic || (IsProtected && !DeclaringType.IsFinal))
 				&& !DeclaringType.GetClassLoader().StrictFinalFieldSemantics
-				&& DeclaringType is DynamicTypeWrapper
+				&& DeclaringType.IsDynamic
 				&& !(this is ConstantFieldWrapper)
 				&& !(this is DynamicPropertyFieldWrapper))
 			{
@@ -1291,48 +1262,24 @@ namespace IKVM.Internal
 		}
 
 #if !STATIC_COMPILER && !STUB_GENERATOR
-		// NOTE used (thru IKVM.Runtime.Util.GetFieldConstantValue) by ikvmstub to find out if the
-		// field is a constant (and if it is, to get its value)
-		internal object GetConstant()
-		{
-			AssertLinked();
-			// only primitives and string can be literals in Java (because the other "primitives" (like uint),
-			// are treated as NonPrimitiveValueTypes)
-			if(field != null && field.IsLiteral && (fieldType.IsPrimitive || fieldType == CoreClasses.java.lang.String.Wrapper))
-			{
-				object val = field.GetRawConstantValue();
-				if(field.FieldType.IsEnum)
-				{
-					val = EnumHelper.GetPrimitiveValue(EnumHelper.GetUnderlyingType(field.FieldType), val);
-				}
-				if(fieldType.IsPrimitive)
-				{
-					return JVM.Box(val);
-				}
-				return val;
-			}
-			return null;
-		}
-
-		internal static FieldWrapper FromField(object field)
+		internal static FieldWrapper FromField(java.lang.reflect.Field field)
 		{
 #if FIRST_PASS
 			return null;
 #else
-			java.lang.reflect.Field f = (java.lang.reflect.Field)field;
-			int slot = f._slot();
+			int slot = field._slot();
 			if (slot == -1)
 			{
 				// it's a Field created by Unsafe.objectFieldOffset(Class,String) so we must resolve based on the name
-				foreach (FieldWrapper fw in TypeWrapper.FromClass(f.getDeclaringClass()).GetFields())
+				foreach (FieldWrapper fw in TypeWrapper.FromClass(field.getDeclaringClass()).GetFields())
 				{
-					if (fw.Name == f.getName())
+					if (fw.Name == field.getName())
 					{
 						return fw;
 					}
 				}
 			}
-			return TypeWrapper.FromClass(f.getDeclaringClass()).GetFields()[slot];
+			return TypeWrapper.FromClass(field.getDeclaringClass()).GetFields()[slot];
 #endif
 		}
 
@@ -1397,7 +1344,7 @@ namespace IKVM.Internal
 			}
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal void EmitGet(CodeEmitter ilgen)
 		{
 			AssertLinked();
@@ -1413,7 +1360,7 @@ namespace IKVM.Internal
 		}
 
 		protected abstract void EmitSetImpl(CodeEmitter ilgen);
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 
 
 #if STATIC_COMPILER
@@ -1422,7 +1369,7 @@ namespace IKVM.Internal
 			get { return fieldType != null; }
 		}
 #endif
-		
+
 		internal void Link()
 		{
 			lock(this)
@@ -1485,7 +1432,7 @@ namespace IKVM.Internal
 			FieldBuilder fb = field as FieldBuilder;
 			if(fb != null)
 			{
-				field = field.Module.ResolveField(fb.GetToken().Token);
+				field = fb.Module.ResolveField(fb.GetToken().Token);
 			}
 		}
 
@@ -1496,11 +1443,16 @@ namespace IKVM.Internal
 #else
 			if (jniAccessor == null)
 			{
-				Interlocked.CompareExchange(ref jniAccessor, IKVM.NativeCode.sun.reflect.ReflectionFactory.NewFieldAccessorJNI(this), null);
+				Interlocked.CompareExchange(ref jniAccessor, Java_sun_reflect_ReflectionFactory.NewFieldAccessorJNI(this), null);
 			}
 			return jniAccessor;
 #endif
 		}
+
+#if !FIRST_PASS
+		internal abstract object GetValue(object obj);
+		internal abstract void SetValue(object obj, object value);
+#endif
 #endif // !STATIC_COMPILER && !STUB_GENERATOR
 	}
 
@@ -1512,7 +1464,7 @@ namespace IKVM.Internal
 			Debug.Assert(!(fieldType == PrimitiveTypeWrapper.DOUBLE || fieldType == PrimitiveTypeWrapper.LONG) || !IsVolatile);
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void EmitGetImpl(CodeEmitter ilgen)
 		{
 			if(!IsStatic && DeclaringType.IsNonPrimitiveValueType)
@@ -1546,7 +1498,19 @@ namespace IKVM.Internal
 				ilgen.EmitMemoryBarrier();
 			}
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
+
+#if !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
+		internal override object GetValue(object obj)
+		{
+			return GetField().GetValue(obj);
+		}
+
+		internal override void SetValue(object obj, object value)
+		{
+			GetField().SetValue(obj, value);
+		}
+#endif // !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
 	}
 
 	sealed class VolatileLongDoubleFieldWrapper : FieldWrapper
@@ -1558,7 +1522,7 @@ namespace IKVM.Internal
 			Debug.Assert(sig == "J" || sig == "D");
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void EmitGetImpl(CodeEmitter ilgen)
 		{
 			FieldInfo fi = GetField();
@@ -1613,7 +1577,37 @@ namespace IKVM.Internal
 				ilgen.Emit(OpCodes.Call, ByteCodeHelperMethods.volatileWriteLong);
 			}
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
+
+#if !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
+#if NO_REF_EMIT
+		internal static readonly object lockObject = new object();
+#endif
+
+		internal override object GetValue(object obj)
+		{
+#if NO_REF_EMIT
+			lock (lockObject)
+			{
+				return GetField().GetValue(obj);
+			}
+#else
+			throw new InvalidOperationException();
+#endif
+		}
+
+		internal override void SetValue(object obj, object value)
+		{
+#if NO_REF_EMIT
+			lock (lockObject)
+			{
+				GetField().SetValue(obj, value);
+			}
+#else
+			throw new InvalidOperationException();
+#endif
+		}
+#endif // !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
 	}
 
 #if !STUB_GENERATOR
@@ -1690,6 +1684,7 @@ namespace IKVM.Internal
 #endif
 		}
 
+#if EMITTERS
 		protected override void EmitGetImpl(CodeEmitter ilgen)
 		{
 			if(getter == null)
@@ -1762,6 +1757,27 @@ namespace IKVM.Internal
 				ilgen.Emit(OpCodes.Pop);
 			}
 		}
+#endif // EMITTERS
+
+#if !STATIC_COMPILER && !FIRST_PASS
+		internal override object GetValue(object obj)
+		{
+			if (getter == null)
+			{
+				throw new java.lang.NoSuchMethodError();
+			}
+			return getter.Invoke(obj, new object[0]);
+		}
+
+		internal override void SetValue(object obj, object value)
+		{
+			if (setter == null)
+			{
+				throw new java.lang.NoSuchMethodError();
+			}
+			setter.Invoke(obj, new object[] { value });
+		}
+#endif
 	}
 #endif // !STUB_GENERATOR
 
@@ -1776,7 +1792,7 @@ namespace IKVM.Internal
 			this.property = property;
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void EmitGetImpl(CodeEmitter ilgen)
 		{
 			MethodInfo getter = property.GetGetMethod(true);
@@ -1821,7 +1837,29 @@ namespace IKVM.Internal
 				ilgen.Emit(OpCodes.Callvirt, setter);
 			}
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
+
+#if !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
+		internal override object GetValue(object obj)
+		{
+			MethodInfo getter = property.GetGetMethod(true);
+			if (getter == null)
+			{
+				throw new java.lang.NoSuchMethodError();
+			}
+			return getter.Invoke(obj, new object[0]);
+		}
+
+		internal override void SetValue(object obj, object value)
+		{
+			MethodInfo setter = property.GetSetMethod(true);
+			if (setter == null)
+			{
+				throw new java.lang.NoSuchMethodError();
+			}
+			setter.Invoke(obj, new object[] { value });
+		}
+#endif
 
 		internal PropertyInfo GetProperty()
 		{
@@ -1842,7 +1880,7 @@ namespace IKVM.Internal
 			this.constant = constant;
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void EmitGetImpl(CodeEmitter ilgen)
 		{
 			// Reading a field should trigger the cctor, but since we're inlining the value
@@ -1903,7 +1941,7 @@ namespace IKVM.Internal
 			// constant value is inlined), so we emulate that behavior by emitting a Pop
 			ilgen.Emit(OpCodes.Pop);
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 
 		internal object GetConstantValue()
 		{
@@ -1914,6 +1952,20 @@ namespace IKVM.Internal
 			}
 			return constant;
 		}
+
+#if !STUB_GENERATOR && !STATIC_COMPILER && !FIRST_PASS
+		internal override object GetValue(object obj)
+		{
+			FieldInfo field = GetField();
+			return FieldTypeWrapper.IsPrimitive || field == null
+				? GetConstantValue()
+				: field.GetValue(null);
+		}
+
+		internal override void SetValue(object obj, object value)
+		{
+		}
+#endif
 	}
 
 	sealed class CompiledAccessStubFieldWrapper : FieldWrapper
@@ -1956,7 +2008,7 @@ namespace IKVM.Internal
 			this.setter = property.GetSetMethod(true);
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		protected override void EmitGetImpl(CodeEmitter ilgen)
 		{
 			ilgen.Emit(OpCodes.Call, getter);
@@ -1966,6 +2018,20 @@ namespace IKVM.Internal
 		{
 			ilgen.Emit(OpCodes.Call, setter);
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
+
+#if !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
+		internal override object GetValue(object obj)
+		{
+			// we can only be invoked on type 2 access stubs (because type 1 access stubs are HideFromReflection), so we know we have a field
+			return GetField().GetValue(obj);
+		}
+
+		internal override void SetValue(object obj, object value)
+		{
+			// we can only be invoked on type 2 access stubs (because type 1 access stubs are HideFromReflection), so we know we have a field
+			GetField().SetValue(obj, value);
+		}
+#endif // !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
 	}
 }
diff --git a/external/ikvm/runtime/TypeWrapper.cs b/external/ikvm/runtime/TypeWrapper.cs
index ade02f8..3ed1d9c 100644
--- a/external/ikvm/runtime/TypeWrapper.cs
+++ b/external/ikvm/runtime/TypeWrapper.cs
@@ -528,19 +528,16 @@ namespace IKVM.Internal
 #if STATIC_COMPILER
 		internal static void SetImplementsAttribute(TypeBuilder typeBuilder, TypeWrapper[] ifaceWrappers)
 		{
-			if(ifaceWrappers != null && ifaceWrappers.Length != 0)
+			string[] interfaces = new string[ifaceWrappers.Length];
+			for(int i = 0; i < interfaces.Length; i++)
 			{
-				string[] interfaces = new string[ifaceWrappers.Length];
-				for(int i = 0; i < interfaces.Length; i++)
-				{
-					interfaces[i] = ifaceWrappers[i].Name;
-				}
-				if(implementsAttribute == null)
-				{
-					implementsAttribute = typeofImplementsAttribute.GetConstructor(new Type[] { JVM.Import(typeof(string[])) });
-				}
-				typeBuilder.SetCustomAttribute(new CustomAttributeBuilder(implementsAttribute, new object[] { interfaces }));
+				interfaces[i] = ifaceWrappers[i].Name;
+			}
+			if(implementsAttribute == null)
+			{
+				implementsAttribute = typeofImplementsAttribute.GetConstructor(new Type[] { JVM.Import(typeof(string[])) });
 			}
+			typeBuilder.SetCustomAttribute(new CustomAttributeBuilder(implementsAttribute, new object[] { interfaces }));
 		}
 #endif
 
@@ -1107,19 +1104,24 @@ namespace IKVM.Internal
 			return type.IsDefined(typeofNoPackagePrefixAttribute, false) || type.Assembly.IsDefined(typeofNoPackagePrefixAttribute, false);
 		}
 
+		internal static bool HasEnclosingMethodAttribute(Type type)
+		{
+			return type.IsDefined(typeofEnclosingMethodAttribute, false);
+		}
+
 		internal static EnclosingMethodAttribute GetEnclosingMethodAttribute(Type type)
 		{
 #if !STATIC_COMPILER && !STUB_GENERATOR
 			object[] attr = type.GetCustomAttributes(typeof(EnclosingMethodAttribute), false);
 			if (attr.Length == 1)
 			{
-				return (EnclosingMethodAttribute)attr[0];
+				return ((EnclosingMethodAttribute)attr[0]).SetClassName(type);
 			}
 			return null;
 #else
 			foreach (CustomAttributeData cad in CustomAttributeData.__GetCustomAttributes(type, typeofEnclosingMethodAttribute, false))
 			{
-				return new EnclosingMethodAttribute((string)cad.ConstructorArguments[0].Value, (string)cad.ConstructorArguments[1].Value, (string)cad.ConstructorArguments[2].Value);
+				return new EnclosingMethodAttribute((string)cad.ConstructorArguments[0].Value, (string)cad.ConstructorArguments[1].Value, (string)cad.ConstructorArguments[2].Value).SetClassName(type);
 			}
 			return null;
 #endif
@@ -1282,6 +1284,7 @@ namespace IKVM.Internal
 	{
 		// note that MangleNestedTypeName() assumes that there are less than 16 special characters
 		private const string specialCharactersString = "\\+,[]*&\u0000";
+		internal const string ProxiesContainer = "__<Proxies>";
 
 		internal static string ReplaceIllegalCharacters(string name)
 		{
@@ -1374,10 +1377,46 @@ namespace IKVM.Internal
 			}
 			return sb.ToString();
 		}
+
+		internal static string GetProxyNestedName(TypeWrapper[] interfaces)
+		{
+			System.Text.StringBuilder sb = new System.Text.StringBuilder();
+			foreach (TypeWrapper tw in interfaces)
+			{
+				sb.Append(tw.Name.Length).Append('|').Append(tw.Name);
+			}
+			return TypeNameUtil.MangleNestedTypeName(sb.ToString());
+		}
+
+		internal static string GetProxyName(TypeWrapper[] interfaces)
+		{
+			return ProxiesContainer + "+" + GetProxyNestedName(interfaces);
+		}
+	}
+
+	static class ArrayUtil
+	{
+		internal static T[] Concat<T, X>(X obj, T[] arr)
+			where X : T
+		{
+			T[] narr = new T[arr.Length + 1];
+			narr[0] = obj;
+			Array.Copy(arr, 0, narr, 1, arr.Length);
+			return narr;
+		}
+
+		internal static T[] Concat<T, X>(T[] arr, X obj)
+			where X : T
+		{
+			Array.Resize(ref arr, arr.Length + 1);
+			arr[arr.Length - 1] = obj;
+			return arr;
+		}
 	}
 
 	abstract class Annotation
 	{
+#if !STUB_GENERATOR
 		// NOTE this method returns null if the type could not be found
 		// or if the type is not a Custom Attribute and we're not in the static compiler
 		internal static Annotation Load(ClassLoaderWrapper loader, object[] def)
@@ -1394,21 +1433,24 @@ namespace IKVM.Internal
 				return null;
 			}
 #endif
-			try
+			if (ClassFile.IsValidFieldSig(annotationClass))
 			{
-				TypeWrapper annot = loader.RetTypeWrapperFromSig(annotationClass.Replace('/', '.'));
-				return annot.Annotation;
+				try
+				{
+					return loader.RetTypeWrapperFromSig(annotationClass.Replace('/', '.')).Annotation;
+				}
+				catch (RetargetableJavaException)
+				{
+				}
 			}
-			catch (RetargetableJavaException)
-			{
-				Tracer.Warning(Tracer.Compiler, "Unable to load annotation class {0}", annotationClass);
+			Tracer.Warning(Tracer.Compiler, "Unable to load annotation class {0}", annotationClass);
 #if STATIC_COMPILER
-				return new CompiledTypeWrapper.CompiledAnnotation(StaticCompiler.GetRuntimeType("IKVM.Attributes.DynamicAnnotationAttribute"));
+			return new CompiledTypeWrapper.CompiledAnnotation(StaticCompiler.GetRuntimeType("IKVM.Attributes.DynamicAnnotationAttribute"));
 #else
-				return null;
+			return null;
 #endif
-			}
 		}
+#endif
 
 		private static object LookupEnumValue(Type enumType, string value)
 		{
@@ -1553,6 +1595,21 @@ namespace IKVM.Internal
 			return false;
 		}
 
+		internal static bool HasObsoleteAttribute(object[] annotations)
+		{
+			if (annotations != null)
+			{
+				foreach (object[] def in annotations)
+				{
+					if (def[1].Equals("Lcli/System/ObsoleteAttribute$Annotation;"))
+					{
+						return true;
+					}
+				}
+			}
+			return false;
+		}
+
 		protected static object QualifyClassNames(ClassLoaderWrapper loader, object annotation)
 		{
 			bool copy = false;
@@ -1632,6 +1689,10 @@ namespace IKVM.Internal
 				}
 				return val;
 			}
+			else if(val[0].Equals(AnnotationDefaultAttribute.TAG_ERROR))
+			{
+				return val;
+			}
 			else
 			{
 				throw new InvalidOperationException();
@@ -1671,6 +1732,7 @@ namespace IKVM.Internal
 		internal const string NonVirtual = "<nonvirtual>";
 		internal const string Bridge = "<bridge>";
 		internal const string Incomplete = "<incomplete>";
+		internal const string DefaultMethod = "<default>";
 	}
 
 	internal abstract class TypeWrapper
@@ -1699,7 +1761,7 @@ namespace IKVM.Internal
 			this.name = name == null ? null : String.Intern(name);
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal void EmitClassLiteral(CodeEmitter ilgen)
 		{
 			Debug.Assert(!this.IsPrimitive);
@@ -1732,7 +1794,7 @@ namespace IKVM.Internal
 				ilgen.Emit(OpCodes.Ldsfld, RuntimeHelperTypes.GetClassLiteralField(type));
 			}
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 
 		private Type GetClassLiteralType()
 		{
@@ -1842,7 +1904,7 @@ namespace IKVM.Internal
 				if (classObject == null)
 				{
 					// DynamicTypeWrapper should haved already had SetClassObject explicitly
-					Debug.Assert(!(this is DynamicTypeWrapper));
+					Debug.Assert(!IsDynamic);
 #if !FIRST_PASS
 					java.lang.Class clazz;
 					// note that this has to be the same check as in EmitClassLiteral
@@ -2351,7 +2413,7 @@ namespace IKVM.Internal
 					if(methods == null)
 					{
 #if STATIC_COMPILER
-						if(!CheckMissingBaseTypes(TypeAsBaseType))
+						if(IsUnloadable || !CheckMissingBaseTypes(TypeAsBaseType))
 						{
 							return methods = MethodWrapper.EmptyArray;
 						}
@@ -2372,7 +2434,7 @@ namespace IKVM.Internal
 					if(fields == null)
 					{
 #if STATIC_COMPILER
-						if (!CheckMissingBaseTypes(TypeAsBaseType))
+						if(IsUnloadable || !CheckMissingBaseTypes(TypeAsBaseType))
 						{
 							return fields = FieldWrapper.EmptyArray;
 						}
@@ -2491,15 +2553,7 @@ namespace IKVM.Internal
 					return ccl.IsEquivalentTo(wrapper.GetClassLoader());
 				}
 #endif
-				if (GetClassLoader() != wrapper.GetClassLoader())
-				{
-					return false;
-				}
-#if STATIC_COMPILER || STUB_GENERATOR
-				return true;
-#else
-				return InternalsVisibleTo(wrapper);
-#endif
+				return GetClassLoader() == wrapper.GetClassLoader();
 			}
 			else
 			{
@@ -2564,6 +2618,14 @@ namespace IKVM.Internal
 			}
 		}
 
+		internal Type TypeAsPublicSignatureType
+		{
+			get
+			{
+				return (IsPublic ? this : GetPublicBaseTypeWrapper()).TypeAsSignatureType;
+			}
+		}
+
 		internal virtual Type TypeAsBaseType
 		{
 			get
@@ -2835,7 +2897,7 @@ namespace IKVM.Internal
 		}
 #endif
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal void EmitUnbox(CodeEmitter ilgen)
 		{
 			Debug.Assert(this.IsNonPrimitiveValueType);
@@ -2970,7 +3032,7 @@ namespace IKVM.Internal
 				ilgen.Emit_instanceof(TypeAsTBD);
 			}
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 
 		// NOTE don't call this method, call MethodWrapper.Link instead
 		internal virtual MethodBase LinkMethod(MethodWrapper mw)
@@ -2984,11 +3046,11 @@ namespace IKVM.Internal
 			return fw.GetField();
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal virtual void EmitRunClassConstructor(CodeEmitter ilgen)
 		{
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 
 		internal virtual string GetGenericSignature()
 		{
@@ -3072,9 +3134,40 @@ namespace IKVM.Internal
 			}
 		}
 
+		private static Type[] GetInterfaces(Type type)
+		{
+#if STATIC_COMPILER || STUB_GENERATOR
+			List<Type> list = new List<Type>();
+			for (; type != null && !type.__IsMissing; type = type.BaseType)
+			{
+				AddInterfaces(list, type);
+			}
+			return list.ToArray();
+#else
+			return type.GetInterfaces();
+#endif
+		}
+
+#if STATIC_COMPILER || STUB_GENERATOR
+		private static void AddInterfaces(List<Type> list, Type type)
+		{
+			foreach (Type iface in type.__GetDeclaredInterfaces())
+			{
+				if (!list.Contains(iface))
+				{
+					list.Add(iface);
+					if (!iface.__IsMissing)
+					{
+						AddInterfaces(list, iface);
+					}
+				}
+			}
+		}
+#endif
+
 		protected static TypeWrapper[] GetImplementedInterfacesAsTypeWrappers(Type type)
 		{
-			Type[] interfaceTypes = type.GetInterfaces();
+			Type[] interfaceTypes = GetInterfaces(type);
 			TypeWrapper[] interfaces = new TypeWrapper[interfaceTypes.Length];
 			for (int i = 0; i < interfaceTypes.Length; i++)
 			{
@@ -3099,8 +3192,7 @@ namespace IKVM.Internal
 					interfaces[i] = tw;
 					if (Array.IndexOf(interfaces, twRemapped) == -1)
 					{
-						Array.Resize(ref interfaces, interfaces.Length + 1);
-						interfaces[interfaces.Length - 1] = twRemapped;
+						interfaces = ArrayUtil.Concat(interfaces, twRemapped);
 					}
 				}
 			}
@@ -3127,7 +3219,6 @@ namespace IKVM.Internal
 		// return the constructor used for automagic .NET serialization
 		internal virtual MethodBase GetSerializationConstructor()
 		{
-			Debug.Assert(!(this is DynamicTypeWrapper));
 			return this.TypeAsBaseType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] {
 						JVM.Import(typeof(System.Runtime.Serialization.SerializationInfo)), JVM.Import(typeof(System.Runtime.Serialization.StreamingContext)) }, null);
 		}
@@ -3137,6 +3228,27 @@ namespace IKVM.Internal
 			return BaseTypeWrapper.GetSerializationConstructor();
 		}
 #endif
+
+#if !STATIC_COMPILER && !STUB_GENERATOR
+		internal virtual object GhostWrap(object obj)
+		{
+			return obj;
+		}
+
+		internal virtual object GhostUnwrap(object obj)
+		{
+			return obj;
+		}
+#endif
+
+		internal bool IsDynamic
+		{
+#if STUB_GENERATOR
+			get { return false; }
+#else
+			get { return this is DynamicTypeWrapper; }
+#endif
+		}
 	}
 
 	sealed class UnloadableTypeWrapper : TypeWrapper
@@ -3252,7 +3364,7 @@ namespace IKVM.Internal
 			this.customModifier = type;
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal Type GetCustomModifier(TypeWrapperFactory context)
 		{
 			// we don't need to lock, because we're only supposed to be called while holding the finish lock
@@ -3268,7 +3380,7 @@ namespace IKVM.Internal
 		{
 			throw new InvalidOperationException("EmitInstanceOf called on UnloadableTypeWrapper: " + Name);
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 	}
 
 	sealed class PrimitiveTypeWrapper : TypeWrapper
@@ -3564,6 +3676,18 @@ namespace IKVM.Internal
 					return true;
 				}
 			}
+
+#if !STATIC_COMPILER && !STUB_GENERATOR && !FIRST_PASS
+			internal override object GhostWrap(object obj)
+			{
+				return type.GetMethod("Cast").Invoke(null, new object[] { obj });
+			}
+
+			internal override object GhostUnwrap(object obj)
+			{
+				return type.GetMethod("ToObject").Invoke(obj, new object[0]);
+			}
+#endif
 		}
 
 		internal static string GetName(Type type)
@@ -3581,10 +3705,10 @@ namespace IKVM.Internal
 				{
 					return name;
 				}
-				if(type.DeclaringType != null)
-				{
-					return GetName(type.DeclaringType) + "$" + TypeNameUtil.Unescape(type.Name);
-				}
+			}
+			if(type.DeclaringType != null)
+			{
+				return GetName(type.DeclaringType) + "$" + TypeNameUtil.Unescape(type.Name);
 			}
 			return TypeNameUtil.Unescape(type.FullName);
 		}
@@ -3727,6 +3851,10 @@ namespace IKVM.Internal
 			ImplementsAttribute attr = AttributeHelper.GetImplements(type);
 			if (attr == null)
 			{
+				if (BaseTypeWrapper == CoreClasses.java.lang.Object.Wrapper)
+				{
+					return GetImplementedInterfacesAsTypeWrappers(type);
+				}
 				return TypeWrapper.EmptyArray;
 			}
 			string[] interfaceNames = attr.Interfaces;
@@ -3764,25 +3892,48 @@ namespace IKVM.Internal
 			return interfaceWrappers;
 		}
 
+		private static bool IsNestedTypeAnonymousOrLocalClass(Type type)
+		{
+			switch (type.Attributes & (TypeAttributes.SpecialName | TypeAttributes.VisibilityMask))
+			{
+				case TypeAttributes.SpecialName | TypeAttributes.NestedPublic:
+				case TypeAttributes.SpecialName | TypeAttributes.NestedAssembly:
+					return AttributeHelper.HasEnclosingMethodAttribute(type);
+				default:
+					return false;
+			}
+		}
+
+		private static bool IsAnnotationAttribute(Type type)
+		{
+			return type.Name.EndsWith("Attribute", StringComparison.Ordinal)
+				&& type.IsClass
+				&& type.BaseType.FullName == "ikvm.internal.AnnotationAttributeBase";
+		}
+
 		internal override TypeWrapper[] InnerClasses
 		{
 			get
 			{
-				Type[] nestedTypes = type.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
 				List<TypeWrapper> wrappers = new List<TypeWrapper>();
-				for(int i = 0; i < nestedTypes.Length; i++)
+				foreach(Type nested in type.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly))
 				{
-					if(nestedTypes[i].Name.EndsWith("Attribute", StringComparison.Ordinal)
-						&& nestedTypes[i].IsClass
-						&& nestedTypes[i].BaseType.FullName == "ikvm.internal.AnnotationAttributeBase")
+					if(IsAnnotationAttribute(nested))
 					{
 						// HACK it's the custom attribute we generated for a corresponding annotation, so we shouldn't surface it as an inner classes
 						// (we can't put a HideFromJavaAttribute on it, because we do want the class to be visible as a $Proxy)
-						continue;
 					}
-					if(!AttributeHelper.IsHideFromJava(nestedTypes[i]))
+					else if(IsNestedTypeAnonymousOrLocalClass(nested))
 					{
-						wrappers.Add(ClassLoaderWrapper.GetWrapperFromType(nestedTypes[i]));
+						// anonymous and local classes are not reported as inner classes
+					}
+					else if(AttributeHelper.IsHideFromJava(nested))
+					{
+						// ignore
+					}
+					else
+					{
+						wrappers.Add(ClassLoaderWrapper.GetWrapperFromType(nested));
 					}
 				}
 				foreach(string s in AttributeHelper.GetNonNestedInnerClasses(type))
@@ -3797,6 +3948,10 @@ namespace IKVM.Internal
 		{
 			get
 			{
+				if(IsNestedTypeAnonymousOrLocalClass(type))
+				{
+					return null;
+				}
 				Type declaringType = type.DeclaringType;
 				if(declaringType != null)
 				{
@@ -3811,6 +3966,47 @@ namespace IKVM.Internal
 			}
 		}
 
+		// returns true iff name is of the form "...$<n>"
+		private static bool IsAnonymousClassName(string name)
+		{
+			int index = name.LastIndexOf('$') + 1;
+			if (index > 1 && index < name.Length)
+			{
+				while (index < name.Length)
+				{
+					if ("0123456789".IndexOf(name[index++]) == -1)
+					{
+						return false;
+					}
+				}
+				return true;
+			}
+			return false;
+		}
+
+		// This method uses some heuristics to predict the reflective modifiers and if the prediction matches
+		// we can avoid storing the InnerClassesAttribute to record the modifiers.
+		// The heuristics are based on javac from Java 7.
+		internal static Modifiers PredictReflectiveModifiers(TypeWrapper tw)
+		{
+			Modifiers modifiers = Modifiers.Static | (tw.Modifiers & (Modifiers.Public | Modifiers.Abstract | Modifiers.Interface));
+			// javac marks anonymous classes as final, but the InnerClasses attribute access_flags does not have the ACC_FINAL flag set
+			if (tw.IsFinal && !IsAnonymousClassName(tw.Name))
+			{
+				modifiers |= Modifiers.Final;
+			}
+			// javac uses the this$0 field to store the outer instance reference for non-static inner classes
+			foreach (FieldWrapper fw in tw.GetFields())
+			{
+				if (fw.Name == "this$0")
+				{
+					modifiers &= ~Modifiers.Static;
+					break;
+				}
+			}
+			return modifiers;
+		}
+
 		internal override Modifiers ReflectiveModifiers
 		{
 			get
@@ -3825,6 +4021,10 @@ namespace IKVM.Internal
 						// (minus ACC_SUPER)
 						mods = attr.Modifiers & (Modifiers)0x761F;
 					}
+					else if (type.DeclaringType != null)
+					{
+						mods = PredictReflectiveModifiers(this);
+					}
 					else
 					{
 						// the mask comes from JVM_RECOGNIZED_CLASS_MODIFIERS in src/hotspot/share/vm/prims/jvm.h
@@ -4045,14 +4245,14 @@ namespace IKVM.Internal
 				invoke = (MethodInfo)mw.GetMethod();
 			}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 			internal override void EmitNewobj(CodeEmitter ilgen)
 			{
 				ilgen.Emit(OpCodes.Dup);
 				ilgen.Emit(OpCodes.Ldvirtftn, invoke);
 				ilgen.Emit(OpCodes.Newobj, constructor);
 			}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 		}
 
 		protected override void LazyPublishMethods()
@@ -4089,7 +4289,7 @@ namespace IKVM.Internal
 			}
 			else
 			{
-				if(method.IsSpecialName && method.Name.StartsWith("__<"))
+				if(method.IsSpecialName && (method.Name.StartsWith("__<", StringComparison.Ordinal) || method.Name.StartsWith(NamePrefix.DefaultMethod, StringComparison.Ordinal)))
 				{
 					// skip
 				}
@@ -4301,7 +4501,7 @@ namespace IKVM.Internal
 #endif
 			}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 			protected override void CallImpl(CodeEmitter ilgen)
 			{
 				MethodBase mb = GetMethod();
@@ -4354,33 +4554,51 @@ namespace IKVM.Internal
 					ilgen.Emit(OpCodes.Newobj, mb);
 				}
 			}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 
 #if !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR
 			[HideFromJava]
-			protected override object InvokeNonvirtualRemapped(object obj, object[] args)
+			internal override object Invoke(object obj, object[] args)
+			{
+				MethodBase mb = mbHelper != null ? mbHelper : GetMethod();
+				if (mb.IsStatic && !IsStatic)
+				{
+					args = ArrayUtil.Concat(obj, args);
+					obj = null;
+				}
+				return InvokeAndUnwrapException(mb, obj, args);
+			}
+
+			[HideFromJava]
+			internal override object CreateInstance(object[] args)
+			{
+				MethodBase mb = mbHelper != null ? mbHelper : GetMethod();
+				if (mb.IsStatic)
+				{
+					return InvokeAndUnwrapException(mb, null, args);
+				}
+				return base.CreateInstance(args);
+			}
+
+			[HideFromJava]
+			internal override object InvokeNonvirtualRemapped(object obj, object[] args)
 			{
-				Type[] p1 = GetParametersForDefineMethod();
-				Type[] argTypes = new Type[p1.Length + 1];
-				p1.CopyTo(argTypes, 1);
-				argTypes[0] = this.DeclaringType.TypeAsSignatureType;
 				MethodInfo mi = mbNonvirtualHelper;
 				if (mi == null)
 				{
 					mi = mbHelper;
 				}
-				object[] args1 = new object[args.Length + 1];
-				args1[0] = obj;
-				args.CopyTo(args1, 1);
-				return mi.Invoke(null, args1);
+				return mi.Invoke(null, ArrayUtil.Concat(obj, args));
 			}
+#endif // !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR
 
+#if EMITTERS
 			internal override void EmitCallvirtReflect(CodeEmitter ilgen)
 			{
 				MethodBase mb = mbHelper != null ? mbHelper : GetMethod();
 				ilgen.Emit(mb.IsStatic ? OpCodes.Call : OpCodes.Callvirt, mb);
 			}
-#endif // !STATIC_COMPILER
+#endif // EMITTERS
 
 			internal string GetGenericSignature()
 			{
@@ -4507,7 +4725,7 @@ namespace IKVM.Internal
 			}
 		}
 
-#if !STUB_GENERATOR
+#if EMITTERS
 		internal override void EmitRunClassConstructor(CodeEmitter ilgen)
 		{
 			if(HasStaticInitializer)
@@ -4515,7 +4733,7 @@ namespace IKVM.Internal
 				ilgen.Emit(OpCodes.Call, clinitMethod);
 			}
 		}
-#endif // !STUB_GENERATOR
+#endif // EMITTERS
 
 		internal override string GetGenericSignature()
 		{
@@ -4631,52 +4849,46 @@ namespace IKVM.Internal
 
 		internal sealed class CompiledAnnotation : Annotation
 		{
-			private readonly Type type;
+			private readonly ConstructorInfo constructor;
 
 			internal CompiledAnnotation(Type type)
 			{
-				this.type = type;
+				constructor = type.GetConstructor(new Type[] { JVM.Import(typeof(object[])) });
 			}
 
-			private CustomAttributeBuilder MakeCustomAttributeBuilder(object annotation)
+			private CustomAttributeBuilder MakeCustomAttributeBuilder(ClassLoaderWrapper loader, object annotation)
 			{
-				return new CustomAttributeBuilder(type.GetConstructor(new Type[] { JVM.Import(typeof(object[])) }), new object[] { annotation });
+				return new CustomAttributeBuilder(constructor, new object[] { QualifyClassNames(loader, annotation) });
 			}
 
 			internal override void Apply(ClassLoaderWrapper loader, TypeBuilder tb, object annotation)
 			{
-				annotation = QualifyClassNames(loader, annotation);
-				tb.SetCustomAttribute(MakeCustomAttributeBuilder(annotation));
+				tb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 			}
 
 			internal override void Apply(ClassLoaderWrapper loader, MethodBuilder mb, object annotation)
 			{
-				annotation = QualifyClassNames(loader, annotation);
-				mb.SetCustomAttribute(MakeCustomAttributeBuilder(annotation));
+				mb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 			}
 
 			internal override void Apply(ClassLoaderWrapper loader, FieldBuilder fb, object annotation)
 			{
-				annotation = QualifyClassNames(loader, annotation);
-				fb.SetCustomAttribute(MakeCustomAttributeBuilder(annotation));
+				fb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 			}
 
 			internal override void Apply(ClassLoaderWrapper loader, ParameterBuilder pb, object annotation)
 			{
-				annotation = QualifyClassNames(loader, annotation);
-				pb.SetCustomAttribute(MakeCustomAttributeBuilder(annotation));
+				pb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 			}
 
 			internal override void Apply(ClassLoaderWrapper loader, AssemblyBuilder ab, object annotation)
 			{
-				annotation = QualifyClassNames(loader, annotation);
-				ab.SetCustomAttribute(MakeCustomAttributeBuilder(annotation));
+				ab.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 			}
 
 			internal override void Apply(ClassLoaderWrapper loader, PropertyBuilder pb, object annotation)
 			{
-				annotation = QualifyClassNames(loader, annotation);
-				pb.SetCustomAttribute(MakeCustomAttributeBuilder(annotation));
+				pb.SetCustomAttribute(MakeCustomAttributeBuilder(loader, annotation));
 			}
 
 			internal override bool IsCustomAttribute
@@ -4718,6 +4930,14 @@ namespace IKVM.Internal
 			{
 				return ((SourceFileAttribute)attr[0]).SourceFile;
 			}
+			if(DeclaringTypeWrapper != null)
+			{
+				return DeclaringTypeWrapper.GetSourceFileName();
+			}
+			if(IsNestedTypeAnonymousOrLocalClass(type))
+			{
+				return ClassLoaderWrapper.GetWrapperFromType(type.DeclaringType).GetSourceFileName();
+			}
 			if(type.Module.IsDefined(typeof(SourceFileAttribute), false))
 			{
 				return type.Name + ".java";
diff --git a/external/ikvm/runtime/attributes.cs b/external/ikvm/runtime/attributes.cs
index 2ff96cf..1605837 100644
--- a/external/ikvm/runtime/attributes.cs
+++ b/external/ikvm/runtime/attributes.cs
@@ -688,6 +688,15 @@ namespace IKVM.Attributes
 			this.methodSig = methodSig;
 		}
 
+		internal EnclosingMethodAttribute SetClassName(Type type)
+		{
+			if (className == null)
+			{
+				className = IKVM.Internal.ClassLoaderWrapper.GetWrapperFromType(type.DeclaringType).Name;
+			}
+			return this;
+		}
+
 		public string ClassName
 		{
 			get
diff --git a/external/ikvm/runtime/common.cs b/external/ikvm/runtime/common.cs
index 75f39be..27698b6 100644
--- a/external/ikvm/runtime/common.cs
+++ b/external/ikvm/runtime/common.cs
@@ -49,7 +49,7 @@ namespace IKVM.NativeCode.gnu.java.net.protocol.ikvmres
 			MemoryStream mem = new MemoryStream();
 #if !FIRST_PASS
 			bool includeNonPublicInterfaces = !"true".Equals(global::java.lang.Props.props.getProperty("ikvm.stubgen.skipNonPublicInterfaces"), StringComparison.OrdinalIgnoreCase);
-			IKVM.StubGen.StubGenerator.WriteClass(mem, TypeWrapper.FromClass(c), includeNonPublicInterfaces, false, false);
+			IKVM.StubGen.StubGenerator.WriteClass(mem, TypeWrapper.FromClass(c), includeNonPublicInterfaces, false, false, false);
 #endif
 			return mem.ToArray();
 		}
@@ -117,11 +117,7 @@ namespace IKVM.NativeCode.java.lang
 
 		public static string getBootClassPath()
 		{
-#if FIRST_PASS
-			return null;
-#else
 			return VirtualFileSystem.GetAssemblyClassesPath(JVM.CoreAssembly);
-#endif
 		}
 	}
 }
@@ -146,60 +142,24 @@ namespace IKVM.NativeCode.ikvm. at internal
 		}
 	}
 
-	namespace stubgen
+	static class AnnotationAttributeBase
 	{
-		static class StubGenerator
+		public static object newAnnotationInvocationHandler(jlClass type, object memberValues)
 		{
-			public static int getRealModifiers(jlClass c)
-			{
-				return (int)TypeWrapper.FromClass(c).Modifiers;
-			}
-
-			public static string getAssemblyName(jlClass c)
-			{
-				TypeWrapper wrapper = TypeWrapper.FromClass(c);
-				ClassLoaderWrapper loader = wrapper.GetClassLoader();
-				IKVM.Internal.AssemblyClassLoader acl = loader as IKVM.Internal.AssemblyClassLoader;
-				if(acl != null)
-				{
-					return acl.GetAssembly(wrapper).FullName;
-				}
-				else
-				{
-					return ((GenericClassLoaderWrapper)loader).GetName();
-				}
-			}
-
-			public static object getFieldConstantValue(object field)
-			{
-				return FieldWrapper.FromField(field).GetConstant();
-			}
-
-			public static bool isFieldDeprecated(object field)
-			{
-				FieldWrapper fieldWrapper = FieldWrapper.FromField(field);
-				FieldInfo fi = fieldWrapper.GetField();
-				if(fi != null)
-				{
-					return fi.IsDefined(typeof(ObsoleteAttribute), false);
-				}
-				return false;
-			}
-
-			public static bool isMethodDeprecated(object method)
-			{
-				MethodWrapper mw = MethodWrapper.FromMethodOrConstructor(method);
-				MethodBase mb = mw.GetMethod();
-				return mb != null && mb.IsDefined(typeof(ObsoleteAttribute), false);
-			}
+#if FIRST_PASS
+			return null;
+#else
+			return new global::sun.reflect.annotation.AnnotationInvocationHandler(type, (global::java.util.Map)memberValues);
+#endif
+		}
 
-			public static bool isClassDeprecated(jlClass clazz)
-			{
-				Type type = TypeWrapper.FromClass(clazz).TypeAsTBD;
-				// we need to check type for null, because ReflectionOnly
-				// generated delegate inner interfaces don't really exist
-				return type != null && type.IsDefined(typeof(ObsoleteAttribute), false);
-			}
+		public static object newAnnotationTypeMismatchExceptionProxy(string msg)
+		{
+#if FIRST_PASS
+			return null;
+#else
+			return new global::sun.reflect.annotation.AnnotationTypeMismatchExceptionProxy(msg);
+#endif
 		}
 	}
 }
@@ -228,7 +188,9 @@ namespace IKVM.NativeCode.ikvm.runtime
 				TypeWrapper tw = wrapper.LoadClass(name);
 				if (tw == null)
 				{
-					throw new ClassNotFoundException(name);
+					Tracer.Info(Tracer.ClassLoading, "Failed to load class \"{0}\" from {1}", name, _this);
+					global::java.lang.Throwable.suppressFillInStackTrace = true;
+					throw new global::java.lang.ClassNotFoundException(name);
 				}
 				Tracer.Info(Tracer.ClassLoading, "Loaded class \"{0}\" from {1}", name, _this);
 				return tw.ClassObject;
diff --git a/external/ikvm/runtime/intrinsics.cs b/external/ikvm/runtime/intrinsics.cs
index 7099a7a..402969d 100644
--- a/external/ikvm/runtime/intrinsics.cs
+++ b/external/ikvm/runtime/intrinsics.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2008-2012 Jeroen Frijters
+  Copyright (C) 2008-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -192,10 +192,9 @@ namespace IKVM.Internal
 #if STATIC_COMPILER
 			// String_toCharArray relies on globals, which aren't usable in dynamic mode
 			intrinsics.Add(new IntrinsicKey("java.lang.String", "toCharArray", "()[C"), String_toCharArray);
-#endif
-			intrinsics.Add(new IntrinsicKey("sun.reflect.Reflection", "getCallerClass", "(I)Ljava.lang.Class;"), Reflection_getCallerClass);
-			intrinsics.Add(new IntrinsicKey("java.lang.ClassLoader", "getCallerClassLoader", "()Ljava.lang.ClassLoader;"), ClassLoader_getCallerClassLoader);
+			intrinsics.Add(new IntrinsicKey("sun.reflect.Reflection", "getCallerClass", "()Ljava.lang.Class;"), Reflection_getCallerClass);
 			intrinsics.Add(new IntrinsicKey("ikvm.internal.CallerID", "getCallerID", "()Likvm.internal.CallerID;"), CallerID_getCallerID);
+#endif
 			intrinsics.Add(new IntrinsicKey("ikvm.runtime.Util", "getInstanceTypeFromClass", "(Ljava.lang.Class;)Lcli.System.Type;"), Util_getInstanceTypeFromClass);
 #if STATIC_COMPILER
 			// this only applies to the core class library, so makes no sense in dynamic mode
@@ -512,44 +511,35 @@ namespace IKVM.Internal
 			ilgen.Emit(OpCodes.Ldtoken, fb);
 			ilgen.Emit(OpCodes.Call, JVM.Import(typeof(System.Runtime.CompilerServices.RuntimeHelpers)).GetMethod("InitializeArray", new Type[] { Types.Array, JVM.Import(typeof(RuntimeFieldHandle)) }));
 		}
-#endif
 
 		private static bool Reflection_getCallerClass(EmitIntrinsicContext eic)
 		{
-			if (eic.Caller.HasCallerID
-				&& eic.MatchRange(-1, 2)
-				&& eic.Match(-1, NormalizedByteCode.__iconst, 2))
+			if (eic.Caller.HasCallerID)
 			{
-				eic.Emitter.Emit(OpCodes.Pop);
 				int arg = eic.Caller.GetParametersForDefineMethod().Length - 1;
 				if (!eic.Caller.IsStatic)
 				{
 					arg++;
 				}
 				eic.Emitter.EmitLdarg(arg);
-				MethodWrapper mw = CoreClasses.ikvm. at internal.CallerID.Wrapper.GetMethodWrapper("getCallerClass", "()Ljava.lang.Class;", false);
-				mw.Link();
-				mw.EmitCallvirt(eic.Emitter);
-				return true;
-			}
-			return false;
-		}
-
-		private static bool ClassLoader_getCallerClassLoader(EmitIntrinsicContext eic)
-		{
-			if (eic.Caller.HasCallerID)
-			{
-				int arg = eic.Caller.GetParametersForDefineMethod().Length - 1;
-				if (!eic.Caller.IsStatic)
+				MethodWrapper mw;
+				if (MatchInvokeStatic(eic, 1, "java.lang.ClassLoader", "getClassLoader", "(Ljava.lang.Class;)Ljava.lang.ClassLoader;"))
 				{
-					arg++;
+					eic.PatchOpCode(1, NormalizedByteCode.__nop);
+					mw = CoreClasses.ikvm. at internal.CallerID.Wrapper.GetMethodWrapper("getCallerClassLoader", "()Ljava.lang.ClassLoader;", false);
+				}
+				else
+				{
+					mw = CoreClasses.ikvm. at internal.CallerID.Wrapper.GetMethodWrapper("getCallerClass", "()Ljava.lang.Class;", false);
 				}
-				eic.Emitter.EmitLdarg(arg);
-				MethodWrapper mw = CoreClasses.ikvm. at internal.CallerID.Wrapper.GetMethodWrapper("getCallerClassLoader", "()Ljava.lang.ClassLoader;", false);
 				mw.Link();
 				mw.EmitCallvirt(eic.Emitter);
 				return true;
 			}
+			else if (!DynamicTypeWrapper.RequiresDynamicReflectionCallerClass(eic.ClassFile.Name, eic.Caller.Name, eic.Caller.Signature))
+			{
+				StaticCompiler.IssueMessage(Message.ReflectionCallerClassRequiresCallerID, eic.ClassFile.Name, eic.Caller.Name, eic.Caller.Signature);
+			}
 			return false;
 		}
 
@@ -567,14 +557,10 @@ namespace IKVM.Internal
 			}
 			else
 			{
-#if STATIC_COMPILER
 				throw new FatalCompilerErrorException(Message.CallerIDRequiresHasCallerIDAnnotation);
-#else
-				JVM.CriticalFailure("CallerID.getCallerID() requires a HasCallerID annotation", null);
-				return false;
-#endif
 			}
 		}
+#endif
 
 		private static bool Util_getInstanceTypeFromClass(EmitIntrinsicContext eic)
 		{
@@ -976,7 +962,17 @@ namespace IKVM.Internal
 
 		private static bool MatchInvokeVirtual(EmitIntrinsicContext eic, ref Instruction instr, string clazz, string name, string sig)
 		{
-			if (instr.NormalizedOpCode == NormalizedByteCode.__invokevirtual)
+			return MatchInvoke(eic, ref instr, NormalizedByteCode.__invokevirtual, clazz, name, sig);
+		}
+
+		private static bool MatchInvokeStatic(EmitIntrinsicContext eic, int offset, string clazz, string name, string sig)
+		{
+			return MatchInvoke(eic, ref eic.Code[eic.OpcodeIndex + offset], NormalizedByteCode.__invokestatic, clazz, name, sig);
+		}
+
+		private static bool MatchInvoke(EmitIntrinsicContext eic, ref Instruction instr, NormalizedByteCode opcode, string clazz, string name, string sig)
+		{
+			if (instr.NormalizedOpCode == opcode)
 			{
 				ClassFile.ConstantPoolItemMI method = eic.ClassFile.GetMethodref(instr.Arg1);
 				return method.Class == clazz
diff --git a/external/ikvm/runtime/openjdk/java.lang.cs b/external/ikvm/runtime/openjdk/java.lang.cs
new file mode 100644
index 0000000..7def989
--- /dev/null
+++ b/external/ikvm/runtime/openjdk/java.lang.cs
@@ -0,0 +1,1332 @@
+/*
+  Copyright (C) 2007-2013 Jeroen Frijters
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jeroen Frijters
+  jeroen at frijters.net
+  
+*/
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Security;
+using System.Threading;
+using IKVM.Internal;
+
+static class Java_java_lang_Class
+{
+	public static java.lang.Class forName0(string name, bool initialize, java.lang.ClassLoader loader)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		//Console.WriteLine("forName: " + name + ", loader = " + loader);
+		TypeWrapper tw = null;
+		if (name.IndexOf(',') > 0)
+		{
+			// we essentially require full trust before allowing arbitrary types to be loaded,
+			// hence we do the "createClassLoader" permission check
+			java.lang.SecurityManager sm = java.lang.System.getSecurityManager();
+			if (sm != null)
+				sm.checkPermission(new java.lang.RuntimePermission("createClassLoader"));
+			Type type = Type.GetType(name);
+			if (type != null)
+			{
+				tw = ClassLoaderWrapper.GetWrapperFromType(type);
+			}
+			if (tw == null)
+			{
+				java.lang.Throwable.suppressFillInStackTrace = true;
+				throw new java.lang.ClassNotFoundException(name);
+			}
+		}
+		else
+		{
+			try
+			{
+				ClassLoaderWrapper classLoaderWrapper = ClassLoaderWrapper.GetClassLoaderWrapper(loader);
+				tw = classLoaderWrapper.LoadClassByDottedName(name);
+			}
+			catch (ClassNotFoundException x)
+			{
+				java.lang.Throwable.suppressFillInStackTrace = true;
+				throw new java.lang.ClassNotFoundException(x.Message);
+			}
+			catch (ClassLoadingException x)
+			{
+				throw x.InnerException;
+			}
+			catch (RetargetableJavaException x)
+			{
+				throw x.ToJava();
+			}
+		}
+		if (initialize && !tw.IsArray)
+		{
+			try
+			{
+				tw.Finish();
+			}
+			catch (RetargetableJavaException x)
+			{
+				throw x.ToJava();
+			}
+			tw.RunClassInit();
+		}
+		return tw.ClassObject;
+#endif
+	}
+
+	public static bool isInstance(java.lang.Class thisClass, object obj)
+	{
+		return TypeWrapper.FromClass(thisClass).IsInstance(obj);
+	}
+
+	public static bool isAssignableFrom(java.lang.Class thisClass, java.lang.Class otherClass)
+	{
+#if !FIRST_PASS
+		if (otherClass == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+#endif
+		return TypeWrapper.FromClass(otherClass).IsAssignableTo(TypeWrapper.FromClass(thisClass));
+	}
+
+	public static bool isInterface(java.lang.Class thisClass)
+	{
+		return TypeWrapper.FromClass(thisClass).IsInterface;
+	}
+
+	public static bool isArray(java.lang.Class thisClass)
+	{
+		return TypeWrapper.FromClass(thisClass).IsArray;
+	}
+
+	public static bool isPrimitive(java.lang.Class thisClass)
+	{
+		return TypeWrapper.FromClass(thisClass).IsPrimitive;
+	}
+
+	public static string getName0(java.lang.Class thisClass)
+	{
+		TypeWrapper tw = TypeWrapper.FromClass(thisClass);
+		if (tw.IsPrimitive)
+		{
+			if (tw == PrimitiveTypeWrapper.BYTE)
+			{
+				return "byte";
+			}
+			else if (tw == PrimitiveTypeWrapper.CHAR)
+			{
+				return "char";
+			}
+			else if (tw == PrimitiveTypeWrapper.DOUBLE)
+			{
+				return "double";
+			}
+			else if (tw == PrimitiveTypeWrapper.FLOAT)
+			{
+				return "float";
+			}
+			else if (tw == PrimitiveTypeWrapper.INT)
+			{
+				return "int";
+			}
+			else if (tw == PrimitiveTypeWrapper.LONG)
+			{
+				return "long";
+			}
+			else if (tw == PrimitiveTypeWrapper.SHORT)
+			{
+				return "short";
+			}
+			else if (tw == PrimitiveTypeWrapper.BOOLEAN)
+			{
+				return "boolean";
+			}
+			else if (tw == PrimitiveTypeWrapper.VOID)
+			{
+				return "void";
+			}
+		}
+		return tw.Name;
+	}
+
+	public static string getSigName(java.lang.Class thisClass)
+	{
+		return TypeWrapper.FromClass(thisClass).SigName;
+	}
+
+	public static java.lang.ClassLoader getClassLoader0(java.lang.Class thisClass)
+	{
+		return TypeWrapper.FromClass(thisClass).GetClassLoader().GetJavaClassLoader();
+	}
+
+	public static java.lang.Class getSuperclass(java.lang.Class thisClass)
+	{
+		TypeWrapper super = TypeWrapper.FromClass(thisClass).BaseTypeWrapper;
+		return super != null ? super.ClassObject : null;
+	}
+
+	public static java.lang.Class[] getInterfaces(java.lang.Class thisClass)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		TypeWrapper[] ifaces = TypeWrapper.FromClass(thisClass).Interfaces;
+		java.lang.Class[] interfaces = new java.lang.Class[ifaces.Length];
+		for (int i = 0; i < ifaces.Length; i++)
+		{
+			interfaces[i] = ifaces[i].ClassObject;
+		}
+		return interfaces;
+#endif
+	}
+
+	public static java.lang.Class getComponentType(java.lang.Class thisClass)
+	{
+		TypeWrapper tw = TypeWrapper.FromClass(thisClass);
+		return tw.IsArray ? tw.ElementTypeWrapper.ClassObject : null;
+	}
+
+	public static int getModifiers(java.lang.Class thisClass)
+	{
+		// the 0x7FFF mask comes from JVM_ACC_WRITTEN_FLAGS in hotspot\src\share\vm\utilities\accessFlags.hpp
+		// masking out ACC_SUPER comes from instanceKlass::compute_modifier_flags() in hotspot\src\share\vm\oops\instanceKlass.cpp
+		const int mask = 0x7FFF & (int)~IKVM.Attributes.Modifiers.Super;
+		return (int)TypeWrapper.FromClass(thisClass).ReflectiveModifiers & mask;
+	}
+
+	public static object[] getSigners(java.lang.Class thisClass)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		return thisClass.signers;
+#endif
+	}
+
+	public static void setSigners(java.lang.Class thisClass, object[] signers)
+	{
+#if !FIRST_PASS
+		thisClass.signers = signers;
+#endif
+	}
+
+	public static object[] getEnclosingMethod0(java.lang.Class thisClass)
+	{
+		try
+		{
+			TypeWrapper tw = TypeWrapper.FromClass(thisClass);
+			tw.Finish();
+			string[] enc = tw.GetEnclosingMethod();
+			if (enc == null)
+			{
+				return null;
+			}
+			return new object[] { tw.GetClassLoader().LoadClassByDottedName(enc[0]).ClassObject, enc[1], enc[2] == null ? null : enc[2].Replace('.', '/') };
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+	}
+
+	public static java.lang.Class getDeclaringClass(java.lang.Class thisClass)
+	{
+		try
+		{
+			TypeWrapper wrapper = TypeWrapper.FromClass(thisClass);
+			wrapper.Finish();
+			TypeWrapper decl = wrapper.DeclaringTypeWrapper;
+			if (decl == null)
+			{
+				return null;
+			}
+			if (!decl.IsAccessibleFrom(wrapper))
+			{
+				throw new IllegalAccessError(string.Format("tried to access class {0} from class {1}", decl.Name, wrapper.Name));
+			}
+			decl.Finish();
+			if (Array.IndexOf(decl.InnerClasses, wrapper) == -1)
+			{
+				throw new IncompatibleClassChangeError(string.Format("{0} and {1} disagree on InnerClasses attribute", decl.Name, wrapper.Name));
+			}
+			return decl.ClassObject;
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+	}
+
+	public static java.security.ProtectionDomain getProtectionDomain0(java.lang.Class thisClass)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		TypeWrapper wrapper = TypeWrapper.FromClass(thisClass);
+		while (wrapper.IsArray)
+		{
+			wrapper = wrapper.ElementTypeWrapper;
+		}
+		java.security.ProtectionDomain pd = wrapper.ClassObject.pd;
+		if (pd == null)
+		{
+			// The protection domain for statically compiled code is created lazily (not at java.lang.Class creation time),
+			// to work around boot strap issues.
+			AssemblyClassLoader acl = wrapper.GetClassLoader() as AssemblyClassLoader;
+			if (acl != null)
+			{
+				pd = acl.GetProtectionDomain();
+			}
+		}
+		return pd;
+#endif
+	}
+
+	public static void setProtectionDomain0(java.lang.Class thisClass, java.security.ProtectionDomain pd)
+	{
+#if !FIRST_PASS
+		thisClass.pd = pd;
+#endif
+	}
+
+	public static java.lang.Class getPrimitiveClass(string name)
+	{
+		// note that this method isn't used anymore (because it is an intrinsic (during core class library compilation))
+		// it still remains for compat because it might be invoked through reflection by evil code
+		switch (name)
+		{
+			case "byte":
+				return PrimitiveTypeWrapper.BYTE.ClassObject;
+			case "char":
+				return PrimitiveTypeWrapper.CHAR.ClassObject;
+			case "double":
+				return PrimitiveTypeWrapper.DOUBLE.ClassObject;
+			case "float":
+				return PrimitiveTypeWrapper.FLOAT.ClassObject;
+			case "int":
+				return PrimitiveTypeWrapper.INT.ClassObject;
+			case "long":
+				return PrimitiveTypeWrapper.LONG.ClassObject;
+			case "short":
+				return PrimitiveTypeWrapper.SHORT.ClassObject;
+			case "boolean":
+				return PrimitiveTypeWrapper.BOOLEAN.ClassObject;
+			case "void":
+				return PrimitiveTypeWrapper.VOID.ClassObject;
+			default:
+				throw new ArgumentException(name);
+		}
+	}
+
+	public static string getGenericSignature(java.lang.Class thisClass)
+	{
+		TypeWrapper tw = TypeWrapper.FromClass(thisClass);
+		tw.Finish();
+		return tw.GetGenericSignature();
+	}
+
+	internal static object AnnotationsToMap(ClassLoaderWrapper loader, object[] objAnn)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		java.util.LinkedHashMap map = new java.util.LinkedHashMap();
+		if (objAnn != null)
+		{
+			foreach (object obj in objAnn)
+			{
+				java.lang.annotation.Annotation a = obj as java.lang.annotation.Annotation;
+				if (a != null)
+				{
+					map.put(a.annotationType(), FreezeOrWrapAttribute(a));
+				}
+				else if (obj is IKVM.Attributes.DynamicAnnotationAttribute)
+				{
+					a = (java.lang.annotation.Annotation)JVM.NewAnnotation(loader.GetJavaClassLoader(), ((IKVM.Attributes.DynamicAnnotationAttribute)obj).Definition);
+					if (a != null)
+					{
+						map.put(a.annotationType(), a);
+					}
+				}
+			}
+		}
+		return map;
+#endif
+	}
+
+#if !FIRST_PASS
+	internal static java.lang.annotation.Annotation FreezeOrWrapAttribute(java.lang.annotation.Annotation ann)
+	{
+		ikvm. at internal.AnnotationAttributeBase attr = ann as ikvm. at internal.AnnotationAttributeBase;
+		if (attr != null)
+		{
+#if DONT_WRAP_ANNOTATION_ATTRIBUTES
+			attr.freeze();
+#else
+			// freeze to make sure the defaults are set
+			attr.freeze();
+			ann = sun.reflect.annotation.AnnotationParser.annotationForMap(attr.annotationType(), attr.getValues());
+#endif
+		}
+		return ann;
+	}
+#endif
+
+	public static object getDeclaredAnnotationsImpl(java.lang.Class thisClass)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		TypeWrapper wrapper = TypeWrapper.FromClass(thisClass);
+		try
+		{
+			wrapper.Finish();
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+		return AnnotationsToMap(wrapper.GetClassLoader(), wrapper.GetDeclaredAnnotations());
+#endif
+	}
+
+	public static object getDeclaredFields0(java.lang.Class thisClass, bool publicOnly)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		Profiler.Enter("Class.getDeclaredFields0");
+		try
+		{
+			TypeWrapper wrapper = TypeWrapper.FromClass(thisClass);
+			// we need to finish the type otherwise all fields will not be in the field map yet
+			wrapper.Finish();
+			FieldWrapper[] fields = wrapper.GetFields();
+			List<java.lang.reflect.Field> list = new List<java.lang.reflect.Field>();
+			for (int i = 0; i < fields.Length; i++)
+			{
+				if (fields[i].IsHideFromReflection)
+				{
+					// skip
+				}
+				else if (publicOnly && !fields[i].IsPublic)
+				{
+					// caller is only asking for public field, so we don't return this non-public field
+				}
+				else
+				{
+					list.Add((java.lang.reflect.Field)fields[i].ToField(false, i));
+				}
+			}
+			return list.ToArray();
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+		finally
+		{
+			Profiler.Leave("Class.getDeclaredFields0");
+		}
+#endif
+	}
+
+	public static object getDeclaredMethods0(java.lang.Class thisClass, bool publicOnly)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		Profiler.Enter("Class.getDeclaredMethods0");
+		try
+		{
+			TypeWrapper wrapper = TypeWrapper.FromClass(thisClass);
+			wrapper.Finish();
+			if (wrapper.HasVerifyError)
+			{
+				// TODO we should get the message from somewhere
+				throw new VerifyError();
+			}
+			if (wrapper.HasClassFormatError)
+			{
+				// TODO we should get the message from somewhere
+				throw new ClassFormatError(wrapper.Name);
+			}
+			MethodWrapper[] methods = wrapper.GetMethods();
+			List<java.lang.reflect.Method> list = new List<java.lang.reflect.Method>();
+			for (int i = 0; i < methods.Length; i++)
+			{
+				// we don't want to expose "hideFromReflection" methods (one reason is that it would
+				// mess up the serialVersionUID computation)
+				if (!methods[i].IsHideFromReflection
+					&& methods[i].Name != "<clinit>" && methods[i].Name != "<init>"
+					&& (!publicOnly || methods[i].IsPublic))
+				{
+					list.Add((java.lang.reflect.Method)methods[i].ToMethodOrConstructor(false));
+				}
+			}
+			return list.ToArray();
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+		finally
+		{
+			Profiler.Leave("Class.getDeclaredMethods0");
+		}
+#endif
+	}
+
+	public static object getDeclaredConstructors0(java.lang.Class thisClass, bool publicOnly)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		Profiler.Enter("Class.getDeclaredConstructors0");
+		try
+		{
+			TypeWrapper wrapper = TypeWrapper.FromClass(thisClass);
+			wrapper.Finish();
+			if (wrapper.HasVerifyError)
+			{
+				// TODO we should get the message from somewhere
+				throw new VerifyError();
+			}
+			if (wrapper.HasClassFormatError)
+			{
+				// TODO we should get the message from somewhere
+				throw new ClassFormatError(wrapper.Name);
+			}
+			MethodWrapper[] methods = wrapper.GetMethods();
+			List<java.lang.reflect.Constructor> list = new List<java.lang.reflect.Constructor>();
+			for (int i = 0; i < methods.Length; i++)
+			{
+				// we don't want to expose "hideFromReflection" methods (one reason is that it would
+				// mess up the serialVersionUID computation)
+				if (!methods[i].IsHideFromReflection
+					&& methods[i].Name == "<init>"
+					&& (!publicOnly || methods[i].IsPublic))
+				{
+					list.Add((java.lang.reflect.Constructor)methods[i].ToMethodOrConstructor(false));
+				}
+			}
+			return list.ToArray();
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+		finally
+		{
+			Profiler.Leave("Class.getDeclaredConstructors0");
+		}
+#endif
+	}
+
+	public static java.lang.Class[] getDeclaredClasses0(java.lang.Class thisClass)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		try
+		{
+			TypeWrapper wrapper = TypeWrapper.FromClass(thisClass);
+			// NOTE to get at the InnerClasses we need to finish the type
+			wrapper.Finish();
+			TypeWrapper[] wrappers = wrapper.InnerClasses;
+			java.lang.Class[] innerclasses = new java.lang.Class[wrappers.Length];
+			for (int i = 0; i < innerclasses.Length; i++)
+			{
+				if (wrappers[i].IsUnloadable)
+				{
+					throw new java.lang.NoClassDefFoundError(wrappers[i].Name);
+				}
+				if (!wrappers[i].IsAccessibleFrom(wrapper))
+				{
+					throw new IllegalAccessError(string.Format("tried to access class {0} from class {1}", wrappers[i].Name, wrapper.Name));
+				}
+				wrappers[i].Finish();
+				innerclasses[i] = wrappers[i].ClassObject;
+			}
+			return innerclasses;
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+#endif
+	}
+
+	public static bool desiredAssertionStatus0(java.lang.Class clazz)
+	{
+		return IKVM.Runtime.Assertions.IsEnabled(TypeWrapper.FromClass(clazz));
+	}
+}
+
+static class Java_java_lang_ClassLoader
+{
+	public static java.net.URL getBootstrapResource(string name)
+	{
+		foreach (java.net.URL url in ClassLoaderWrapper.GetBootstrapClassLoader().GetResources(name))
+		{
+			return url;
+		}
+		return null;
+	}
+
+	public static java.util.Enumeration getBootstrapResources(string name)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		return new ikvm.runtime.EnumerationWrapper(ClassLoaderWrapper.GetBootstrapClassLoader().GetResources(name));
+#endif
+	}
+
+	public static java.lang.Class defineClass0(java.lang.ClassLoader thisClassLoader, string name, byte[] b, int off, int len, java.security.ProtectionDomain pd)
+	{
+		return defineClass1(thisClassLoader, name, b, off, len, pd, null);
+	}
+
+	public static java.lang.Class defineClass1(java.lang.ClassLoader thisClassLoader, string name, byte[] b, int off, int len, java.security.ProtectionDomain pd, string source)
+	{
+		// it appears the source argument is only used for trace messages in HotSpot. We'll just ignore it for now.
+		Profiler.Enter("ClassLoader.defineClass");
+		try
+		{
+			try
+			{
+				ClassLoaderWrapper classLoaderWrapper = ClassLoaderWrapper.GetClassLoaderWrapper(thisClassLoader);
+				ClassFileParseOptions cfp = ClassFileParseOptions.LineNumberTable;
+				if (classLoaderWrapper.EmitDebugInfo)
+				{
+					cfp |= ClassFileParseOptions.LocalVariableTable;
+				}
+				if (classLoaderWrapper.RelaxedClassNameValidation)
+				{
+					cfp |= ClassFileParseOptions.RelaxedClassNameValidation;
+				}
+				ClassFile classFile = new ClassFile(b, off, len, name, cfp);
+				if (name != null && classFile.Name != name)
+				{
+#if !FIRST_PASS
+					throw new java.lang.NoClassDefFoundError(name + " (wrong name: " + classFile.Name + ")");
+#endif
+				}
+				TypeWrapper type = classLoaderWrapper.DefineClass(classFile, pd);
+				return type.ClassObject;
+			}
+			catch (RetargetableJavaException x)
+			{
+				throw x.ToJava();
+			}
+		}
+		finally
+		{
+			Profiler.Leave("ClassLoader.defineClass");
+		}
+	}
+
+	public static java.lang.Class defineClass2(java.lang.ClassLoader thisClassLoader, string name, java.nio.ByteBuffer bb, int off, int len, java.security.ProtectionDomain pd, string source)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		byte[] buf = new byte[bb.remaining()];
+		bb.get(buf);
+		return defineClass1(thisClassLoader, name, buf, 0, buf.Length, pd, source);
+#endif
+	}
+
+	public static void resolveClass0(java.lang.ClassLoader thisClassLoader, java.lang.Class clazz)
+	{
+		// no-op
+	}
+
+	public static java.lang.Class findBootstrapClass(java.lang.ClassLoader thisClassLoader, string name)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		TypeWrapper tw;
+		try
+		{
+			tw = ClassLoaderWrapper.GetBootstrapClassLoader().LoadClassByDottedNameFast(name);
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+		return tw != null ? tw.ClassObject : null;
+#endif
+	}
+
+	public static java.lang.Class findLoadedClass0(java.lang.ClassLoader thisClassLoader, string name)
+	{
+		if (name == null)
+		{
+			return null;
+		}
+		ClassLoaderWrapper loader = ClassLoaderWrapper.GetClassLoaderWrapper(thisClassLoader);
+		TypeWrapper tw = loader.FindLoadedClass(name);
+		return tw != null ? tw.ClassObject : null;
+	}
+
+	public static object retrieveDirectives()
+	{
+		return IKVM.Runtime.Assertions.RetrieveDirectives();
+	}
+}
+
+static class Java_java_lang_ClassLoader_00024NativeLibrary
+{
+	public static void load(object thisNativeLibrary, string name)
+	{
+#if !FIRST_PASS
+		if (VirtualFileSystem.IsVirtualFS(name))
+		{
+			// we fake success for native libraries loaded from VFS
+			((java.lang.ClassLoader.NativeLibrary)thisNativeLibrary).handle = -1;
+		}
+		else
+		{
+			doLoad(thisNativeLibrary, name);
+		}
+#endif
+	}
+
+#if !FIRST_PASS
+	// we don't want to inline this method, because that would needlessly cause IKVM.Runtime.JNI.dll to be loaded when loading a fake native library from VFS
+	[MethodImpl(MethodImplOptions.NoInlining)]
+	[SecuritySafeCritical]
+	private static void doLoad(object thisNativeLibrary, string name)
+	{
+		java.lang.ClassLoader.NativeLibrary lib = (java.lang.ClassLoader.NativeLibrary)thisNativeLibrary;
+		lib.handle = IKVM.Runtime.JniHelper.LoadLibrary(name, TypeWrapper.FromClass(lib.fromClass).GetClassLoader());
+	}
+#endif
+
+	public static long find(object thisNativeLibrary, string name)
+	{
+		// TODO
+		throw new NotImplementedException();
+	}
+
+	[SecuritySafeCritical]
+	public static void unload(object thisNativeLibrary)
+	{
+#if !FIRST_PASS
+		java.lang.ClassLoader.NativeLibrary lib = (java.lang.ClassLoader.NativeLibrary)thisNativeLibrary;
+		long handle = Interlocked.Exchange(ref lib.handle, 0);
+		if (handle != 0)
+		{
+			IKVM.Runtime.JniHelper.UnloadLibrary(handle, TypeWrapper.FromClass(lib.fromClass).GetClassLoader());
+		}
+#endif
+	}
+}
+
+static class Java_java_lang_Compiler
+{
+	public static void initialize()
+	{
+	}
+
+	public static void registerNatives()
+	{
+	}
+
+	public static bool compileClass(object clazz)
+	{
+		return false;
+	}
+
+	public static bool compileClasses(string str)
+	{
+		return false;
+	}
+
+	public static object command(object any)
+	{
+		return null;
+	}
+
+	public static void enable()
+	{
+	}
+
+	public static void disable()
+	{
+	}
+}
+
+static class Java_java_lang_Double
+{
+	public static long doubleToRawLongBits(double value)
+	{
+		IKVM.Runtime.DoubleConverter converter = new IKVM.Runtime.DoubleConverter();
+		return IKVM.Runtime.DoubleConverter.ToLong(value, ref converter);
+	}
+
+	public static double longBitsToDouble(long bits)
+	{
+		IKVM.Runtime.DoubleConverter converter = new IKVM.Runtime.DoubleConverter();
+		return IKVM.Runtime.DoubleConverter.ToDouble(bits, ref converter);
+	}
+}
+
+static class Java_java_lang_Float
+{
+	public static int floatToRawIntBits(float value)
+	{
+		IKVM.Runtime.FloatConverter converter = new IKVM.Runtime.FloatConverter();
+		return IKVM.Runtime.FloatConverter.ToInt(value, ref converter);
+	}
+
+	public static float intBitsToFloat(int bits)
+	{
+		IKVM.Runtime.FloatConverter converter = new IKVM.Runtime.FloatConverter();
+		return IKVM.Runtime.FloatConverter.ToFloat(bits, ref converter);
+	}
+}
+
+static class Java_java_lang_Package
+{
+	private static Dictionary<string, string> systemPackages;
+
+	private static void LazyInitSystemPackages()
+	{
+		if (systemPackages == null)
+		{
+			Dictionary<string, string> dict = new Dictionary<string, string>();
+			string path = VirtualFileSystem.GetAssemblyResourcesPath(JVM.CoreAssembly) + "resources.jar";
+			foreach (string pkg in ClassLoaderWrapper.GetBootstrapClassLoader().GetPackages())
+			{
+				dict[pkg.Replace('.', '/') + "/"] = path;
+			}
+			Interlocked.CompareExchange(ref systemPackages, dict, null);
+		}
+	}
+
+	public static string getSystemPackage0(string name)
+	{
+		LazyInitSystemPackages();
+		string path;
+		systemPackages.TryGetValue(name, out path);
+		return path;
+	}
+
+	public static string[] getSystemPackages0()
+	{
+		LazyInitSystemPackages();
+		string[] pkgs = new string[systemPackages.Count];
+		systemPackages.Keys.CopyTo(pkgs, 0);
+		return pkgs;
+	}
+}
+
+static class Java_java_lang_ProcessEnvironment
+{
+	public static string environmentBlock()
+	{
+		StringBuilder sb = new StringBuilder();
+		foreach (System.Collections.DictionaryEntry de in Environment.GetEnvironmentVariables())
+		{
+			sb.Append(de.Key).Append('=').Append(de.Value).Append('\u0000');
+		}
+		if (sb.Length == 0)
+		{
+			sb.Append('\u0000');
+		}
+		sb.Append('\u0000');
+		return sb.ToString();
+	}
+}
+
+static class Java_java_lang_Runtime
+{
+	public static int availableProcessors(object thisRuntime)
+	{
+		return Environment.ProcessorCount;
+	}
+
+	public static long freeMemory(object thisRuntime)
+	{
+		// TODO figure out if there is anything meaningful we can return here
+		return 10 * 1024 * 1024;
+	}
+
+	public static long totalMemory(object thisRuntime)
+	{
+		// NOTE this really is a bogus number, but we have to return something
+		return GC.GetTotalMemory(false) + freeMemory(thisRuntime);
+	}
+
+	public static long maxMemory(object thisRuntime)
+	{
+		// spec says: If there is no inherent limit then the value Long.MAX_VALUE will be returned.
+		return Int64.MaxValue;
+	}
+
+	public static void gc(object thisRuntime)
+	{
+		GC.Collect();
+	}
+
+	public static void traceInstructions(object thisRuntime, bool on)
+	{
+	}
+
+	public static void traceMethodCalls(object thisRuntime, bool on)
+	{
+	}
+
+	public static void runFinalization0()
+	{
+		GC.WaitForPendingFinalizers();
+	}
+}
+
+static class Java_java_lang_SecurityManager
+{
+	// this field is set by code in the JNI assembly itself,
+	// to prevent having to load the JNI assembly when it isn't used.
+	internal static volatile Assembly jniAssembly;
+
+	public static java.lang.Class[] getClassContext(object thisSecurityManager)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		List<java.lang.Class> stack = new List<java.lang.Class>();
+		StackTrace trace = new StackTrace();
+		for (int i = 0; i < trace.FrameCount; i++)
+		{
+			StackFrame frame = trace.GetFrame(i);
+			MethodBase method = frame.GetMethod();
+			Type type = method.DeclaringType;
+			// NOTE these checks should be the same as the ones in Reflection.getCallerClass
+			if (Java_sun_reflect_Reflection.IsHideFromJava(method)
+				|| type == null
+				|| type.Assembly == typeof(object).Assembly
+				|| type.Assembly == typeof(Java_java_lang_SecurityManager).Assembly
+				|| type.Assembly == jniAssembly
+				|| type == typeof(java.lang.reflect.Constructor)
+				|| type == typeof(java.lang.reflect.Method))
+			{
+				continue;
+			}
+			if (type == typeof(java.lang.SecurityManager))
+			{
+				continue;
+			}
+			stack.Add(ClassLoaderWrapper.GetWrapperFromType(type).ClassObject);
+		}
+		return stack.ToArray();
+#endif
+	}
+
+	public static object currentClassLoader0(object thisSecurityManager)
+	{
+		java.lang.Class currentClass = currentLoadedClass0(thisSecurityManager);
+		if (currentClass != null)
+		{
+			return TypeWrapper.FromClass(currentClass).GetClassLoader().GetJavaClassLoader();
+		}
+		return null;
+	}
+
+	public static int classDepth(object thisSecurityManager, string name)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static int classLoaderDepth0(object thisSecurityManager)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static java.lang.Class currentLoadedClass0(object thisSecurityManager)
+	{
+		throw new NotImplementedException();
+	}
+}
+
+static class Java_java_lang_StrictMath
+{
+	public static double sin(double d)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.sin(d);
+#endif
+	}
+
+	public static double cos(double d)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.cos(d);
+#endif
+	}
+
+	public static double tan(double d)
+	{
+		return fdlibm.tan(d);
+	}
+
+	public static double asin(double d)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.asin(d);
+#endif
+	}
+
+	public static double acos(double d)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.acos(d);
+#endif
+	}
+
+	public static double atan(double d)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.atan(d);
+#endif
+	}
+
+	public static double exp(double d)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.exp(d);
+#endif
+	}
+
+	public static double log(double d)
+	{
+		// FPU behavior is correct
+		return Math.Log(d);
+	}
+
+	public static double log10(double d)
+	{
+		// FPU behavior is correct
+		return Math.Log10(d);
+	}
+
+	public static double sqrt(double d)
+	{
+		// FPU behavior is correct
+		return Math.Sqrt(d);
+	}
+
+	public static double cbrt(double d)
+	{
+		return fdlibm.cbrt(d);
+	}
+
+	public static double IEEEremainder(double f1, double f2)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.IEEEremainder(f1, f2);
+#endif
+	}
+
+	public static double ceil(double d)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.ceil(d);
+#endif
+	}
+
+	public static double floor(double d)
+	{
+		return fdlibm.floor(d);
+	}
+
+	public static double atan2(double y, double x)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.atan2(y, x);
+#endif
+	}
+
+	public static double pow(double x, double y)
+	{
+		return fdlibm.__ieee754_pow(x, y);
+	}
+
+	public static double sinh(double d)
+	{
+		return Math.Sinh(d);
+	}
+
+	public static double cosh(double d)
+	{
+		return Math.Cosh(d);
+	}
+
+	public static double tanh(double d)
+	{
+		return Math.Tanh(d);
+	}
+
+	public static double rint(double d)
+	{
+#if FIRST_PASS
+		return 0;
+#else
+		return ikvm. at internal.JMath.rint(d);
+#endif
+	}
+
+	public static double hypot(double a, double b)
+	{
+		return fdlibm.__ieee754_hypot(a, b);
+	}
+
+	public static double expm1(double d)
+	{
+		return fdlibm.expm1(d);
+	}
+
+	public static double log1p(double d)
+	{
+		return fdlibm.log1p(d);
+	}
+}
+
+static class Java_java_lang_System
+{
+	public static void arraycopy(object src, int srcPos, object dest, int destPos, int length)
+	{
+		IKVM.Runtime.ByteCodeHelper.arraycopy(src, srcPos, dest, destPos, length);
+	}
+}
+
+static class Java_java_lang_Thread
+{
+	private static readonly object mainThreadGroup;
+
+#if !FIRST_PASS
+	static Java_java_lang_Thread()
+	{
+		mainThreadGroup = new java.lang.ThreadGroup(java.lang.ThreadGroup.createRootGroup(), "main");
+	}
+#endif
+
+	public static object getMainThreadGroup()
+	{
+		return mainThreadGroup;
+	}
+
+	// this is called from JniInterface.cs
+	internal static void WaitUntilLastJniThread()
+	{
+#if !FIRST_PASS
+		int count = java.lang.Thread.currentThread().isDaemon() ? 0 : 1;
+		while (Interlocked.CompareExchange(ref java.lang.Thread.nonDaemonCount[0], 0, 0) > count)
+		{
+			Thread.Sleep(1);
+		}
+#endif
+	}
+
+	// this is called from JniInterface.cs
+	internal static void AttachThreadFromJni(object threadGroup)
+	{
+#if !FIRST_PASS
+		if (threadGroup == null)
+		{
+			threadGroup = mainThreadGroup;
+		}
+		if (java.lang.Thread.current == null)
+		{
+			new java.lang.Thread((java.lang.ThreadGroup)threadGroup);
+		}
+#endif
+	}
+
+	public static java.lang.StackTraceElement[] getStackTrace(StackTrace stack)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		List<java.lang.StackTraceElement> stackTrace = new List<java.lang.StackTraceElement>();
+		ExceptionHelper.ExceptionInfoHelper.Append(stackTrace, stack, 0, true);
+		return stackTrace.ToArray();
+#endif
+	}
+
+	public static object getThreads()
+	{
+#if FIRST_PASS
+		return null;
+#else
+		return java.security.AccessController.doPrivileged(ikvm.runtime.Delegates.toPrivilegedAction(delegate
+		{
+			java.lang.ThreadGroup root = (java.lang.ThreadGroup)mainThreadGroup;
+			for (; ; )
+			{
+				java.lang.Thread[] threads = new java.lang.Thread[root.activeCount()];
+				if (root.enumerate(threads) == threads.Length)
+				{
+					return threads;
+				}
+			}
+		}));
+#endif
+	}
+}
+
+static class Java_java_lang_ProcessImpl
+{
+	public static string mapVfsExecutable(string path)
+	{
+		if (VirtualFileSystem.IsVirtualFS(path))
+		{
+			return VirtualFileSystem.MapExecutable(path);
+		}
+		return path;
+	}
+
+	public static int parseCommandString(string cmdstr)
+	{
+		int pos = cmdstr.IndexOf(' ');
+		if (pos == -1)
+		{
+			return cmdstr.Length;
+		}
+		if (cmdstr[0] == '"')
+		{
+			int close = cmdstr.IndexOf('"', 1);
+			return close == -1 ? cmdstr.Length : close + 1;
+		}
+		if (Environment.OSVersion.Platform != PlatformID.Win32NT)
+		{
+			return pos;
+		}
+		IList<string> path = null;
+		for (; ; )
+		{
+			string str = cmdstr.Substring(0, pos);
+			if (Path.IsPathRooted(str))
+			{
+				if (Exists(str))
+				{
+					return pos;
+				}
+			}
+			else
+			{
+				if (path == null)
+				{
+					path = GetSearchPath();
+				}
+				foreach (string p in path)
+				{
+					if (Exists(Path.Combine(p, str)))
+					{
+						return pos;
+					}
+				}
+			}
+			if (pos == cmdstr.Length)
+			{
+				return cmdstr.IndexOf(' ');
+			}
+			pos = cmdstr.IndexOf(' ', pos + 1);
+			if (pos == -1)
+			{
+				pos = cmdstr.Length;
+			}
+		}
+	}
+
+	private static List<string> GetSearchPath()
+	{
+		List<string> list = new List<string>();
+		list.Add(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName));
+		list.Add(Environment.CurrentDirectory);
+		list.Add(Environment.SystemDirectory);
+		string windir = Path.GetDirectoryName(Environment.SystemDirectory);
+		list.Add(Path.Combine(windir, "System"));
+		list.Add(windir);
+		string path = Environment.GetEnvironmentVariable("PATH");
+		if (path != null)
+		{
+			foreach (string p in path.Split(Path.PathSeparator))
+			{
+				list.Add(p);
+			}
+		}
+		return list;
+	}
+
+	private static bool Exists(string file)
+	{
+		try
+		{
+			if (File.Exists(file))
+			{
+				return true;
+			}
+			else if (Directory.Exists(file))
+			{
+				return false;
+			}
+			else if (file.IndexOf('.') == -1 && File.Exists(file + ".exe"))
+			{
+				return true;
+			}
+			else
+			{
+				return false;
+			}
+		}
+		catch
+		{
+			return false;
+		}
+	}
+}
diff --git a/external/ikvm/runtime/openjdk/java.lang.invoke.cs b/external/ikvm/runtime/openjdk/java.lang.invoke.cs
index 6cfef41..49318de 100644
--- a/external/ikvm/runtime/openjdk/java.lang.invoke.cs
+++ b/external/ikvm/runtime/openjdk/java.lang.invoke.cs
@@ -119,7 +119,7 @@ static class Java_java_lang_invoke_DirectMethodHandle
 			MethodWrapper mw = tw.GetMethods()[index];
 			if (mw.IsDynamicOnly)
 			{
-				MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder("CustomInvoke:" + mw.Name, type, (ICustomInvoke)mw);
+				MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder("CustomInvoke:" + mw.Name, type, mw);
 				if (mw.IsStatic)
 				{
 					dm.LoadNull();
@@ -130,8 +130,8 @@ static class Java_java_lang_invoke_DirectMethodHandle
 					dm.Ldarg(0);
 					dm.BoxArgs(1);
 				}
-				dm.Callvirt(typeof(ICustomInvoke).GetMethod("Invoke"));
-				dm.Convert(typeof(object), type.returnType(), 0);
+				dm.Callvirt(typeof(MethodWrapper).GetMethod("Invoke", BindingFlags.Instance | BindingFlags.NonPublic));
+				dm.UnboxReturnValue();
 				dm.Ret();
 				return dm.CreateDelegate();
 			}
@@ -159,6 +159,7 @@ static class Java_java_lang_invoke_DirectMethodHandle
 			mw.ResolveMethod();
 			MethodInfo mi = mw.GetMethod() as MethodInfo;
 			if (mi != null
+				&& !mw.HasCallerID
 				&& !tw.IsRemapped
 				&& !tw.IsGhost
 				&& !tw.IsNonPrimitiveValueType
@@ -174,7 +175,8 @@ static class Java_java_lang_invoke_DirectMethodHandle
 			else
 			{
 				// slow path where we emit a DynamicMethod
-				MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder(mw.DeclaringType.TypeAsBaseType, "DirectMethodHandle:" + mw.Name, type);
+				MethodHandleUtil.DynamicMethodBuilder dm = new MethodHandleUtil.DynamicMethodBuilder(mw.DeclaringType.TypeAsBaseType, "DirectMethodHandle:" + mw.Name, type,
+					mw.HasCallerID ? ikvm. at internal.CallerID.create(lookupClass) : null);
 				for (int i = 0, count = type.parameterCount(); i < count; i++)
 				{
 					if (i == 0 && !mw.IsStatic && (tw.IsGhost || tw.IsNonPrimitiveValueType))
@@ -186,6 +188,10 @@ static class Java_java_lang_invoke_DirectMethodHandle
 						dm.Ldarg(i);
 					}
 				}
+				if (mw.HasCallerID)
+				{
+					dm.LoadCallerID();
+				}
 				if (doDispatch && !mw.IsStatic)
 				{
 					dm.Callvirt(mw);
@@ -343,8 +349,8 @@ static partial class MethodHandleUtil
 		private readonly MethodType type;
 		private readonly int firstArg;
 		private readonly Type delegateType;
-		private readonly object target;
-		private readonly object value;
+		private readonly object firstBoundValue;
+		private readonly object secondBoundValue;
 		private readonly Type container;
 		private readonly DynamicMethod dm;
 		private readonly CodeEmitter ilgen;
@@ -367,8 +373,8 @@ static partial class MethodHandleUtil
 		{
 			this.type = type;
 			this.delegateType = CreateDelegateType(type);
-			this.target = target;
-			this.value = value;
+			this.firstBoundValue = target;
+			this.secondBoundValue = value;
 			this.container = container;
 			MethodInfo mi = GetDelegateInvokeMethod(delegateType);
 			Type[] paramTypes;
@@ -405,8 +411,8 @@ static partial class MethodHandleUtil
 			}
 		}
 
-		internal DynamicMethodBuilder(Type owner, string name, MethodType type)
-			: this(name, type, null, null, null, owner)
+		internal DynamicMethodBuilder(Type owner, string name, MethodType type, ikvm. at internal.CallerID callerID)
+			: this(name, type, null, callerID, null, owner)
 		{
 		}
 
@@ -416,7 +422,7 @@ static partial class MethodHandleUtil
 			ilgen.Emit(OpCodes.Ldarg_0);
 		}
 
-		internal DynamicMethodBuilder(string name, MethodType type, ICustomInvoke target)
+		internal DynamicMethodBuilder(string name, MethodType type, MethodWrapper target)
 			: this(name, type, null, target, null, null)
 		{
 			ilgen.Emit(OpCodes.Ldarg_0);
@@ -541,7 +547,12 @@ static partial class MethodHandleUtil
 
 		internal void CallTarget()
 		{
-			EmitCallDelegateInvokeMethod(ilgen, target.GetType());
+			EmitCallDelegateInvokeMethod(ilgen, firstBoundValue.GetType());
+		}
+
+		internal void LoadCallerID()
+		{
+			ilgen.Emit(OpCodes.Ldarg_0);
 		}
 
 		internal void LoadValueAddress()
@@ -558,7 +569,7 @@ static partial class MethodHandleUtil
 
 		internal void CallValue()
 		{
-			EmitCallDelegateInvokeMethod(ilgen, value.GetType());
+			EmitCallDelegateInvokeMethod(ilgen, secondBoundValue.GetType());
 		}
 
 		internal void Ret()
@@ -571,7 +582,7 @@ static partial class MethodHandleUtil
 			ilgen.DoEmit();
 			return ValidateDelegate(firstArg == 0
 				? dm.CreateDelegate(delegateType)
-				: dm.CreateDelegate(delegateType, container == null ? target : Activator.CreateInstance(container, target, value)));
+				: dm.CreateDelegate(delegateType, container == null ? firstBoundValue : Activator.CreateInstance(container, firstBoundValue, secondBoundValue)));
 		}
 
 		internal AdapterMethodHandle CreateAdapter()
@@ -589,11 +600,41 @@ static partial class MethodHandleUtil
 				ilgen.Emit(OpCodes.Dup);
 				ilgen.EmitLdc_I4(i - start);
 				Ldarg(i);
-				Convert(type.parameterType(i), typeof(object), 0);
+				TypeWrapper tw = TypeWrapper.FromClass(type.parameterType(i));
+				if (tw.IsPrimitive || tw.IsGhost)
+				{
+					ilgen.Emit(OpCodes.Box, tw.TypeAsSignatureType);
+				}
+				else if (tw.IsNonPrimitiveValueType)
+				{
+					tw.EmitBox(ilgen);
+				}
 				ilgen.Emit(OpCodes.Stelem_Ref);
 			}
 		}
 
+		internal void UnboxReturnValue()
+		{
+			TypeWrapper tw = TypeWrapper.FromClass(type.returnType());
+			if (tw == PrimitiveTypeWrapper.VOID)
+			{
+				ilgen.Emit(OpCodes.Pop);
+			}
+			else if (tw.IsPrimitive || tw.IsGhost)
+			{
+				ilgen.Emit(OpCodes.Unbox, tw.TypeAsSignatureType);
+				ilgen.Emit(OpCodes.Ldobj, tw.TypeAsSignatureType);
+			}
+			else if (tw.IsNonPrimitiveValueType)
+			{
+				tw.EmitUnbox(ilgen);
+			}
+			else if (tw != CoreClasses.java.lang.Object.Wrapper)
+			{
+				tw.EmitCheckcast(ilgen);
+			}
+		}
+
 		internal void LoadNull()
 		{
 			ilgen.Emit(OpCodes.Ldnull);
@@ -1081,7 +1122,7 @@ static class Java_java_lang_invoke_MethodHandleNatives
 		}
 		else if (r is java.lang.reflect.Field)
 		{
-			FieldWrapper fw = FieldWrapper.FromField(r);
+			FieldWrapper fw = FieldWrapper.FromField((java.lang.reflect.Field)r);
 			int index = Array.IndexOf(fw.DeclaringType.GetFields(), fw);
 			if (index != -1)
 			{
diff --git a/external/ikvm/runtime/openjdk/java.lang.reflect.cs b/external/ikvm/runtime/openjdk/java.lang.reflect.cs
new file mode 100644
index 0000000..994ef60
--- /dev/null
+++ b/external/ikvm/runtime/openjdk/java.lang.reflect.cs
@@ -0,0 +1,767 @@
+/*
+  Copyright (C) 2007-2013 Jeroen Frijters
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jeroen Frijters
+  jeroen at frijters.net
+  
+*/
+using System;
+using System.Collections.Generic;
+using IKVM.Internal;
+
+static class Java_java_lang_reflect_Array
+{
+#if FIRST_PASS
+	public static int getLength(object arrayObj)
+	{
+		return 0;
+	}
+
+	public static object get(object arrayObj, int index)
+	{
+		return null;
+	}
+
+	public static bool getBoolean(object arrayObj, int index)
+	{
+		return false;
+	}
+
+	public static byte getByte(object arrayObj, int index)
+	{
+		return 0;
+	}
+
+	public static char getChar(object arrayObj, int index)
+	{
+		return '\u0000';
+	}
+
+	public static short getShort(object arrayObj, int index)
+	{
+		return 0;
+	}
+
+	public static int getInt(object arrayObj, int index)
+	{
+		return 0;
+	}
+
+	public static float getFloat(object arrayObj, int index)
+	{
+		return 0;
+	}
+
+	public static long getLong(object arrayObj, int index)
+	{
+		return 0;
+	}
+
+	public static double getDouble(object arrayObj, int index)
+	{
+		return 0;
+	}
+
+	public static void set(object arrayObj, int index, object value)
+	{
+	}
+
+	public static void setBoolean(object arrayObj, int index, bool value)
+	{
+	}
+
+	public static void setByte(object arrayObj, int index, byte value)
+	{
+	}
+
+	public static void setChar(object arrayObj, int index, char value)
+	{
+	}
+
+	public static void setShort(object arrayObj, int index, short value)
+	{
+	}
+
+	public static void setInt(object arrayObj, int index, int value)
+	{
+	}
+
+	public static void setFloat(object arrayObj, int index, float value)
+	{
+	}
+
+	public static void setLong(object arrayObj, int index, long value)
+	{
+	}
+
+	public static void setDouble(object arrayObj, int index, double value)
+	{
+	}
+
+	public static object newArray(java.lang.Class componentType, int length)
+	{
+		return null;
+	}
+
+	public static object multiNewArray(java.lang.Class componentType, int[] dimensions)
+	{
+		return null;
+	}
+#else
+	private static Array CheckArray(object arrayObj)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		Array arr = arrayObj as Array;
+		if (arr != null)
+		{
+			return arr;
+		}
+		throw new java.lang.IllegalArgumentException("Argument is not an array");
+	}
+
+	public static int getLength(object arrayObj)
+	{
+		return CheckArray(arrayObj).Length;
+	}
+
+	public static object get(object arrayObj, int index)
+	{
+		Array arr = CheckArray(arrayObj);
+		if (index < 0 || index >= arr.Length)
+		{
+			throw new java.lang.ArrayIndexOutOfBoundsException();
+		}
+		// We need to look at the actual type here, because "is" or "as"
+		// will convert enums to their underlying type and unsigned integral types
+		// to their signed counter parts.
+		Type type = arrayObj.GetType();
+		if (type == typeof(bool[]))
+		{
+			return java.lang.Boolean.valueOf(((bool[])arr)[index]);
+		}
+		if (type == typeof(byte[]))
+		{
+			return java.lang.Byte.valueOf(((byte[])arr)[index]);
+		}
+		if (type == typeof(short[]))
+		{
+			return java.lang.Short.valueOf(((short[])arr)[index]);
+		}
+		if (type == typeof(char[]))
+		{
+			return java.lang.Character.valueOf(((char[])arr)[index]);
+		}
+		if (type == typeof(int[]))
+		{
+			return java.lang.Integer.valueOf(((int[])arr)[index]);
+		}
+		if (type == typeof(float[]))
+		{
+			return java.lang.Float.valueOf(((float[])arr)[index]);
+		}
+		if (type == typeof(long[]))
+		{
+			return java.lang.Long.valueOf(((long[])arr)[index]);
+		}
+		if (type == typeof(double[]))
+		{
+			return java.lang.Double.valueOf(((double[])arr)[index]);
+		}
+		return arr.GetValue(index);
+	}
+
+	public static bool getBoolean(object arrayObj, int index)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		bool[] arr = arrayObj as bool[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr[index];
+		}
+		throw new java.lang.IllegalArgumentException("argument type mismatch");
+	}
+
+	public static byte getByte(object arrayObj, int index)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		byte[] arr = arrayObj as byte[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr[index];
+		}
+		throw new java.lang.IllegalArgumentException("argument type mismatch");
+	}
+
+	public static char getChar(object arrayObj, int index)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		char[] arr = arrayObj as char[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr[index];
+		}
+		throw new java.lang.IllegalArgumentException("argument type mismatch");
+	}
+
+	public static short getShort(object arrayObj, int index)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		short[] arr = arrayObj as short[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr[index];
+		}
+		return (sbyte)getByte(arrayObj, index);
+	}
+
+	public static int getInt(object arrayObj, int index)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		int[] arr1 = arrayObj as int[];
+		if (arr1 != null)
+		{
+			if (index < 0 || index >= arr1.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr1[index];
+		}
+		char[] arr2 = arrayObj as char[];
+		if (arr2 != null)
+		{
+			if (index < 0 || index >= arr2.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr2[index];
+		}
+		return getShort(arrayObj, index);
+	}
+
+	public static float getFloat(object arrayObj, int index)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		float[] arr = arrayObj as float[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr[index];
+		}
+		return getLong(arrayObj, index);
+	}
+
+	public static long getLong(object arrayObj, int index)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		long[] arr = arrayObj as long[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr[index];
+		}
+		return getInt(arrayObj, index);
+	}
+
+	public static double getDouble(object arrayObj, int index)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		double[] arr = arrayObj as double[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			return arr[index];
+		}
+		return getFloat(arrayObj, index);
+	}
+
+	public static void set(object arrayObj, int index, object value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		Type type = arrayObj.GetType();
+		if (ReflectUtil.IsVector(type) && ClassLoaderWrapper.GetWrapperFromType(type.GetElementType()).IsPrimitive)
+		{
+			java.lang.Boolean booleanValue = value as java.lang.Boolean;
+			if (booleanValue != null)
+			{
+				setBoolean(arrayObj, index, booleanValue.booleanValue());
+				return;
+			}
+			java.lang.Byte byteValue = value as java.lang.Byte;
+			if (byteValue != null)
+			{
+				setByte(arrayObj, index, byteValue.byteValue());
+				return;
+			}
+			java.lang.Character charValue = value as java.lang.Character;
+			if (charValue != null)
+			{
+				setChar(arrayObj, index, charValue.charValue());
+				return;
+			}
+			java.lang.Short shortValue = value as java.lang.Short;
+			if (shortValue != null)
+			{
+				setShort(arrayObj, index, shortValue.shortValue());
+				return;
+			}
+			java.lang.Integer intValue = value as java.lang.Integer;
+			if (intValue != null)
+			{
+				setInt(arrayObj, index, intValue.intValue());
+				return;
+			}
+			java.lang.Float floatValue = value as java.lang.Float;
+			if (floatValue != null)
+			{
+				setFloat(arrayObj, index, floatValue.floatValue());
+				return;
+			}
+			java.lang.Long longValue = value as java.lang.Long;
+			if (longValue != null)
+			{
+				setLong(arrayObj, index, longValue.longValue());
+				return;
+			}
+			java.lang.Double doubleValue = value as java.lang.Double;
+			if (doubleValue != null)
+			{
+				setDouble(arrayObj, index, doubleValue.doubleValue());
+				return;
+			}
+		}
+		try
+		{
+			CheckArray(arrayObj).SetValue(value, index);
+		}
+		catch (InvalidCastException)
+		{
+			throw new java.lang.IllegalArgumentException("argument type mismatch");
+		}
+		catch (IndexOutOfRangeException)
+		{
+			throw new java.lang.ArrayIndexOutOfBoundsException();
+		}
+	}
+
+	public static void setBoolean(object arrayObj, int index, bool value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		bool[] arr = arrayObj as bool[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			arr[index] = value;
+		}
+		else
+		{
+			throw new java.lang.IllegalArgumentException("argument type mismatch");
+		}
+	}
+
+	public static void setByte(object arrayObj, int index, byte value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		byte[] arr = arrayObj as byte[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			arr[index] = value;
+		}
+		else
+		{
+			setShort(arrayObj, index, (sbyte)value);
+		}
+	}
+
+	public static void setChar(object arrayObj, int index, char value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		char[] arr = arrayObj as char[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			arr[index] = value;
+		}
+		else
+		{
+			setInt(arrayObj, index, value);
+		}
+	}
+
+	public static void setShort(object arrayObj, int index, short value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		short[] arr = arrayObj as short[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			arr[index] = value;
+		}
+		else
+		{
+			setInt(arrayObj, index, value);
+		}
+	}
+
+	public static void setInt(object arrayObj, int index, int value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		int[] arr = arrayObj as int[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			arr[index] = value;
+		}
+		else
+		{
+			setLong(arrayObj, index, value);
+		}
+	}
+
+	public static void setFloat(object arrayObj, int index, float value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		float[] arr = arrayObj as float[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			arr[index] = value;
+		}
+		else
+		{
+			setDouble(arrayObj, index, value);
+		}
+	}
+
+	public static void setLong(object arrayObj, int index, long value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		long[] arr = arrayObj as long[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			arr[index] = value;
+		}
+		else
+		{
+			setFloat(arrayObj, index, value);
+		}
+	}
+
+	public static void setDouble(object arrayObj, int index, double value)
+	{
+		if (arrayObj == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		double[] arr = arrayObj as double[];
+		if (arr != null)
+		{
+			if (index < 0 || index >= arr.Length)
+			{
+				throw new java.lang.ArrayIndexOutOfBoundsException();
+			}
+			arr[index] = value;
+		}
+		else
+		{
+			throw new java.lang.IllegalArgumentException("argument type mismatch");
+		}
+	}
+
+	public static object newArray(java.lang.Class componentType, int length)
+	{
+		if (componentType == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		if (componentType == java.lang.Void.TYPE)
+		{
+			throw new java.lang.IllegalArgumentException();
+		}
+		if (length < 0)
+		{
+			throw new java.lang.NegativeArraySizeException();
+		}
+		try
+		{
+			TypeWrapper wrapper = TypeWrapper.FromClass(componentType);
+			wrapper.Finish();
+			object obj = Array.CreateInstance(wrapper.TypeAsArrayType, length);
+			if (wrapper.IsGhost || wrapper.IsGhostArray)
+			{
+				IKVM.Runtime.GhostTag.SetTag(obj, wrapper.MakeArrayType(1));
+			}
+			return obj;
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+		catch (NotSupportedException x)
+		{
+			// This happens when you try to create an array from TypedReference, ArgIterator, ByRef,
+			// RuntimeArgumentHandle or an open generic type.
+			throw new java.lang.IllegalArgumentException(x.Message);
+		}
+	}
+
+	public static object multiNewArray(java.lang.Class componentType, int[] dimensions)
+	{
+		if (componentType == null || dimensions == null)
+		{
+			throw new java.lang.NullPointerException();
+		}
+		if (componentType == java.lang.Void.TYPE)
+		{
+			throw new java.lang.IllegalArgumentException();
+		}
+		if (dimensions.Length == 0 || dimensions.Length > 255)
+		{
+			throw new java.lang.IllegalArgumentException();
+		}
+		try
+		{
+			TypeWrapper wrapper = TypeWrapper.FromClass(componentType).MakeArrayType(dimensions.Length);
+			wrapper.Finish();
+			object obj = IKVM.Runtime.ByteCodeHelper.multianewarray(wrapper.TypeAsArrayType.TypeHandle, dimensions);
+			if (wrapper.IsGhostArray)
+			{
+				IKVM.Runtime.GhostTag.SetTag(obj, wrapper);
+			}
+			return obj;
+		}
+		catch (RetargetableJavaException x)
+		{
+			throw x.ToJava();
+		}
+		catch (NotSupportedException x)
+		{
+			// This happens when you try to create an array from TypedReference, ArgIterator, ByRef,
+			// RuntimeArgumentHandle or an open generic type.
+			throw new java.lang.IllegalArgumentException(x.Message);
+		}
+	}
+#endif // FIRST_PASS
+}
+
+static class Java_java_lang_reflect_Proxy
+{
+	public static object defineClass0(java.lang.ClassLoader classLoader, string name, byte[] b, int off, int len)
+	{
+		return Java_java_lang_ClassLoader.defineClass1(classLoader, name, b, off, len, null, null);
+	}
+
+	public static java.lang.Class getPrecompiledProxy(java.lang.ClassLoader classLoader, string proxyName, java.lang.Class[] interfaces)
+	{
+		AssemblyClassLoader acl = ClassLoaderWrapper.GetClassLoaderWrapper(classLoader) as AssemblyClassLoader;
+		if (acl == null)
+		{
+			return null;
+		}
+		TypeWrapper[] wrappers = new TypeWrapper[interfaces.Length];
+		for (int i = 0; i < wrappers.Length; i++)
+		{
+			wrappers[i] = TypeWrapper.FromClass(interfaces[i]);
+		}
+		// TODO support multi assembly class loaders
+		Type type = acl.MainAssembly.GetType(TypeNameUtil.GetProxyName(wrappers));
+		if (type == null)
+		{
+			return null;
+		}
+		TypeWrapper tw = CompiledTypeWrapper.newInstance(proxyName, type);
+		TypeWrapper tw2 = acl.RegisterInitiatingLoader(tw);
+		if (tw != tw2)
+		{
+			return null;
+		}
+		TypeWrapper[] wrappers2 = tw.Interfaces;
+		if (wrappers.Length != wrappers.Length)
+		{
+			return null;
+		}
+		for (int i = 0; i < wrappers.Length; i++)
+		{
+			if (wrappers[i] != wrappers2[i])
+			{
+				return null;
+			}
+		}
+		return tw.ClassObject;
+	}
+}
+
+static class Java_java_lang_reflect_Field
+{
+	public static object getDeclaredAnnotationsImpl(java.lang.reflect.Field thisField)
+	{
+		FieldWrapper fw = FieldWrapper.FromField(thisField);
+		return Java_java_lang_Class.AnnotationsToMap(fw.DeclaringType.GetClassLoader(), fw.DeclaringType.GetFieldAnnotations(fw));
+	}
+}
+
+static class Java_java_lang_reflect_Method
+{
+	public static object getDeclaredAnnotationsImpl(object methodOrConstructor)
+	{
+		MethodWrapper mw = MethodWrapper.FromMethodOrConstructor(methodOrConstructor);
+		return Java_java_lang_Class.AnnotationsToMap(mw.DeclaringType.GetClassLoader(), mw.DeclaringType.GetMethodAnnotations(mw));
+	}
+
+	public static object[][] getParameterAnnotationsImpl(object methodOrConstructor)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		MethodWrapper mw = MethodWrapper.FromMethodOrConstructor(methodOrConstructor);
+		object[][] objAnn = mw.DeclaringType.GetParameterAnnotations(mw);
+		if (objAnn == null)
+		{
+			return null;
+		}
+		java.lang.annotation.Annotation[][] ann = new java.lang.annotation.Annotation[objAnn.Length][];
+		for (int i = 0; i < ann.Length; i++)
+		{
+			List<java.lang.annotation.Annotation> list = new List<java.lang.annotation.Annotation>();
+			foreach (object obj in objAnn[i])
+			{
+				java.lang.annotation.Annotation a = obj as java.lang.annotation.Annotation;
+				if (a != null)
+				{
+					list.Add(Java_java_lang_Class.FreezeOrWrapAttribute(a));
+				}
+				else if (obj is IKVM.Attributes.DynamicAnnotationAttribute)
+				{
+					a = (java.lang.annotation.Annotation)JVM.NewAnnotation(mw.DeclaringType.GetClassLoader().GetJavaClassLoader(), ((IKVM.Attributes.DynamicAnnotationAttribute)obj).Definition);
+					if (a != null)
+					{
+						list.Add(a);
+					}
+				}
+			}
+			ann[i] = list.ToArray();
+		}
+		return ann;
+#endif
+	}
+
+	public static object getDefaultValue(java.lang.reflect.Method thisMethod)
+	{
+		MethodWrapper mw = MethodWrapper.FromMethod(thisMethod);
+		return mw.DeclaringType.GetAnnotationDefault(mw);
+	}
+}
diff --git a/external/ikvm/runtime/openjdk/misc.cs b/external/ikvm/runtime/openjdk/misc.cs
new file mode 100644
index 0000000..85529d9
--- /dev/null
+++ b/external/ikvm/runtime/openjdk/misc.cs
@@ -0,0 +1,585 @@
+/*
+  Copyright (C) 2007-2013 Jeroen Frijters
+  Copyright (C) 2009 Volker Berlin (i-net software)
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jeroen Frijters
+  jeroen at frijters.net
+  
+*/
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Security;
+using System.Security.Cryptography;
+using System.Security.Principal;
+using IKVM.Internal;
+
+static class Java_ikvm_runtime_Startup
+{
+	// this method is called from ikvm.runtime.Startup.exitMainThread() and from JNI's DetachCurrentThread
+	public static void jniDetach()
+	{
+#if !FIRST_PASS
+		java.lang.Thread.currentThread().die();
+#endif
+	}
+
+	public static void addBootClassPathAssembly(Assembly asm)
+	{
+		ClassLoaderWrapper.GetBootstrapClassLoader().AddDelegate(AssemblyClassLoader.FromAssembly(asm));
+	}
+}
+
+static class Java_java_lang_ref_Reference
+{
+	public static bool noclassgc()
+	{
+#if CLASSGC
+		return !JVM.classUnloading;
+#else
+		return true;
+#endif
+	}
+}
+
+static class Java_java_util_logging_FileHandler
+{
+	public static bool isSetUID()
+	{
+		// TODO
+		return false;
+	}
+}
+
+static class Java_java_util_jar_JarFile
+{
+	public static string[] getMetaInfEntryNames(object thisJarFile)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		java.util.zip.ZipFile zf = (java.util.zip.ZipFile)thisJarFile;
+		java.util.Enumeration entries = zf.entries();
+		List<string> list = null;
+		while (entries.hasMoreElements())
+		{
+			java.util.zip.ZipEntry entry = (java.util.zip.ZipEntry)entries.nextElement();
+			if (entry.getName().StartsWith("META-INF/", StringComparison.OrdinalIgnoreCase))
+			{
+				if (list == null)
+				{
+					list = new List<string>();
+				}
+				list.Add(entry.getName());
+			}
+		}
+		return list == null ? null : list.ToArray();
+#endif
+	}
+}
+
+static class Java_java_util_zip_ClassStubZipEntry
+{
+	public static void expandIkvmClasses(object _zipFile, object _entries)
+	{
+#if !FIRST_PASS
+		java.util.zip.ZipFile zipFile = (java.util.zip.ZipFile)_zipFile;
+		java.util.LinkedHashMap entries = (java.util.LinkedHashMap)_entries;
+
+		try
+		{
+			string path = zipFile.getName();
+			java.util.zip.ZipEntry entry = (java.util.zip.ZipEntry)entries.get(JVM.JarClassList);
+			if (entry != null && VirtualFileSystem.IsVirtualFS(path))
+			{
+				using (VirtualFileSystem.ZipEntryStream stream = new VirtualFileSystem.ZipEntryStream(zipFile, entry))
+				{
+					entries.remove(entry.name);
+					BinaryReader br = new BinaryReader(stream);
+					int count = br.ReadInt32();
+					for (int i = 0; i < count; i++)
+					{
+						java.util.zip.ClassStubZipEntry classEntry = new java.util.zip.ClassStubZipEntry(path, br.ReadString());
+						classEntry.setMethod(java.util.zip.ClassStubZipEntry.STORED);
+						classEntry.setTime(entry.getTime());
+						entries.put(classEntry.name, classEntry);
+					}
+				}
+			}
+		}
+		catch (java.io.IOException)
+		{
+		}
+		catch (IOException)
+		{
+		}
+#endif
+	}
+}
+
+static class Java_sun_awt_image_ByteComponentRaster
+{
+	public static void initIDs()
+	{
+	}
+}
+
+static class Java_sun_awt_image_BytePackedRaster
+{
+	public static void initIDs()
+	{
+	}
+}
+
+static class Java_sun_awt_image_IntegerComponentRaster
+{
+	public static void initIDs()
+	{
+	}
+}
+
+static class Java_sun_awt_image_ShortComponentRaster
+{
+	public static void initIDs()
+	{
+	}
+}
+
+static class Java_sun_awt_FontDescriptor
+{
+	public static void initIDs()
+	{
+	}
+}
+
+static class Java_sun_invoke_anon_AnonymousClassLoader
+{
+	public static java.lang.Class loadClassInternal(java.lang.Class hostClass, byte[] classFile, object[] patchArray)
+	{
+		throw new NotImplementedException();
+	}
+}
+
+static class Java_sun_net_spi_DefaultProxySelector
+{
+	public static bool init()
+	{
+		return true;
+	}
+
+	public static object getSystemProxy(object thisDefaultProxySelector, string protocol, string host)
+	{
+		// TODO on Whidbey we might be able to use System.Net.Configuration.DefaultProxySection.Proxy
+		return null;
+	}
+}
+
+static class Java_sun_nio_fs_NetPath
+{
+	public static string toRealPathImpl(string path)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		path = java.io.FileSystem.getFileSystem().canonicalize(path);
+		if (VirtualFileSystem.IsVirtualFS(path))
+		{
+			if (VirtualFileSystem.CheckAccess(path, Java_java_io_Win32FileSystem.ACCESS_READ))
+			{
+				return path;
+			}
+			throw new java.nio.file.NoSuchFileException(path);
+		}
+		try
+		{
+			File.GetAttributes(path);
+			return path;
+		}
+		catch (FileNotFoundException)
+		{
+			throw new java.nio.file.NoSuchFileException(path);
+		}
+		catch (DirectoryNotFoundException)
+		{
+			throw new java.nio.file.NoSuchFileException(path);
+		}
+		catch (UnauthorizedAccessException)
+		{
+			throw new java.nio.file.AccessDeniedException(path);
+		}
+		catch (SecurityException)
+		{
+			throw new java.nio.file.AccessDeniedException(path);
+		}
+		catch (ArgumentException x)
+		{
+			throw new java.nio.file.FileSystemException(path, null, x.Message);
+		}
+		catch (NotSupportedException x)
+		{
+			throw new java.nio.file.FileSystemException(path, null, x.Message);
+		}
+		catch (IOException x)
+		{
+			throw new java.nio.file.FileSystemException(path, null, x.Message);
+		}
+#endif
+	}
+}
+
+static class Java_sun_rmi_server_MarshalInputStream
+{
+	public static object latestUserDefinedLoader()
+	{
+		return Java_java_io_ObjectInputStream.latestUserDefinedLoader();
+	}
+}
+
+static class Java_sun_security_provider_NativeSeedGenerator
+{
+	public static bool nativeGenerateSeed(byte[] result)
+	{
+		try
+		{
+			RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
+			csp.GetBytes(result);
+			return true;
+		}
+		catch (CryptographicException)
+		{
+			return false;
+		}
+	}
+}
+
+static class Java_com_sun_java_util_jar_pack_NativeUnpack
+{
+	public static void initIDs()
+	{
+	}
+
+	public static long start(object thisNativeUnpack, object buf, long offset)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static bool getNextFile(object thisNativeUnpack, object[] parts)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static object getUnusedInput(object thisNativeUnpack)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static long finish(object thisNativeUnpack)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static bool setOption(object thisNativeUnpack, string opt, string value)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static string getOption(object thisNativeUnpack, string opt)
+	{
+		throw new NotImplementedException();
+	}
+}
+
+static class Java_com_sun_security_auth_module_NTSystem
+{
+	public static void getCurrent(object thisObj, bool debug)
+	{
+		WindowsIdentity id = WindowsIdentity.GetCurrent();
+		string[] name = id.Name.Split('\\');
+		SetField(thisObj, "userName", name[1]);
+		SetField(thisObj, "domain", name[0]);
+		SetField(thisObj, "domainSID", id.User.AccountDomainSid.Value);
+		SetField(thisObj, "userSID", id.User.Value);
+		string[] groups = new string[id.Groups.Count];
+		for (int i = 0; i < groups.Length; i++)
+		{
+			groups[i] = id.Groups[i].Value;
+		}
+		SetField(thisObj, "groupIDs", groups);
+		// HACK it turns out that Groups[0] is the primary group, but AFAIK this is not documented anywhere
+		SetField(thisObj, "primaryGroupID", groups[0]);
+	}
+
+	private static void SetField(object thisObj, string field, object value)
+	{
+		thisObj.GetType().GetField(field, BindingFlags.NonPublic | BindingFlags.Instance).SetValue(thisObj, value);
+	}
+
+	public static long getImpersonationToken0(object thisObj)
+	{
+		return WindowsIdentity.GetCurrent().Token.ToInt64();
+	}
+}
+
+static class Java_com_sun_security_auth_module_SolarisSystem
+{
+	public static void getSolarisInfo(object thisObj)
+	{
+		throw new NotImplementedException();
+	}
+}
+
+static class Java_com_sun_security_auth_module_UnixSystem
+{
+	public static void getUnixInfo(object thisObj)
+	{
+		throw new NotImplementedException();
+	}
+}
+
+static class Java_com_sun_media_sound_JDK13Services
+{
+	public static string getDefaultProviderClassName(object deviceClass)
+	{
+		return null;
+	}
+
+	public static string getDefaultInstanceName(object deviceClass)
+	{
+		return null;
+	}
+
+	public static object getProviders(object providerClass)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		return new java.util.ArrayList();
+#endif
+	}
+}
+
+static class Java_java_awt_AWTEvent
+{
+	public static void initIDs() { }
+	public static void nativeSetSource(object thisObj, object peer) { }
+}
+
+static class Java_java_awt_Button
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Checkbox
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_CheckboxMenuItem
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Color
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Component
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Container
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Cursor
+{
+	public static void initIDs() { }
+	public static void finalizeImpl(Int64 pData) { }
+}
+
+static class Java_java_awt_Dialog
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Dimension
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Event
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_FileDialog
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Frame
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_FontMetrics
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Insets
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_KeyboardFocusManager
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Label
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Menu
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_MenuBar
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_MenuComponent
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_MenuItem
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Rectangle
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Scrollbar
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_ScrollPane
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_ScrollPaneAdjustable
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_SplashScreen
+{
+	public static void _update(long splashPtr, int[] data, int x, int y, int width, int height, int scanlineStride) { }
+	public static bool _isVisible(long splashPtr) { return false; }
+	public static object _getBounds(long splashPtr) { return null; }
+	public static long _getInstance() { return 0; }
+	public static void _close(long splashPtr) { }
+	public static String _getImageFileName(long splashPtr) { return null; }
+	public static String _getImageJarName(long splashPtr) { return null; }
+	public static bool _setImageData(long splashPtr, byte[] data) { return false; }
+}
+
+static class Java_java_awt_TextArea
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_TextField
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Toolkit
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_TrayIcon
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_Window
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_event_InputEvent
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_event_MouseEvent
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_event_KeyEvent
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_image_ColorModel
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_image_ComponentSampleModel
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_image_Kernel
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_image_Raster
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_image_SinglePixelPackedSampleModel
+{
+	public static void initIDs() { }
+}
+
+static class Java_java_awt_image_SampleModel
+{
+	public static void initIDs() { }
+}
diff --git a/external/ikvm/runtime/openjdk/sun.nio.ch.cs b/external/ikvm/runtime/openjdk/sun.nio.ch.cs
index c135449..7b5258f 100644
--- a/external/ikvm/runtime/openjdk/sun.nio.ch.cs
+++ b/external/ikvm/runtime/openjdk/sun.nio.ch.cs
@@ -34,7 +34,7 @@ static class Java_sun_nio_ch_DatagramChannelImpl
 	{
 	}
 
-	public static void disconnect0(FileDescriptor fd)
+	public static void disconnect0(FileDescriptor fd, bool isIPv6)
 	{
 #if !FIRST_PASS
 		try
@@ -120,15 +120,14 @@ static class Java_sun_nio_ch_DatagramChannelImpl
 #endif
 	}
 
-	public static int send0(object obj, bool preferIPv6, FileDescriptor fd, byte[] buf, int pos, int len, object sa)
+	public static int send0(object obj, bool preferIPv6, FileDescriptor fd, byte[] buf, int pos, int len, InetAddress addr, int port)
 	{
 #if FIRST_PASS
 		return 0;
 #else
-		java.net.InetSocketAddress addr = (java.net.InetSocketAddress)sa;
 		try
 		{
-			return fd.getSocket().SendTo(buf, pos, len, System.Net.Sockets.SocketFlags.None, new System.Net.IPEndPoint(java.net.SocketUtil.getAddressFromInetAddress(addr.getAddress(), preferIPv6), addr.getPort()));
+			return fd.getSocket().SendTo(buf, pos, len, System.Net.Sockets.SocketFlags.None, new System.Net.IPEndPoint(java.net.SocketUtil.getAddressFromInetAddress(addr, preferIPv6), port));
 		}
 		catch (System.Net.Sockets.SocketException x)
 		{
@@ -409,7 +408,14 @@ namespace IKVM.NativeCode.sun.nio.ch
 			}
 			catch (System.Net.Sockets.SocketException x)
 			{
-				throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x);
+				if (x.ErrorCode == global::java.net.SocketUtil.WSAEWOULDBLOCK)
+				{
+					count = 0;
+				}
+				else
+				{
+					throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x);
+				}
 			}
 			catch (ObjectDisposedException)
 			{
@@ -469,7 +475,14 @@ namespace IKVM.NativeCode.sun.nio.ch
 			}
 			catch (System.Net.Sockets.SocketException x)
 			{
-				throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x);
+				if (x.ErrorCode == global::java.net.SocketUtil.WSAEWOULDBLOCK)
+				{
+					count = 0;
+				}
+				else
+				{
+					throw global::java.net.SocketUtil.convertSocketExceptionToIOException(x);
+				}
 			}
 			catch (ObjectDisposedException)
 			{
@@ -507,6 +520,13 @@ namespace IKVM.NativeCode.sun.nio.ch
 				&& Environment.OSVersion.Version.Major >= 6;
 		}
 
+		public static int isExclusiveBindAvailable()
+		{
+			return Environment.OSVersion.Platform == PlatformID.Win32NT
+				? Environment.OSVersion.Version.Major >= 6 ? 1 : 0
+				: -1;
+		}
+
 		public static bool canIPv6SocketJoinIPv4Group0()
 		{
 			return false;
@@ -971,11 +991,16 @@ namespace IKVM.NativeCode.sun.nio.ch
 #endif
 		}
 
-		public static void bind0(bool preferIPv6, FileDescriptor fd, InetAddress addr, int port)
+		public static void bind0(FileDescriptor fd, bool preferIPv6, bool useExclBind, InetAddress addr, int port)
 		{
 #if !FIRST_PASS
 			try
 			{
+				if (useExclBind)
+				{
+					// TODO enable this after we merge OpenJDK 7u40
+					//global::java.net.net_util_md.setExclusiveBind(fd.getSocket());
+				}
 				fd.getSocket().Bind(new System.Net.IPEndPoint(global::java.net.SocketUtil.getAddressFromInetAddress(addr, preferIPv6), port));
 			}
 			catch (System.Net.Sockets.SocketException x)
diff --git a/external/ikvm/runtime/openjdk/sun.reflect.cs b/external/ikvm/runtime/openjdk/sun.reflect.cs
new file mode 100644
index 0000000..a80d4f3
--- /dev/null
+++ b/external/ikvm/runtime/openjdk/sun.reflect.cs
@@ -0,0 +1,2293 @@
+/*
+  Copyright (C) 2007-2013 Jeroen Frijters
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jeroen Frijters
+  jeroen at frijters.net
+  
+*/
+using System;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System.Reflection;
+#if !NO_REF_EMIT
+using System.Reflection.Emit;
+#endif
+using System.Runtime.CompilerServices;
+using System.Runtime.Serialization;
+using System.Security;
+using IKVM.Internal;
+
+namespace IKVM.Internal
+{
+#if !FIRST_PASS
+	public interface IReflectionException
+	{
+		java.lang.IllegalArgumentException GetIllegalArgumentException(object obj);
+		java.lang.IllegalArgumentException SetIllegalArgumentException(object obj);
+	}
+#endif
+
+	sealed class State
+	{
+		internal int Value;
+	}
+}
+
+static class Java_sun_reflect_Reflection
+{
+#if CLASSGC
+	private static readonly ConditionalWeakTable<MethodBase, State> isHideFromJavaCache = new ConditionalWeakTable<MethodBase, State>();
+
+	internal static bool IsHideFromJava(MethodBase mb)
+	{
+		State state = isHideFromJavaCache.GetValue(mb, delegate { return new State(); });
+		if (state.Value == 0)
+		{
+			state.Value = IsHideFromJavaImpl(mb);
+		}
+		return state.Value == 1;
+	}
+
+	private static int IsHideFromJavaImpl(MethodBase mb)
+	{
+		if (mb.Name.StartsWith("__<", StringComparison.Ordinal))
+		{
+			return 1;
+		}
+		if (mb.IsDefined(typeof(IKVM.Attributes.HideFromJavaAttribute), false) || mb.IsDefined(typeof(IKVM.Attributes.HideFromReflectionAttribute), false))
+		{
+			return 1;
+		}
+		return 2;
+	}
+#else
+	private static readonly Dictionary<RuntimeMethodHandle, bool> isHideFromJavaCache = new Dictionary<RuntimeMethodHandle, bool>();
+
+	internal static bool IsHideFromJava(MethodBase mb)
+	{
+		if (mb.Name.StartsWith("__<", StringComparison.Ordinal))
+		{
+			return true;
+		}
+		RuntimeMethodHandle handle;
+		try
+		{
+			handle = mb.MethodHandle;
+		}
+		catch (InvalidOperationException)
+		{
+			// DynamicMethods don't have a RuntimeMethodHandle and we always want to hide them anyway
+			return true;
+		}
+		catch (NotSupportedException)
+		{
+			// DynamicMethods don't have a RuntimeMethodHandle and we always want to hide them anyway
+			return true;
+		}
+		lock (isHideFromJavaCache)
+		{
+			bool cached;
+			if (isHideFromJavaCache.TryGetValue(handle, out cached))
+			{
+				return cached;
+			}
+		}
+		bool isHide = mb.IsDefined(typeof(IKVM.Attributes.HideFromJavaAttribute), false) || mb.IsDefined(typeof(IKVM.Attributes.HideFromReflectionAttribute), false);
+		lock (isHideFromJavaCache)
+		{
+			isHideFromJavaCache[handle] = isHide;
+		}
+		return isHide;
+	}
+#endif
+
+	// NOTE this method is hooked up explicitly through map.xml to prevent inlining of the native stub
+	// and tail-call optimization in the native stub.
+	public static object getCallerClass(int realFramesToSkip)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		int i = 3;
+		if (realFramesToSkip <= 1)
+		{
+			i = 1;
+			realFramesToSkip = Math.Max(realFramesToSkip + 2, 2);
+		}
+		realFramesToSkip--;
+		for (; ; )
+		{
+			MethodBase method = new StackFrame(i++, false).GetMethod();
+			if (method == null)
+			{
+				return null;
+			}
+			Type type = method.DeclaringType;
+			// NOTE these checks should be the same as the ones in SecurityManager.getClassContext
+			if (IsHideFromJava(method)
+				|| type == null
+				|| type.Assembly == typeof(object).Assembly
+				|| type.Assembly == typeof(Java_sun_reflect_Reflection).Assembly
+				|| type.Assembly == Java_java_lang_SecurityManager.jniAssembly
+				|| type == typeof(java.lang.reflect.Method)
+				|| type == typeof(java.lang.reflect.Constructor))
+			{
+				continue;
+			}
+			if (--realFramesToSkip == 0)
+			{
+				return ClassLoaderWrapper.GetWrapperFromType(type).ClassObject;
+			}
+		}
+#endif
+	}
+
+	public static int getClassAccessFlags(java.lang.Class clazz)
+	{
+		// the mask comes from JVM_RECOGNIZED_CLASS_MODIFIERS in src/hotspot/share/vm/prims/jvm.h
+		int mods = (int)TypeWrapper.FromClass(clazz).Modifiers & 0x7631;
+		// interface implies abstract
+		mods |= (mods & 0x0200) << 1;
+		return mods;
+	}
+
+	public static bool checkInternalAccess(java.lang.Class currentClass, java.lang.Class memberClass)
+	{
+		TypeWrapper current = TypeWrapper.FromClass(currentClass);
+		TypeWrapper member = TypeWrapper.FromClass(memberClass);
+		return member.IsInternal && member.InternalsVisibleTo(current);
+	}
+}
+
+static class Java_sun_reflect_ReflectionFactory
+{
+#if !FIRST_PASS
+	private static object ConvertPrimitive(TypeWrapper tw, object value)
+	{
+		if (tw == PrimitiveTypeWrapper.BOOLEAN)
+		{
+			if (value is java.lang.Boolean)
+			{
+				return ((java.lang.Boolean)value).booleanValue();
+			}
+		}
+		else if (tw == PrimitiveTypeWrapper.BYTE)
+		{
+			if (value is java.lang.Byte)
+			{
+				return ((java.lang.Byte)value).byteValue();
+			}
+		}
+		else if (tw == PrimitiveTypeWrapper.CHAR)
+		{
+			if (value is java.lang.Character)
+			{
+				return ((java.lang.Character)value).charValue();
+			}
+		}
+		else if (tw == PrimitiveTypeWrapper.SHORT)
+		{
+			if (value is java.lang.Short || value is java.lang.Byte)
+			{
+				return ((java.lang.Number)value).shortValue();
+			}
+		}
+		else if (tw == PrimitiveTypeWrapper.INT)
+		{
+			if (value is java.lang.Integer || value is java.lang.Short || value is java.lang.Byte)
+			{
+				return ((java.lang.Number)value).intValue();
+			}
+			else if (value is java.lang.Character)
+			{
+				return (int)((java.lang.Character)value).charValue();
+			}
+		}
+		else if (tw == PrimitiveTypeWrapper.LONG)
+		{
+			if (value is java.lang.Long || value is java.lang.Integer || value is java.lang.Short || value is java.lang.Byte)
+			{
+				return ((java.lang.Number)value).longValue();
+			}
+			else if (value is java.lang.Character)
+			{
+				return (long)((java.lang.Character)value).charValue();
+			}
+		}
+		else if (tw == PrimitiveTypeWrapper.FLOAT)
+		{
+			if (value is java.lang.Float || value is java.lang.Long || value is java.lang.Integer || value is java.lang.Short || value is java.lang.Byte)
+			{
+				return ((java.lang.Number)value).floatValue();
+			}
+			else if (value is java.lang.Character)
+			{
+				return (float)((java.lang.Character)value).charValue();
+			}
+		}
+		else if (tw == PrimitiveTypeWrapper.DOUBLE)
+		{
+			if (value is java.lang.Double || value is java.lang.Float || value is java.lang.Long || value is java.lang.Integer || value is java.lang.Short || value is java.lang.Byte)
+			{
+				return ((java.lang.Number)value).doubleValue();
+			}
+			else if (value is java.lang.Character)
+			{
+				return (double)((java.lang.Character)value).charValue();
+			}
+		}
+		throw new java.lang.IllegalArgumentException();
+	}
+
+	private static object[] ConvertArgs(ClassLoaderWrapper loader, TypeWrapper[] argumentTypes, object[] args)
+	{
+		object[] nargs = new object[args == null ? 0 : args.Length];
+		if (nargs.Length != argumentTypes.Length)
+		{
+			throw new java.lang.IllegalArgumentException("wrong number of arguments");
+		}
+		for (int i = 0; i < nargs.Length; i++)
+		{
+			if (argumentTypes[i].IsPrimitive)
+			{
+				nargs[i] = ConvertPrimitive(argumentTypes[i], args[i]);
+			}
+			else
+			{
+				if (args[i] != null && !argumentTypes[i].EnsureLoadable(loader).IsInstance(args[i]))
+				{
+					throw new java.lang.IllegalArgumentException();
+				}
+				nargs[i] = argumentTypes[i].GhostWrap(args[i]);
+			}
+		}
+		return nargs;
+	}
+
+	private sealed class MethodAccessorImpl : sun.reflect.MethodAccessor
+	{
+		private readonly MethodWrapper mw;
+
+		internal MethodAccessorImpl(MethodWrapper mw)
+		{
+			this.mw = mw;
+			mw.Link();
+			mw.ResolveMethod();
+		}
+
+		[IKVM.Attributes.HideFromJava]
+		public object invoke(object obj, object[] args, ikvm. at internal.CallerID callerID)
+		{
+			if (!mw.IsStatic && !mw.DeclaringType.IsInstance(obj))
+			{
+				if (obj == null)
+				{
+					throw new java.lang.NullPointerException();
+				}
+				throw new java.lang.IllegalArgumentException("object is not an instance of declaring class");
+			}
+			args = ConvertArgs(mw.DeclaringType.GetClassLoader(), mw.GetParameters(), args);
+			// if the method is an interface method, we must explicitly run <clinit>,
+			// because .NET reflection doesn't
+			if (mw.DeclaringType.IsInterface)
+			{
+				mw.DeclaringType.RunClassInit();
+			}
+			if (mw.HasCallerID)
+			{
+				args = ArrayUtil.Concat(args, callerID);
+			}
+			object retval;
+			try
+			{
+				retval = mw.Invoke(obj, args);
+			}
+			catch (Exception x)
+			{
+				throw new java.lang.reflect.InvocationTargetException(ikvm.runtime.Util.mapException(x));
+			}
+			if (mw.ReturnType.IsPrimitive && mw.ReturnType != PrimitiveTypeWrapper.VOID)
+			{
+				retval = JVM.Box(retval);
+			}
+			else
+			{
+				retval = mw.ReturnType.GhostUnwrap(retval);
+			}
+			return retval;
+		}
+	}
+
+	private sealed class ConstructorAccessorImpl : sun.reflect.ConstructorAccessor
+	{
+		private readonly MethodWrapper mw;
+
+		internal ConstructorAccessorImpl(MethodWrapper mw)
+		{
+			this.mw = mw;
+			mw.Link();
+			mw.ResolveMethod();
+		}
+
+		[IKVM.Attributes.HideFromJava]
+		public object newInstance(object[] args)
+		{
+			args = ConvertArgs(mw.DeclaringType.GetClassLoader(), mw.GetParameters(), args);
+			try
+			{
+				return mw.CreateInstance(args);
+			}
+			catch (Exception x)
+			{
+				throw new java.lang.reflect.InvocationTargetException(ikvm.runtime.Util.mapException(x));
+			}
+		}
+	}
+
+	private sealed class SerializationConstructorAccessorImpl : sun.reflect.ConstructorAccessor
+	{
+		private readonly MethodWrapper mw;
+		private readonly Type type;
+
+		internal SerializationConstructorAccessorImpl(java.lang.reflect.Constructor constructorToCall, java.lang.Class classToInstantiate)
+		{
+			this.type = TypeWrapper.FromClass(classToInstantiate).TypeAsBaseType;
+			MethodWrapper mw = MethodWrapper.FromConstructor(constructorToCall);
+			if (mw.DeclaringType != CoreClasses.java.lang.Object.Wrapper)
+			{
+				this.mw = mw;
+				mw.Link();
+				mw.ResolveMethod();
+			}
+		}
+
+		[IKVM.Attributes.HideFromJava]
+		[SecuritySafeCritical]
+		public object newInstance(object[] args)
+		{
+			object obj = FormatterServices.GetUninitializedObject(type);
+			if (mw != null)
+			{
+				mw.Invoke(obj, ConvertArgs(mw.DeclaringType.GetClassLoader(), mw.GetParameters(), args));
+			}
+			return obj;
+		}
+	}
+
+#if !NO_REF_EMIT
+	private sealed class BoxUtil
+	{
+		private static readonly MethodInfo valueOfByte = typeof(java.lang.Byte).GetMethod("valueOf", new Type[] { typeof(byte) });
+		private static readonly MethodInfo valueOfBoolean = typeof(java.lang.Boolean).GetMethod("valueOf", new Type[] { typeof(bool) });
+		private static readonly MethodInfo valueOfChar = typeof(java.lang.Character).GetMethod("valueOf", new Type[] { typeof(char) });
+		private static readonly MethodInfo valueOfShort = typeof(java.lang.Short).GetMethod("valueOf", new Type[] { typeof(short) });
+		private static readonly MethodInfo valueOfInt = typeof(java.lang.Integer).GetMethod("valueOf", new Type[] { typeof(int) });
+		private static readonly MethodInfo valueOfFloat = typeof(java.lang.Float).GetMethod("valueOf", new Type[] { typeof(float) });
+		private static readonly MethodInfo valueOfLong = typeof(java.lang.Long).GetMethod("valueOf", new Type[] { typeof(long) });
+		private static readonly MethodInfo valueOfDouble = typeof(java.lang.Double).GetMethod("valueOf", new Type[] { typeof(double) });
+		private static readonly MethodInfo byteValue = typeof(java.lang.Byte).GetMethod("byteValue", Type.EmptyTypes);
+		private static readonly MethodInfo booleanValue = typeof(java.lang.Boolean).GetMethod("booleanValue", Type.EmptyTypes);
+		private static readonly MethodInfo charValue = typeof(java.lang.Character).GetMethod("charValue", Type.EmptyTypes);
+		private static readonly MethodInfo shortValue = typeof(java.lang.Short).GetMethod("shortValue", Type.EmptyTypes);
+		private static readonly MethodInfo intValue = typeof(java.lang.Integer).GetMethod("intValue", Type.EmptyTypes);
+		private static readonly MethodInfo floatValue = typeof(java.lang.Float).GetMethod("floatValue", Type.EmptyTypes);
+		private static readonly MethodInfo longValue = typeof(java.lang.Long).GetMethod("longValue", Type.EmptyTypes);
+		private static readonly MethodInfo doubleValue = typeof(java.lang.Double).GetMethod("doubleValue", Type.EmptyTypes);
+
+		internal static void EmitUnboxArg(CodeEmitter ilgen, TypeWrapper type)
+		{
+			if (type == PrimitiveTypeWrapper.BYTE)
+			{
+				ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Byte));
+				ilgen.Emit(OpCodes.Call, byteValue);
+			}
+			else if (type == PrimitiveTypeWrapper.BOOLEAN)
+			{
+				ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Boolean));
+				ilgen.Emit(OpCodes.Call, booleanValue);
+			}
+			else if (type == PrimitiveTypeWrapper.CHAR)
+			{
+				ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Character));
+				ilgen.Emit(OpCodes.Call, charValue);
+			}
+			else if (type == PrimitiveTypeWrapper.SHORT
+				|| type == PrimitiveTypeWrapper.INT
+				|| type == PrimitiveTypeWrapper.FLOAT
+				|| type == PrimitiveTypeWrapper.LONG
+				|| type == PrimitiveTypeWrapper.DOUBLE)
+			{
+				ilgen.Emit(OpCodes.Dup);
+				ilgen.Emit(OpCodes.Isinst, typeof(java.lang.Byte));
+				CodeEmitterLabel next = ilgen.DefineLabel();
+				ilgen.EmitBrfalse(next);
+				ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Byte));
+				ilgen.Emit(OpCodes.Call, byteValue);
+				ilgen.Emit(OpCodes.Conv_I1);
+				Expand(ilgen, type);
+				CodeEmitterLabel done = ilgen.DefineLabel();
+				ilgen.EmitBr(done);
+				ilgen.MarkLabel(next);
+				if (type == PrimitiveTypeWrapper.SHORT)
+				{
+					ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Short));
+					ilgen.Emit(OpCodes.Call, shortValue);
+				}
+				else
+				{
+					ilgen.Emit(OpCodes.Dup);
+					ilgen.Emit(OpCodes.Isinst, typeof(java.lang.Short));
+					next = ilgen.DefineLabel();
+					ilgen.EmitBrfalse(next);
+					ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Short));
+					ilgen.Emit(OpCodes.Call, shortValue);
+					Expand(ilgen, type);
+					ilgen.EmitBr(done);
+					ilgen.MarkLabel(next);
+					ilgen.Emit(OpCodes.Dup);
+					ilgen.Emit(OpCodes.Isinst, typeof(java.lang.Character));
+					next = ilgen.DefineLabel();
+					ilgen.EmitBrfalse(next);
+					ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Character));
+					ilgen.Emit(OpCodes.Call, charValue);
+					Expand(ilgen, type);
+					ilgen.EmitBr(done);
+					ilgen.MarkLabel(next);
+					if (type == PrimitiveTypeWrapper.INT)
+					{
+						ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Integer));
+						ilgen.Emit(OpCodes.Call, intValue);
+					}
+					else
+					{
+						ilgen.Emit(OpCodes.Dup);
+						ilgen.Emit(OpCodes.Isinst, typeof(java.lang.Integer));
+						next = ilgen.DefineLabel();
+						ilgen.EmitBrfalse(next);
+						ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Integer));
+						ilgen.Emit(OpCodes.Call, intValue);
+						Expand(ilgen, type);
+						ilgen.EmitBr(done);
+						ilgen.MarkLabel(next);
+						if (type == PrimitiveTypeWrapper.LONG)
+						{
+							ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Long));
+							ilgen.Emit(OpCodes.Call, longValue);
+						}
+						else
+						{
+							ilgen.Emit(OpCodes.Dup);
+							ilgen.Emit(OpCodes.Isinst, typeof(java.lang.Long));
+							next = ilgen.DefineLabel();
+							ilgen.EmitBrfalse(next);
+							ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Long));
+							ilgen.Emit(OpCodes.Call, longValue);
+							Expand(ilgen, type);
+							ilgen.EmitBr(done);
+							ilgen.MarkLabel(next);
+							if (type == PrimitiveTypeWrapper.FLOAT)
+							{
+								ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Float));
+								ilgen.Emit(OpCodes.Call, floatValue);
+							}
+							else if (type == PrimitiveTypeWrapper.DOUBLE)
+							{
+								ilgen.Emit(OpCodes.Dup);
+								ilgen.Emit(OpCodes.Isinst, typeof(java.lang.Float));
+								next = ilgen.DefineLabel();
+								ilgen.EmitBrfalse(next);
+								ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Float));
+								ilgen.Emit(OpCodes.Call, floatValue);
+								ilgen.EmitBr(done);
+								ilgen.MarkLabel(next);
+								ilgen.Emit(OpCodes.Castclass, typeof(java.lang.Double));
+								ilgen.Emit(OpCodes.Call, doubleValue);
+							}
+							else
+							{
+								throw new InvalidOperationException();
+							}
+						}
+					}
+				}
+				ilgen.MarkLabel(done);
+			}
+			else
+			{
+				type.EmitCheckcast(ilgen);
+			}
+		}
+
+		internal static void BoxReturnValue(CodeEmitter ilgen, TypeWrapper type)
+		{
+			if (type == PrimitiveTypeWrapper.VOID)
+			{
+				ilgen.Emit(OpCodes.Ldnull);
+			}
+			else if (type == PrimitiveTypeWrapper.BYTE)
+			{
+				ilgen.Emit(OpCodes.Call, valueOfByte);
+			}
+			else if (type == PrimitiveTypeWrapper.BOOLEAN)
+			{
+				ilgen.Emit(OpCodes.Call, valueOfBoolean);
+			}
+			else if (type == PrimitiveTypeWrapper.CHAR)
+			{
+				ilgen.Emit(OpCodes.Call, valueOfChar);
+			}
+			else if (type == PrimitiveTypeWrapper.SHORT)
+			{
+				ilgen.Emit(OpCodes.Call, valueOfShort);
+			}
+			else if (type == PrimitiveTypeWrapper.INT)
+			{
+				ilgen.Emit(OpCodes.Call, valueOfInt);
+			}
+			else if (type == PrimitiveTypeWrapper.FLOAT)
+			{
+				ilgen.Emit(OpCodes.Call, valueOfFloat);
+			}
+			else if (type == PrimitiveTypeWrapper.LONG)
+			{
+				ilgen.Emit(OpCodes.Call, valueOfLong);
+			}
+			else if (type == PrimitiveTypeWrapper.DOUBLE)
+			{
+				ilgen.Emit(OpCodes.Call, valueOfDouble);
+			}
+		}
+
+		private static void Expand(CodeEmitter ilgen, TypeWrapper type)
+		{
+			if (type == PrimitiveTypeWrapper.FLOAT)
+			{
+				ilgen.Emit(OpCodes.Conv_R4);
+			}
+			else if (type == PrimitiveTypeWrapper.LONG)
+			{
+				ilgen.Emit(OpCodes.Conv_I8);
+			}
+			else if (type == PrimitiveTypeWrapper.DOUBLE)
+			{
+				ilgen.Emit(OpCodes.Conv_R8);
+			}
+		}
+	}
+
+	private sealed class FastMethodAccessorImpl : sun.reflect.MethodAccessor
+	{
+		internal static readonly ConstructorInfo invocationTargetExceptionCtor;
+		internal static readonly ConstructorInfo illegalArgumentExceptionCtor;
+		internal static readonly MethodInfo get_TargetSite;
+		internal static readonly MethodInfo GetCurrentMethod;
+
+		private delegate object Invoker(object obj, object[] args, ikvm. at internal.CallerID callerID);
+		private Invoker invoker;
+
+		static FastMethodAccessorImpl()
+		{
+			invocationTargetExceptionCtor = typeof(java.lang.reflect.InvocationTargetException).GetConstructor(new Type[] { typeof(Exception) });
+			illegalArgumentExceptionCtor = typeof(java.lang.IllegalArgumentException).GetConstructor(Type.EmptyTypes);
+			get_TargetSite = typeof(Exception).GetMethod("get_TargetSite");
+			GetCurrentMethod = typeof(MethodBase).GetMethod("GetCurrentMethod");
+		}
+
+		private sealed class RunClassInit
+		{
+			private FastMethodAccessorImpl outer;
+			private TypeWrapper tw;
+			private Invoker invoker;
+
+			internal RunClassInit(FastMethodAccessorImpl outer, TypeWrapper tw, Invoker invoker)
+			{
+				this.outer = outer;
+				this.tw = tw;
+				this.invoker = invoker;
+			}
+
+			[IKVM.Attributes.HideFromJava]
+			internal object invoke(object obj, object[] args, ikvm. at internal.CallerID callerID)
+			{
+				// FXBUG pre-SP1 a DynamicMethod that calls a static method doesn't trigger the cctor, so we do that explicitly.
+				// even on .NET 2.0 SP2, interface method invocations don't run the interface cctor
+				// NOTE when testing, please test both the x86 and x64 CLR JIT, because they have different bugs (even on .NET 2.0 SP2)
+				tw.RunClassInit();
+				outer.invoker = invoker;
+				return invoker(obj, args, callerID);
+			}
+		}
+
+		internal FastMethodAccessorImpl(MethodWrapper mw)
+		{
+			TypeWrapper[] parameters;
+			try
+			{
+				mw.DeclaringType.Finish();
+				parameters = mw.GetParameters();
+				for (int i = 0; i < parameters.Length; i++)
+				{
+					// the EnsureLoadable shouldn't fail, because we don't allow a java.lang.reflect.Method
+					// to "escape" if it has an unloadable type in the signature
+					parameters[i] = parameters[i].EnsureLoadable(mw.DeclaringType.GetClassLoader());
+					parameters[i].Finish();
+				}
+			}
+			catch (RetargetableJavaException x)
+			{
+				throw x.ToJava();
+			}
+			mw.ResolveMethod();
+			DynamicMethod dm = DynamicMethodUtils.Create("__<Invoker>", mw.DeclaringType.TypeAsBaseType, !mw.IsPublic || !mw.DeclaringType.IsPublic, typeof(object), new Type[] { typeof(object), typeof(object[]), typeof(ikvm. at internal.CallerID) });
+			CodeEmitter ilgen = CodeEmitter.Create(dm);
+			CodeEmitterLocal ret = ilgen.DeclareLocal(typeof(object));
+			if (!mw.IsStatic)
+			{
+				// check target for null
+				ilgen.Emit(OpCodes.Ldarg_0);
+				ilgen.EmitNullCheck();
+			}
+
+			// check args length
+			CodeEmitterLabel argsLengthOK = ilgen.DefineLabel();
+			if (parameters.Length == 0)
+			{
+				// zero length array may be null
+				ilgen.Emit(OpCodes.Ldarg_1);
+				ilgen.EmitBrfalse(argsLengthOK);
+			}
+			ilgen.Emit(OpCodes.Ldarg_1);
+			ilgen.Emit(OpCodes.Ldlen);
+			ilgen.EmitLdc_I4(parameters.Length);
+			ilgen.EmitBeq(argsLengthOK);
+			ilgen.Emit(OpCodes.Newobj, illegalArgumentExceptionCtor);
+			ilgen.Emit(OpCodes.Throw);
+			ilgen.MarkLabel(argsLengthOK);
+
+			int thisCount = mw.IsStatic ? 0 : 1;
+			CodeEmitterLocal[] args = new CodeEmitterLocal[parameters.Length + thisCount];
+			if (!mw.IsStatic)
+			{
+				args[0] = ilgen.DeclareLocal(mw.DeclaringType.TypeAsSignatureType);
+			}
+			for (int i = thisCount; i < args.Length; i++)
+			{
+				args[i] = ilgen.DeclareLocal(parameters[i - thisCount].TypeAsSignatureType);
+			}
+			ilgen.BeginExceptionBlock();
+			if (!mw.IsStatic)
+			{
+				ilgen.Emit(OpCodes.Ldarg_0);
+				mw.DeclaringType.EmitCheckcast(ilgen);
+				mw.DeclaringType.EmitConvStackTypeToSignatureType(ilgen, null);
+				ilgen.Emit(OpCodes.Stloc, args[0]);
+			}
+			for (int i = thisCount; i < args.Length; i++)
+			{
+				ilgen.Emit(OpCodes.Ldarg_1);
+				ilgen.EmitLdc_I4(i - thisCount);
+				ilgen.Emit(OpCodes.Ldelem_Ref);
+				TypeWrapper tw = parameters[i - thisCount];
+				BoxUtil.EmitUnboxArg(ilgen, tw);
+				tw.EmitConvStackTypeToSignatureType(ilgen, null);
+				ilgen.Emit(OpCodes.Stloc, args[i]);
+			}
+			CodeEmitterLabel label1 = ilgen.DefineLabel();
+			ilgen.EmitLeave(label1);
+			ilgen.BeginCatchBlock(typeof(InvalidCastException));
+			ilgen.Emit(OpCodes.Newobj, illegalArgumentExceptionCtor);
+			ilgen.Emit(OpCodes.Throw);
+			ilgen.BeginCatchBlock(typeof(NullReferenceException));
+			ilgen.Emit(OpCodes.Newobj, illegalArgumentExceptionCtor);
+			ilgen.Emit(OpCodes.Throw);
+			ilgen.EndExceptionBlock();
+
+			// this is the actual call
+			ilgen.MarkLabel(label1);
+			ilgen.BeginExceptionBlock();
+			for (int i = 0; i < args.Length; i++)
+			{
+				if (i == 0 && !mw.IsStatic && (mw.DeclaringType.IsNonPrimitiveValueType || mw.DeclaringType.IsGhost))
+				{
+					ilgen.Emit(OpCodes.Ldloca, args[i]);
+				}
+				else
+				{
+					ilgen.Emit(OpCodes.Ldloc, args[i]);
+				}
+			}
+			if (mw.HasCallerID)
+			{
+				ilgen.Emit(OpCodes.Ldarg_2);
+			}
+			if (mw.IsStatic)
+			{
+				mw.EmitCall(ilgen);
+			}
+			else
+			{
+				mw.EmitCallvirtReflect(ilgen);
+			}
+			mw.ReturnType.EmitConvSignatureTypeToStackType(ilgen);
+			BoxUtil.BoxReturnValue(ilgen, mw.ReturnType);
+			ilgen.Emit(OpCodes.Stloc, ret);
+			CodeEmitterLabel label2 = ilgen.DefineLabel();
+			ilgen.EmitLeave(label2);
+			ilgen.BeginCatchBlock(typeof(Exception));
+			CodeEmitterLabel label = ilgen.DefineLabel();
+			CodeEmitterLabel labelWrap = ilgen.DefineLabel();
+			// If the exception we caught is a java.lang.reflect.InvocationTargetException, we know it must be
+			// wrapped, because .NET won't throw that exception and we also cannot check the target site,
+			// because it may be the same as us if a method is recursively invoking itself.
+			ilgen.Emit(OpCodes.Dup);
+			ilgen.Emit(OpCodes.Isinst, typeof(java.lang.reflect.InvocationTargetException));
+			ilgen.EmitBrtrue(labelWrap);
+			ilgen.Emit(OpCodes.Dup);
+			ilgen.Emit(OpCodes.Callvirt, get_TargetSite);
+			ilgen.Emit(OpCodes.Call, GetCurrentMethod);
+			ilgen.Emit(OpCodes.Ceq);
+			ilgen.EmitBrtrue(label);
+			ilgen.MarkLabel(labelWrap);
+			ilgen.Emit(OpCodes.Ldc_I4_0);
+			ilgen.Emit(OpCodes.Call, ByteCodeHelperMethods.mapException.MakeGenericMethod(Types.Exception));
+			ilgen.Emit(OpCodes.Newobj, invocationTargetExceptionCtor);
+			ilgen.MarkLabel(label);
+			ilgen.Emit(OpCodes.Throw);
+			ilgen.EndExceptionBlock();
+
+			ilgen.MarkLabel(label2);
+			ilgen.Emit(OpCodes.Ldloc, ret);
+			ilgen.Emit(OpCodes.Ret);
+			ilgen.DoEmit();
+			invoker = (Invoker)dm.CreateDelegate(typeof(Invoker));
+			if ((mw.IsStatic || mw.DeclaringType.IsInterface) && mw.DeclaringType.HasStaticInitializer)
+			{
+				invoker = new Invoker(new RunClassInit(this, mw.DeclaringType, invoker).invoke);
+			}
+		}
+
+		[IKVM.Attributes.HideFromJava]
+		public object invoke(object obj, object[] args, ikvm. at internal.CallerID callerID)
+		{
+			try
+			{
+				return invoker(obj, args, callerID);
+			}
+			catch (MethodAccessException x)
+			{
+				// this can happen if we're calling a non-public method and the call stack doesn't have ReflectionPermission.MemberAccess
+				throw new java.lang.IllegalAccessException().initCause(x);
+			}
+		}
+	}
+
+	private sealed class FastConstructorAccessorImpl : sun.reflect.ConstructorAccessor
+	{
+		private delegate object Invoker(object[] args);
+		private Invoker invoker;
+
+		internal FastConstructorAccessorImpl(java.lang.reflect.Constructor constructor)
+		{
+			MethodWrapper mw = MethodWrapper.FromConstructor(constructor);
+			TypeWrapper[] parameters;
+			try
+			{
+				mw.DeclaringType.Finish();
+				parameters = mw.GetParameters();
+				for (int i = 0; i < parameters.Length; i++)
+				{
+					// the EnsureLoadable shouldn't fail, because we don't allow a java.lang.reflect.Method
+					// to "escape" if it has an unloadable type in the signature
+					parameters[i] = parameters[i].EnsureLoadable(mw.DeclaringType.GetClassLoader());
+					parameters[i].Finish();
+				}
+			}
+			catch (RetargetableJavaException x)
+			{
+				throw x.ToJava();
+			}
+			mw.ResolveMethod();
+			DynamicMethod dm = DynamicMethodUtils.Create("__<Invoker>", mw.DeclaringType.TypeAsTBD, !mw.IsPublic || !mw.DeclaringType.IsPublic, typeof(object), new Type[] { typeof(object[]) });
+			CodeEmitter ilgen = CodeEmitter.Create(dm);
+			CodeEmitterLocal ret = ilgen.DeclareLocal(typeof(object));
+
+			// check args length
+			CodeEmitterLabel argsLengthOK = ilgen.DefineLabel();
+			if (parameters.Length == 0)
+			{
+				// zero length array may be null
+				ilgen.Emit(OpCodes.Ldarg_0);
+				ilgen.EmitBrfalse(argsLengthOK);
+			}
+			ilgen.Emit(OpCodes.Ldarg_0);
+			ilgen.Emit(OpCodes.Ldlen);
+			ilgen.EmitLdc_I4(parameters.Length);
+			ilgen.EmitBeq(argsLengthOK);
+			ilgen.Emit(OpCodes.Newobj, FastMethodAccessorImpl.illegalArgumentExceptionCtor);
+			ilgen.Emit(OpCodes.Throw);
+			ilgen.MarkLabel(argsLengthOK);
+
+			CodeEmitterLocal[] args = new CodeEmitterLocal[parameters.Length];
+			for (int i = 0; i < args.Length; i++)
+			{
+				args[i] = ilgen.DeclareLocal(parameters[i].TypeAsSignatureType);
+			}
+			ilgen.BeginExceptionBlock();
+			for (int i = 0; i < args.Length; i++)
+			{
+				ilgen.Emit(OpCodes.Ldarg_0);
+				ilgen.EmitLdc_I4(i);
+				ilgen.Emit(OpCodes.Ldelem_Ref);
+				TypeWrapper tw = parameters[i];
+				BoxUtil.EmitUnboxArg(ilgen, tw);
+				tw.EmitConvStackTypeToSignatureType(ilgen, null);
+				ilgen.Emit(OpCodes.Stloc, args[i]);
+			}
+			CodeEmitterLabel label1 = ilgen.DefineLabel();
+			ilgen.EmitLeave(label1);
+			ilgen.BeginCatchBlock(typeof(InvalidCastException));
+			ilgen.Emit(OpCodes.Newobj, FastMethodAccessorImpl.illegalArgumentExceptionCtor);
+			ilgen.Emit(OpCodes.Throw);
+			ilgen.BeginCatchBlock(typeof(NullReferenceException));
+			ilgen.Emit(OpCodes.Newobj, FastMethodAccessorImpl.illegalArgumentExceptionCtor);
+			ilgen.Emit(OpCodes.Throw);
+			ilgen.EndExceptionBlock();
+
+			// this is the actual call
+			ilgen.MarkLabel(label1);
+			ilgen.BeginExceptionBlock();
+			for (int i = 0; i < args.Length; i++)
+			{
+				ilgen.Emit(OpCodes.Ldloc, args[i]);
+			}
+			mw.EmitNewobj(ilgen);
+			ilgen.Emit(OpCodes.Stloc, ret);
+			CodeEmitterLabel label2 = ilgen.DefineLabel();
+			ilgen.EmitLeave(label2);
+			ilgen.BeginCatchBlock(typeof(Exception));
+			ilgen.Emit(OpCodes.Dup);
+			ilgen.Emit(OpCodes.Callvirt, FastMethodAccessorImpl.get_TargetSite);
+			ilgen.Emit(OpCodes.Call, FastMethodAccessorImpl.GetCurrentMethod);
+			ilgen.Emit(OpCodes.Ceq);
+			CodeEmitterLabel label = ilgen.DefineLabel();
+			ilgen.EmitBrtrue(label);
+			ilgen.Emit(OpCodes.Ldc_I4_0);
+			ilgen.Emit(OpCodes.Call, ByteCodeHelperMethods.mapException.MakeGenericMethod(Types.Exception));
+			ilgen.Emit(OpCodes.Newobj, FastMethodAccessorImpl.invocationTargetExceptionCtor);
+			ilgen.MarkLabel(label);
+			ilgen.Emit(OpCodes.Throw);
+			ilgen.EndExceptionBlock();
+
+			ilgen.MarkLabel(label2);
+			ilgen.Emit(OpCodes.Ldloc, ret);
+			ilgen.Emit(OpCodes.Ret);
+			ilgen.DoEmit();
+			invoker = (Invoker)dm.CreateDelegate(typeof(Invoker));
+		}
+
+		[IKVM.Attributes.HideFromJava]
+		public object newInstance(object[] args)
+		{
+			try
+			{
+				return invoker(args);
+			}
+			catch (MethodAccessException x)
+			{
+				// this can happen if we're calling a non-public method and the call stack doesn't have ReflectionPermission.MemberAccess
+				throw new java.lang.IllegalAccessException().initCause(x);
+			}
+		}
+	}
+
+	private sealed class FastSerializationConstructorAccessorImpl : sun.reflect.ConstructorAccessor
+	{
+		private static readonly MethodInfo GetTypeFromHandleMethod = typeof(Type).GetMethod("GetTypeFromHandle", new Type[] { typeof(RuntimeTypeHandle) });
+		private static readonly MethodInfo GetUninitializedObjectMethod = typeof(FormatterServices).GetMethod("GetUninitializedObject", new Type[] { typeof(Type) });
+		private delegate object InvokeCtor();
+		private InvokeCtor invoker;
+
+		internal FastSerializationConstructorAccessorImpl(java.lang.reflect.Constructor constructorToCall, java.lang.Class classToInstantiate)
+		{
+			MethodWrapper constructor = MethodWrapper.FromConstructor(constructorToCall);
+			if (constructor.GetParameters().Length != 0)
+			{
+				throw new NotImplementedException("Serialization constructor cannot have parameters");
+			}
+			constructor.Link();
+			constructor.ResolveMethod();
+			Type type;
+			try
+			{
+				TypeWrapper wrapper = TypeWrapper.FromClass(classToInstantiate);
+				wrapper.Finish();
+				type = wrapper.TypeAsBaseType;
+			}
+			catch (RetargetableJavaException x)
+			{
+				throw x.ToJava();
+			}
+			DynamicMethod dm = DynamicMethodUtils.Create("__<SerializationCtor>", constructor.DeclaringType.TypeAsBaseType, true, typeof(object), null);
+			CodeEmitter ilgen = CodeEmitter.Create(dm);
+			ilgen.Emit(OpCodes.Ldtoken, type);
+			ilgen.Emit(OpCodes.Call, GetTypeFromHandleMethod);
+			ilgen.Emit(OpCodes.Call, GetUninitializedObjectMethod);
+			ilgen.Emit(OpCodes.Dup);
+			constructor.EmitCall(ilgen);
+			ilgen.Emit(OpCodes.Ret);
+			ilgen.DoEmit();
+			invoker = (InvokeCtor)dm.CreateDelegate(typeof(InvokeCtor));
+		}
+
+		[IKVM.Attributes.HideFromJava]
+		public object newInstance(object[] args)
+		{
+			try
+			{
+				return invoker();
+			}
+			catch (MethodAccessException x)
+			{
+				// this can happen if we're calling a non-public method and the call stack doesn't have ReflectionPermission.MemberAccess
+				throw new java.lang.IllegalAccessException().initCause(x);
+			}
+		}
+	}
+#endif // !NO_REF_EMIT
+
+	sealed class ActivatorConstructorAccessor : sun.reflect.ConstructorAccessor
+	{
+		private readonly Type type;
+
+		internal ActivatorConstructorAccessor(MethodWrapper mw)
+		{
+			this.type = mw.DeclaringType.TypeAsBaseType;
+		}
+
+		public object newInstance(object[] objarr)
+		{
+			if (objarr != null && objarr.Length != 0)
+			{
+				throw new java.lang.IllegalArgumentException();
+			}
+			try
+			{
+				return Activator.CreateInstance(type);
+			}
+			catch (TargetInvocationException x)
+			{
+				throw new java.lang.reflect.InvocationTargetException(ikvm.runtime.Util.mapException(x.InnerException));
+			}
+		}
+
+		internal static bool IsSuitable(MethodWrapper mw)
+		{
+			MethodBase mb = mw.GetMethod();
+			return mb != null
+				&& mb.IsConstructor
+				&& mb.IsPublic
+				&& mb.DeclaringType.IsPublic
+				&& mb.DeclaringType == mw.DeclaringType.TypeAsBaseType
+				&& mb.GetParameters().Length == 0;
+		}
+	}
+
+	private abstract class FieldAccessorImplBase : sun.reflect.FieldAccessor, IReflectionException
+	{
+		protected static readonly ushort inflationThreshold = 15;
+		protected readonly FieldWrapper fw;
+		protected readonly bool isFinal;
+		protected ushort numInvocations;
+
+		static FieldAccessorImplBase()
+		{
+			string str = java.lang.Props.props.getProperty("ikvm.reflect.field.inflationThreshold");
+			int value;
+			if (str != null && int.TryParse(str, out value))
+			{
+				if (value >= ushort.MinValue && value <= ushort.MaxValue)
+				{
+					inflationThreshold = (ushort)value;
+				}
+			}
+		}
+
+		private FieldAccessorImplBase(FieldWrapper fw, bool overrideAccessCheck)
+		{
+			this.fw = fw;
+			isFinal = (!overrideAccessCheck || fw.IsStatic) && fw.IsFinal;
+		}
+
+		private string GetQualifiedFieldName()
+		{
+			return fw.DeclaringType.Name + "." + fw.Name;
+		}
+
+		private string GetFieldTypeName()
+		{
+			return fw.FieldTypeWrapper.ClassObject.getName();
+		}
+
+		public java.lang.IllegalArgumentException GetIllegalArgumentException(object obj)
+		{
+			// LAME like JDK 6 we return the wrong exception message (talking about setting the field, instead of getting)
+			return SetIllegalArgumentException(obj);
+		}
+
+		public java.lang.IllegalArgumentException SetIllegalArgumentException(object obj)
+		{
+			// LAME like JDK 6 we return the wrong exception message (when obj is the object, instead of the value)
+			return SetIllegalArgumentException(obj != null ? ikvm.runtime.Util.getClassFromObject(obj).getName() : "", "");
+		}
+
+		private java.lang.IllegalArgumentException SetIllegalArgumentException(string attemptedType, string attemptedValue)
+		{
+			return new java.lang.IllegalArgumentException(GetSetMessage(attemptedType, attemptedValue));
+		}
+
+		protected java.lang.IllegalAccessException FinalFieldIllegalAccessException(object obj)
+		{
+			return FinalFieldIllegalAccessException(obj != null ? ikvm.runtime.Util.getClassFromObject(obj).getName() : "", "");
+		}
+
+		private java.lang.IllegalAccessException FinalFieldIllegalAccessException(string attemptedType, string attemptedValue)
+		{
+			return new java.lang.IllegalAccessException(GetSetMessage(attemptedType, attemptedValue));
+		}
+
+		private java.lang.IllegalArgumentException GetIllegalArgumentException(string type)
+		{
+			return new java.lang.IllegalArgumentException("Attempt to get " + GetFieldTypeName() + " field \"" + GetQualifiedFieldName() + "\" with illegal data type conversion to " + type);
+		}
+
+		// this message comes from sun.reflect.UnsafeFieldAccessorImpl
+		private string GetSetMessage(String attemptedType, String attemptedValue)
+		{
+			String err = "Can not set";
+			if (fw.IsStatic)
+				err += " static";
+			if (isFinal)
+				err += " final";
+			err += " " + GetFieldTypeName() + " field " + GetQualifiedFieldName() + " to ";
+			if (attemptedValue.Length > 0)
+			{
+				err += "(" + attemptedType + ")" + attemptedValue;
+			}
+			else
+			{
+				if (attemptedType.Length > 0)
+					err += attemptedType;
+				else
+					err += "null value";
+			}
+			return err;
+		}
+
+		public virtual bool getBoolean(object obj)
+		{
+			throw GetIllegalArgumentException("boolean");
+		}
+
+		public virtual byte getByte(object obj)
+		{
+			throw GetIllegalArgumentException("byte");
+		}
+
+		public virtual char getChar(object obj)
+		{
+			throw GetIllegalArgumentException("char");
+		}
+
+		public virtual short getShort(object obj)
+		{
+			throw GetIllegalArgumentException("short");
+		}
+
+		public virtual int getInt(object obj)
+		{
+			throw GetIllegalArgumentException("int");
+		}
+
+		public virtual long getLong(object obj)
+		{
+			throw GetIllegalArgumentException("long");
+		}
+
+		public virtual float getFloat(object obj)
+		{
+			throw GetIllegalArgumentException("float");
+		}
+
+		public virtual double getDouble(object obj)
+		{
+			throw GetIllegalArgumentException("double");
+		}
+
+		public virtual void setBoolean(object obj, bool z)
+		{
+			throw SetIllegalArgumentException("boolean", java.lang.Boolean.toString(z));
+		}
+
+		public virtual void setByte(object obj, byte b)
+		{
+			throw SetIllegalArgumentException("byte", java.lang.Byte.toString(b));
+		}
+
+		public virtual void setChar(object obj, char c)
+		{
+			throw SetIllegalArgumentException("char", java.lang.Character.toString(c));
+		}
+
+		public virtual void setShort(object obj, short s)
+		{
+			throw SetIllegalArgumentException("short", java.lang.Short.toString(s));
+		}
+
+		public virtual void setInt(object obj, int i)
+		{
+			throw SetIllegalArgumentException("int", java.lang.Integer.toString(i));
+		}
+
+		public virtual void setLong(object obj, long l)
+		{
+			throw SetIllegalArgumentException("long", java.lang.Long.toString(l));
+		}
+
+		public virtual void setFloat(object obj, float f)
+		{
+			throw SetIllegalArgumentException("float", java.lang.Float.toString(f));
+		}
+
+		public virtual void setDouble(object obj, double d)
+		{
+			throw SetIllegalArgumentException("double", java.lang.Double.toString(d));
+		}
+
+		public abstract object get(object obj);
+		public abstract void set(object obj, object value);
+
+		private abstract class FieldAccessor<T> : FieldAccessorImplBase
+		{
+			protected delegate void Setter(object obj, T value, FieldAccessor<T> acc);
+			protected delegate T Getter(object obj, FieldAccessor<T> acc);
+			private static readonly Setter initialSetter = lazySet;
+			private static readonly Getter initialGetter = lazyGet;
+			protected Setter setter = initialSetter;
+			protected Getter getter = initialGetter;
+
+			internal FieldAccessor(FieldWrapper fw, bool overrideAccessCheck)
+				: base(fw, overrideAccessCheck)
+			{
+				if (!IsSlowPathCompatible(fw))
+				{
+					// prevent slow path
+					numInvocations = inflationThreshold;
+				}
+			}
+
+			private bool IsSlowPathCompatible(FieldWrapper fw)
+			{
+#if !NO_REF_EMIT
+				if (fw.IsVolatile && (fw.FieldTypeWrapper == PrimitiveTypeWrapper.LONG || fw.FieldTypeWrapper == PrimitiveTypeWrapper.DOUBLE))
+				{
+					return false;
+				}
+#endif
+				fw.Link();
+				return true;
+			}
+
+			private static T lazyGet(object obj, FieldAccessor<T> acc)
+			{
+				return acc.lazyGet(obj);
+			}
+
+			private static void lazySet(object obj, T value, FieldAccessor<T> acc)
+			{
+				acc.lazySet(obj, value);
+			}
+
+			private T lazyGet(object obj)
+			{
+#if !NO_REF_EMIT
+				if (numInvocations >= inflationThreshold)
+				{
+					// FXBUG it appears that a ldsfld/stsfld in a DynamicMethod doesn't trigger the class constructor
+					// and if we didn't use the slow path, we haven't yet initialized the class
+					fw.DeclaringType.RunClassInit();
+					getter = (Getter)GenerateFastGetter(typeof(Getter), typeof(T), fw);
+					return getter(obj, this);
+				}
+#endif // !NO_REF_EMIT
+				if (fw.IsStatic)
+				{
+					obj = null;
+				}
+				else if (obj == null)
+				{
+					throw new java.lang.NullPointerException();
+				}
+				else if (!fw.DeclaringType.IsInstance(obj))
+				{
+					throw GetIllegalArgumentException(obj);
+				}
+				else if (fw.DeclaringType.IsRemapped && !fw.DeclaringType.TypeAsBaseType.IsInstanceOfType(obj))
+				{
+					throw GetUnsupportedRemappedFieldException(obj);
+				}
+				if (numInvocations == 0)
+				{
+					fw.DeclaringType.RunClassInit();
+					fw.DeclaringType.Finish();
+					fw.ResolveField();
+				}
+				numInvocations++;
+				return (T)fw.FieldTypeWrapper.GhostUnwrap(fw.GetValue(obj));
+			}
+
+			private void lazySet(object obj, T value)
+			{
+				if (isFinal)
+				{
+					// for some reason Java runs class initialization before checking if the field is final
+					fw.DeclaringType.RunClassInit();
+					throw FinalFieldIllegalAccessException(JavaBox(value));
+				}
+#if !NO_REF_EMIT
+				if (numInvocations >= inflationThreshold)
+				{
+					// FXBUG it appears that a ldsfld/stsfld in a DynamicMethod doesn't trigger the class constructor
+					// and if we didn't use the slow path, we haven't yet initialized the class
+					fw.DeclaringType.RunClassInit();
+					setter = (Setter)GenerateFastSetter(typeof(Setter), typeof(T), fw);
+					setter(obj, value, this);
+					return;
+				}
+#endif // !NO_REF_EMIT
+				if (fw.IsStatic)
+				{
+					obj = null;
+				}
+				else if (obj == null)
+				{
+					throw new java.lang.NullPointerException();
+				}
+				else if (!fw.DeclaringType.IsInstance(obj))
+				{
+					throw SetIllegalArgumentException(obj);
+				}
+				else if (fw.DeclaringType.IsRemapped && !fw.DeclaringType.TypeAsBaseType.IsInstanceOfType(obj))
+				{
+					throw GetUnsupportedRemappedFieldException(obj);
+				}
+				CheckValue(value);
+				if (numInvocations == 0)
+				{
+					fw.DeclaringType.RunClassInit();
+					fw.DeclaringType.Finish();
+					fw.ResolveField();
+				}
+				numInvocations++;
+				fw.SetValue(obj, fw.FieldTypeWrapper.GhostWrap(value));
+			}
+
+			private Exception GetUnsupportedRemappedFieldException(object obj)
+			{
+				return new java.lang.IllegalAccessException("Accessing field " + fw.DeclaringType.Name + "." + fw.Name + " in an object of type " + ikvm.runtime.Util.getClassFromObject(obj).getName() + " is not supported");
+			}
+
+			protected virtual void CheckValue(T value)
+			{
+			}
+
+			protected abstract object JavaBox(T value);
+		}
+
+		private sealed class ByteField : FieldAccessor<byte>
+		{
+			internal ByteField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			public sealed override short getShort(object obj)
+			{
+				return (sbyte)getByte(obj);
+			}
+
+			public sealed override int getInt(object obj)
+			{
+				return (sbyte)getByte(obj);
+			}
+
+			public sealed override long getLong(object obj)
+			{
+				return (sbyte)getByte(obj);
+			}
+
+			public sealed override float getFloat(object obj)
+			{
+				return (sbyte)getByte(obj);
+			}
+
+			public sealed override double getDouble(object obj)
+			{
+				return (sbyte)getByte(obj);
+			}
+
+			public sealed override object get(object obj)
+			{
+				return java.lang.Byte.valueOf(getByte(obj));
+			}
+
+			public sealed override void set(object obj, object val)
+			{
+				if (!(val is java.lang.Byte))
+				{
+					throw SetIllegalArgumentException(val);
+				}
+				setByte(obj, ((java.lang.Byte)val).byteValue());
+			}
+
+			public sealed override byte getByte(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void setByte(object obj, byte value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(byte value)
+			{
+				return java.lang.Byte.valueOf(value);
+			}
+		}
+
+		private sealed class BooleanField : FieldAccessor<bool>
+		{
+			internal BooleanField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			public sealed override object get(object obj)
+			{
+				return java.lang.Boolean.valueOf(getBoolean(obj));
+			}
+
+			public sealed override void set(object obj, object val)
+			{
+				if (!(val is java.lang.Boolean))
+				{
+					throw SetIllegalArgumentException(val);
+				}
+				setBoolean(obj, ((java.lang.Boolean)val).booleanValue());
+			}
+
+			public sealed override bool getBoolean(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void setBoolean(object obj, bool value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(bool value)
+			{
+				return java.lang.Boolean.valueOf(value);
+			}
+		}
+
+		private sealed class CharField : FieldAccessor<char>
+		{
+			internal CharField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			public sealed override int getInt(object obj)
+			{
+				return getChar(obj);
+			}
+
+			public sealed override long getLong(object obj)
+			{
+				return getChar(obj);
+			}
+
+			public sealed override float getFloat(object obj)
+			{
+				return getChar(obj);
+			}
+
+			public sealed override double getDouble(object obj)
+			{
+				return getChar(obj);
+			}
+
+			public sealed override object get(object obj)
+			{
+				return java.lang.Character.valueOf(getChar(obj));
+			}
+
+			public sealed override void set(object obj, object val)
+			{
+				if (val is java.lang.Character)
+					setChar(obj, ((java.lang.Character)val).charValue());
+				else
+					throw SetIllegalArgumentException(val);
+			}
+
+			public sealed override char getChar(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void setChar(object obj, char value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(char value)
+			{
+				return java.lang.Character.valueOf(value);
+			}
+		}
+
+		private sealed class ShortField : FieldAccessor<short>
+		{
+			internal ShortField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			public sealed override int getInt(object obj)
+			{
+				return getShort(obj);
+			}
+
+			public sealed override long getLong(object obj)
+			{
+				return getShort(obj);
+			}
+
+			public sealed override float getFloat(object obj)
+			{
+				return getShort(obj);
+			}
+
+			public sealed override double getDouble(object obj)
+			{
+				return getShort(obj);
+			}
+
+			public sealed override object get(object obj)
+			{
+				return java.lang.Short.valueOf(getShort(obj));
+			}
+
+			public sealed override void set(object obj, object val)
+			{
+				if (val is java.lang.Byte
+					|| val is java.lang.Short)
+					setShort(obj, ((java.lang.Number)val).shortValue());
+				else
+					throw SetIllegalArgumentException(val);
+			}
+
+			public sealed override void setByte(object obj, byte b)
+			{
+				setShort(obj, (sbyte)b);
+			}
+
+			public sealed override short getShort(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void setShort(object obj, short value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(short value)
+			{
+				return java.lang.Short.valueOf(value);
+			}
+		}
+
+		private sealed class IntField : FieldAccessor<int>
+		{
+			internal IntField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			public sealed override long getLong(object obj)
+			{
+				return getInt(obj);
+			}
+
+			public sealed override float getFloat(object obj)
+			{
+				return getInt(obj);
+			}
+
+			public sealed override double getDouble(object obj)
+			{
+				return getInt(obj);
+			}
+
+			public sealed override object get(object obj)
+			{
+				return java.lang.Integer.valueOf(getInt(obj));
+			}
+
+			public sealed override void set(object obj, object val)
+			{
+				if (val is java.lang.Byte
+					|| val is java.lang.Short
+					|| val is java.lang.Integer)
+					setInt(obj, ((java.lang.Number)val).intValue());
+				else if (val is java.lang.Character)
+					setInt(obj, ((java.lang.Character)val).charValue());
+				else
+					throw SetIllegalArgumentException(val);
+			}
+
+			public sealed override void setByte(object obj, byte b)
+			{
+				setInt(obj, (sbyte)b);
+			}
+
+			public sealed override void setChar(object obj, char c)
+			{
+				setInt(obj, c);
+			}
+
+			public sealed override void setShort(object obj, short s)
+			{
+				setInt(obj, s);
+			}
+
+			public sealed override int getInt(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void setInt(object obj, int value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(int value)
+			{
+				return java.lang.Integer.valueOf(value);
+			}
+		}
+
+		private sealed class FloatField : FieldAccessor<float>
+		{
+			internal FloatField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			public sealed override double getDouble(object obj)
+			{
+				return getFloat(obj);
+			}
+
+			public sealed override object get(object obj)
+			{
+				return java.lang.Float.valueOf(getFloat(obj));
+			}
+
+			public sealed override void set(object obj, object val)
+			{
+				if (val is java.lang.Float
+					|| val is java.lang.Byte
+					|| val is java.lang.Short
+					|| val is java.lang.Integer
+					|| val is java.lang.Long)
+					setFloat(obj, ((java.lang.Number)val).floatValue());
+				else if (val is java.lang.Character)
+					setFloat(obj, ((java.lang.Character)val).charValue());
+				else
+					throw SetIllegalArgumentException(val);
+			}
+
+			public sealed override void setByte(object obj, byte b)
+			{
+				setFloat(obj, (sbyte)b);
+			}
+
+			public sealed override void setChar(object obj, char c)
+			{
+				setFloat(obj, c);
+			}
+
+			public sealed override void setShort(object obj, short s)
+			{
+				setFloat(obj, s);
+			}
+
+			public sealed override void setInt(object obj, int i)
+			{
+				setFloat(obj, i);
+			}
+
+			public sealed override void setLong(object obj, long l)
+			{
+				setFloat(obj, l);
+			}
+
+			public sealed override float getFloat(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void setFloat(object obj, float value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(float value)
+			{
+				return java.lang.Float.valueOf(value);
+			}
+		}
+
+		private sealed class LongField : FieldAccessor<long>
+		{
+			internal LongField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			public sealed override float getFloat(object obj)
+			{
+				return getLong(obj);
+			}
+
+			public sealed override double getDouble(object obj)
+			{
+				return getLong(obj);
+			}
+
+			public sealed override object get(object obj)
+			{
+				return java.lang.Long.valueOf(getLong(obj));
+			}
+
+			public sealed override void set(object obj, object val)
+			{
+				if (val is java.lang.Long
+					|| val is java.lang.Byte
+					|| val is java.lang.Short
+					|| val is java.lang.Integer)
+					setLong(obj, ((java.lang.Number)val).longValue());
+				else if (val is java.lang.Character)
+					setLong(obj, ((java.lang.Character)val).charValue());
+				else
+					throw SetIllegalArgumentException(val);
+			}
+
+			public sealed override void setByte(object obj, byte b)
+			{
+				setLong(obj, (sbyte)b);
+			}
+
+			public sealed override void setChar(object obj, char c)
+			{
+				setLong(obj, c);
+			}
+
+			public sealed override void setShort(object obj, short s)
+			{
+				setLong(obj, s);
+			}
+
+			public sealed override void setInt(object obj, int i)
+			{
+				setLong(obj, i);
+			}
+
+			public sealed override long getLong(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void setLong(object obj, long value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(long value)
+			{
+				return java.lang.Long.valueOf(value);
+			}
+		}
+
+		private sealed class DoubleField : FieldAccessor<double>
+		{
+			internal DoubleField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			public sealed override object get(object obj)
+			{
+				return java.lang.Double.valueOf(getDouble(obj));
+			}
+
+			public sealed override void set(object obj, object val)
+			{
+				if (val is java.lang.Double
+					|| val is java.lang.Float
+					|| val is java.lang.Byte
+					|| val is java.lang.Short
+					|| val is java.lang.Integer
+					|| val is java.lang.Long)
+					setDouble(obj, ((java.lang.Number)val).doubleValue());
+				else if (val is java.lang.Character)
+					setDouble(obj, ((java.lang.Character)val).charValue());
+				else
+					throw SetIllegalArgumentException(val);
+			}
+
+			public sealed override void setByte(object obj, byte b)
+			{
+				setDouble(obj, (sbyte)b);
+			}
+
+			public sealed override void setChar(object obj, char c)
+			{
+				setDouble(obj, c);
+			}
+
+			public sealed override void setShort(object obj, short s)
+			{
+				setDouble(obj, s);
+			}
+
+			public sealed override void setInt(object obj, int i)
+			{
+				setDouble(obj, i);
+			}
+
+			public sealed override void setLong(object obj, long l)
+			{
+				setDouble(obj, l);
+			}
+
+			public sealed override void setFloat(object obj, float f)
+			{
+				setDouble(obj, f);
+			}
+
+			public sealed override double getDouble(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void setDouble(object obj, double value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(double value)
+			{
+				return java.lang.Double.valueOf(value);
+			}
+		}
+
+		private sealed class ObjectField : FieldAccessor<object>
+		{
+			internal ObjectField(FieldWrapper field, bool overrideAccessCheck)
+				: base(field, overrideAccessCheck)
+			{
+			}
+
+			protected sealed override void CheckValue(object value)
+			{
+				if (value != null && !fw.FieldTypeWrapper.EnsureLoadable(fw.DeclaringType.GetClassLoader()).IsInstance(value))
+				{
+					throw SetIllegalArgumentException(value);
+				}
+			}
+
+			public sealed override object get(object obj)
+			{
+				try
+				{
+					return getter(obj, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			public sealed override void set(object obj, object value)
+			{
+				try
+				{
+					setter(obj, value, this);
+				}
+				catch (FieldAccessException x)
+				{
+					throw new java.lang.IllegalAccessException().initCause(x);
+				}
+			}
+
+			protected sealed override object JavaBox(object value)
+			{
+				return value;
+			}
+		}
+
+#if !NO_REF_EMIT
+		private Delegate GenerateFastGetter(Type delegateType, Type fieldType, FieldWrapper fw)
+		{
+			TypeWrapper fieldTypeWrapper;
+			try
+			{
+				fieldTypeWrapper = fw.FieldTypeWrapper.EnsureLoadable(fw.DeclaringType.GetClassLoader());
+				fieldTypeWrapper.Finish();
+				fw.DeclaringType.Finish();
+			}
+			catch (RetargetableJavaException x)
+			{
+				throw x.ToJava();
+			}
+			fw.ResolveField();
+			DynamicMethod dm = DynamicMethodUtils.Create("__<Getter>", fw.DeclaringType.TypeAsBaseType, !fw.IsPublic || !fw.DeclaringType.IsPublic, fieldType, new Type[] { typeof(IReflectionException), typeof(object), typeof(object) });
+			CodeEmitter ilgen = CodeEmitter.Create(dm);
+			if (fw.IsStatic)
+			{
+				fw.EmitGet(ilgen);
+				fieldTypeWrapper.EmitConvSignatureTypeToStackType(ilgen);
+			}
+			else
+			{
+				ilgen.BeginExceptionBlock();
+				ilgen.Emit(OpCodes.Ldarg_1);
+				ilgen.Emit(OpCodes.Castclass, fw.DeclaringType.TypeAsBaseType);
+				fw.EmitGet(ilgen);
+				fieldTypeWrapper.EmitConvSignatureTypeToStackType(ilgen);
+				CodeEmitterLocal local = ilgen.DeclareLocal(fieldType);
+				ilgen.Emit(OpCodes.Stloc, local);
+				CodeEmitterLabel label = ilgen.DefineLabel();
+				ilgen.EmitLeave(label);
+				ilgen.BeginCatchBlock(typeof(InvalidCastException));
+				ilgen.Emit(OpCodes.Ldarg_0);
+				ilgen.Emit(OpCodes.Ldarg_1);
+				ilgen.Emit(OpCodes.Callvirt, typeof(IReflectionException).GetMethod("GetIllegalArgumentException"));
+				ilgen.Emit(OpCodes.Throw);
+				ilgen.EndExceptionBlock();
+				ilgen.MarkLabel(label);
+				ilgen.Emit(OpCodes.Ldloc, local);
+			}
+			ilgen.Emit(OpCodes.Ret);
+			ilgen.DoEmit();
+			return dm.CreateDelegate(delegateType, this);
+		}
+
+		private Delegate GenerateFastSetter(Type delegateType, Type fieldType, FieldWrapper fw)
+		{
+			TypeWrapper fieldTypeWrapper;
+			try
+			{
+				fieldTypeWrapper = fw.FieldTypeWrapper.EnsureLoadable(fw.DeclaringType.GetClassLoader());
+				fieldTypeWrapper.Finish();
+				fw.DeclaringType.Finish();
+			}
+			catch (RetargetableJavaException x)
+			{
+				throw x.ToJava();
+			}
+			fw.ResolveField();
+			DynamicMethod dm = DynamicMethodUtils.Create("__<Setter>", fw.DeclaringType.TypeAsBaseType, !fw.IsPublic || !fw.DeclaringType.IsPublic, null, new Type[] { typeof(IReflectionException), typeof(object), fieldType, typeof(object) });
+			CodeEmitter ilgen = CodeEmitter.Create(dm);
+			if (fw.IsStatic)
+			{
+				if (fieldType == typeof(object))
+				{
+					ilgen.BeginExceptionBlock();
+					ilgen.Emit(OpCodes.Ldarg_2);
+					fieldTypeWrapper.EmitCheckcast(ilgen);
+					fieldTypeWrapper.EmitConvStackTypeToSignatureType(ilgen, null);
+					fw.EmitSet(ilgen);
+					CodeEmitterLabel label = ilgen.DefineLabel();
+					ilgen.EmitLeave(label);
+					ilgen.BeginCatchBlock(typeof(InvalidCastException));
+					ilgen.Emit(OpCodes.Ldarg_0);
+					ilgen.Emit(OpCodes.Ldarg_1);
+					ilgen.Emit(OpCodes.Callvirt, typeof(IReflectionException).GetMethod("SetIllegalArgumentException"));
+					ilgen.Emit(OpCodes.Throw);
+					ilgen.EndExceptionBlock();
+					ilgen.MarkLabel(label);
+				}
+				else
+				{
+					ilgen.Emit(OpCodes.Ldarg_2);
+					fw.EmitSet(ilgen);
+				}
+			}
+			else
+			{
+				ilgen.BeginExceptionBlock();
+				ilgen.Emit(OpCodes.Ldarg_1);
+				ilgen.Emit(OpCodes.Castclass, fw.DeclaringType.TypeAsBaseType);
+				ilgen.Emit(OpCodes.Ldarg_2);
+				if (fieldType == typeof(object))
+				{
+					fieldTypeWrapper.EmitCheckcast(ilgen);
+				}
+				fieldTypeWrapper.EmitConvStackTypeToSignatureType(ilgen, null);
+				fw.EmitSet(ilgen);
+				CodeEmitterLabel label = ilgen.DefineLabel();
+				ilgen.EmitLeave(label);
+				ilgen.BeginCatchBlock(typeof(InvalidCastException));
+				ilgen.Emit(OpCodes.Ldarg_0);
+				ilgen.Emit(OpCodes.Ldarg_1);
+				ilgen.Emit(OpCodes.Callvirt, typeof(IReflectionException).GetMethod("SetIllegalArgumentException"));
+				ilgen.Emit(OpCodes.Throw);
+				ilgen.EndExceptionBlock();
+				ilgen.MarkLabel(label);
+			}
+			ilgen.Emit(OpCodes.Ret);
+			ilgen.DoEmit();
+			return dm.CreateDelegate(delegateType, this);
+		}
+#endif // !NO_REF_EMIT
+
+		internal static FieldAccessorImplBase Create(FieldWrapper field, bool overrideAccessCheck)
+		{
+			TypeWrapper type = field.FieldTypeWrapper;
+			if (type.IsPrimitive)
+			{
+				if (type == PrimitiveTypeWrapper.BYTE)
+				{
+					return new ByteField(field, overrideAccessCheck);
+				}
+				if (type == PrimitiveTypeWrapper.BOOLEAN)
+				{
+					return new BooleanField(field, overrideAccessCheck);
+				}
+				if (type == PrimitiveTypeWrapper.CHAR)
+				{
+					return new CharField(field, overrideAccessCheck);
+				}
+				if (type == PrimitiveTypeWrapper.SHORT)
+				{
+					return new ShortField(field, overrideAccessCheck);
+				}
+				if (type == PrimitiveTypeWrapper.INT)
+				{
+					return new IntField(field, overrideAccessCheck);
+				}
+				if (type == PrimitiveTypeWrapper.FLOAT)
+				{
+					return new FloatField(field, overrideAccessCheck);
+				}
+				if (type == PrimitiveTypeWrapper.LONG)
+				{
+					return new LongField(field, overrideAccessCheck);
+				}
+				if (type == PrimitiveTypeWrapper.DOUBLE)
+				{
+					return new DoubleField(field, overrideAccessCheck);
+				}
+				throw new InvalidOperationException("field type: " + type);
+			}
+			else
+			{
+				return new ObjectField(field, overrideAccessCheck);
+			}
+		}
+	}
+#endif
+
+	public static sun.reflect.FieldAccessor newFieldAccessor(object thisFactory, java.lang.reflect.Field field, bool overrideAccessCheck)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		return FieldAccessorImplBase.Create(FieldWrapper.FromField(field), overrideAccessCheck);
+#endif
+	}
+
+#if !FIRST_PASS
+	internal static sun.reflect.FieldAccessor NewFieldAccessorJNI(FieldWrapper field)
+	{
+		return FieldAccessorImplBase.Create(field, true);
+	}
+#endif
+
+	public static sun.reflect.MethodAccessor newMethodAccessor(object thisFactory, java.lang.reflect.Method method)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		MethodWrapper mw = MethodWrapper.FromMethod(method);
+#if !NO_REF_EMIT
+		if (!mw.IsDynamicOnly)
+		{
+			return new FastMethodAccessorImpl(mw);
+		}
+#endif
+		return new MethodAccessorImpl(mw);
+#endif
+	}
+
+	public static sun.reflect.ConstructorAccessor newConstructorAccessor0(object thisFactory, java.lang.reflect.Constructor constructor)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		MethodWrapper mw = MethodWrapper.FromConstructor(constructor);
+		if (ActivatorConstructorAccessor.IsSuitable(mw))
+		{
+			// we special case public default constructors, because in that case using Activator.CreateInstance()
+			// is almost as fast as FastConstructorAccessorImpl, but it saves us significantly in working set and
+			// startup time (because often during startup a sun.nio.cs.* encoder is instantiated using reflection)
+			return new ActivatorConstructorAccessor(mw);
+		}
+		else
+		{
+#if NO_REF_EMIT
+			return new ConstructorAccessorImpl(mw);
+#else
+			return new FastConstructorAccessorImpl(constructor);
+#endif
+		}
+#endif
+	}
+
+	public static sun.reflect.ConstructorAccessor newConstructorAccessorForSerialization(java.lang.Class classToInstantiate, java.lang.reflect.Constructor constructorToCall)
+	{
+#if FIRST_PASS
+		return null;
+#else
+		try
+		{
+#if NO_REF_EMIT
+			return new SerializationConstructorAccessorImpl(constructorToCall, classToInstantiate);
+#else
+			return new FastSerializationConstructorAccessorImpl(constructorToCall, classToInstantiate);
+#endif
+		}
+		catch (SecurityException x)
+		{
+			throw new java.lang.SecurityException(x.Message, ikvm.runtime.Util.mapException(x));
+		}
+#endif
+	}
+}
+
+static class Java_sun_reflect_ConstantPool
+{
+	public static int getSize0(object thisConstantPool, object constantPoolOop)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static object getClassAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static object getClassAtIfLoaded0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static object getMethodAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static object getMethodAtIfLoaded0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static object getFieldAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static object getFieldAtIfLoaded0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static string[] getMemberRefInfoAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static int getIntAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static long getLongAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static float getFloatAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static double getDoubleAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static string getStringAt0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+
+	public static string getUTF8At0(object thisConstantPool, object constantPoolOop, int index)
+	{
+		throw new NotImplementedException();
+	}
+}
diff --git a/external/ikvm/runtime/stubgen/ClassFileWriter.cs b/external/ikvm/runtime/stubgen/ClassFileWriter.cs
index 327591c..ded6267 100644
--- a/external/ikvm/runtime/stubgen/ClassFileWriter.cs
+++ b/external/ikvm/runtime/stubgen/ClassFileWriter.cs
@@ -830,6 +830,31 @@ namespace IKVM.StubGen
 		}
 	}
 
+	sealed class MethodParametersAttribute : ClassFileAttribute
+	{
+		private readonly ClassFileWriter classFile;
+		private readonly ushort[] names;
+
+		internal MethodParametersAttribute(ClassFileWriter classFile, ushort[] names)
+			: base(classFile.AddUtf8("MethodParameters"))
+		{
+			this.classFile = classFile;
+			this.names = names;
+		}
+
+		public override void Write(BigEndianStream bes)
+		{
+			base.Write(bes);
+			bes.WriteUInt32((uint)(1 + names.Length * 4));
+			bes.WriteByte((byte)names.Length);
+			foreach (ushort idx in names)
+			{
+				bes.WriteUInt16(idx);
+				bes.WriteUInt16(0);
+			}
+		}
+	}
+
 	interface IAttributeOwner
 	{
 		void AddAttribute(ClassFileAttribute attrib);
diff --git a/external/ikvm/runtime/stubgen/StubGenerator.cs b/external/ikvm/runtime/stubgen/StubGenerator.cs
index 206cd18..1aa6f93 100644
--- a/external/ikvm/runtime/stubgen/StubGenerator.cs
+++ b/external/ikvm/runtime/stubgen/StubGenerator.cs
@@ -37,7 +37,7 @@ namespace IKVM.StubGen
 {
 	static class StubGenerator
 	{
-		internal static void WriteClass(Stream stream, TypeWrapper tw, bool includeNonPublicInterfaces, bool includeNonPublicMembers, bool includeSerialVersionUID)
+		internal static void WriteClass(Stream stream, TypeWrapper tw, bool includeNonPublicInterfaces, bool includeNonPublicMembers, bool includeSerialVersionUID, bool includeParameterNames)
 		{
 			string name = tw.Name.Replace('.', '/');
 			string super = null;
@@ -49,7 +49,7 @@ namespace IKVM.StubGen
 			{
 				super = tw.BaseTypeWrapper.Name.Replace('.', '/');
 			}
-			ClassFileWriter writer = new ClassFileWriter(tw.Modifiers, name, super, 0, 49);
+			ClassFileWriter writer = new ClassFileWriter(tw.Modifiers, name, super, 0, includeParameterNames ? (ushort)52 : (ushort)49);
 			foreach (TypeWrapper iface in tw.Interfaces)
 			{
 				if (iface.IsPublic || includeNonPublicInterfaces)
@@ -185,6 +185,22 @@ namespace IKVM.StubGen
 						{
 							m.AddAttribute(new AnnotationDefaultClassFileAttribute(writer, GetAnnotationDefault(writer, attr.ConstructorArguments[0])));
 						}
+						if (includeParameterNames)
+						{
+							ParameterInfo[] parameters = mb.GetParameters();
+							if (parameters.Length != 0)
+							{
+								ushort[] names = new ushort[parameters.Length];
+								for (int i = 0; i < names.Length; i++)
+								{
+									if (parameters[i].Name != null)
+									{
+										names[i] = writer.AddUtf8(parameters[i].Name);
+									}
+								}
+								m.AddAttribute(new MethodParametersAttribute(writer, names));
+							}
+						}
 					}
 					string sig = tw.GetGenericMethodSignature(mw);
 					if (sig != null)
@@ -252,7 +268,7 @@ namespace IKVM.StubGen
 						{
 							attr = new RuntimeVisibleAnnotationsAttribute(writer);
 						}
-						attr.Add(UnpackArray((IList<CustomAttributeTypedArgument>)cad.ConstructorArguments[0].Value));
+						attr.Add(ann);
 					}
 				}
 				if (attr != null)
@@ -290,7 +306,7 @@ namespace IKVM.StubGen
 								}
 								param = new RuntimeVisibleAnnotationsAttribute(writer);
 							}
-							param.Add(UnpackArray((IList<CustomAttributeTypedArgument>)cad.ConstructorArguments[0].Value));
+							param.Add(ann);
 						}
 					}
 					if (attr != null)
@@ -310,13 +326,84 @@ namespace IKVM.StubGen
 		private static object[] GetAnnotation(CustomAttributeData cad)
 		{
 			if (cad.ConstructorArguments.Count == 1 && cad.ConstructorArguments[0].ArgumentType == typeof(object[]) &&
-				(cad.Constructor.DeclaringType.IsSubclassOf(JVM.Import(typeof(ikvm. at internal.AnnotationAttributeBase)))
-				|| cad.Constructor.DeclaringType == JVM.Import(typeof(DynamicAnnotationAttribute))))
+				(cad.Constructor.DeclaringType.BaseType == typeof(ikvm. at internal.AnnotationAttributeBase)
+				|| cad.Constructor.DeclaringType == typeof(DynamicAnnotationAttribute)))
 			{
 				return UnpackArray((IList<CustomAttributeTypedArgument>)cad.ConstructorArguments[0].Value);
 			}
+			else if (cad.Constructor.DeclaringType.BaseType == typeof(ikvm. at internal.AnnotationAttributeBase))
+			{
+				string annotationType = GetAnnotationInterface(cad);
+				if (annotationType != null)
+				{
+					// this is a custom attribute annotation applied in a non-Java module
+					List<object> list = new List<object>();
+					list.Add(AnnotationDefaultAttribute.TAG_ANNOTATION);
+					list.Add("L" + annotationType.Replace('.', '/') + ";");
+					ParameterInfo[] parameters = cad.Constructor.GetParameters();
+					for (int i = 0; i < parameters.Length; i++)
+					{
+						list.Add(parameters[i].Name);
+						list.Add(EncodeAnnotationValue(cad.ConstructorArguments[i]));
+					}
+					foreach (CustomAttributeNamedArgument arg in cad.NamedArguments)
+					{
+						list.Add(arg.MemberInfo.Name);
+						list.Add(EncodeAnnotationValue(arg.TypedValue));
+					}
+					return list.ToArray();
+				}
+			}
 			return null;
 		}
+
+		private static string GetAnnotationInterface(CustomAttributeData cad)
+		{
+			object[] attr = cad.Constructor.DeclaringType.GetCustomAttributes(typeof(IKVM.Attributes.ImplementsAttribute), false);
+			if (attr.Length == 1)
+			{
+				string[] interfaces = ((IKVM.Attributes.ImplementsAttribute)attr[0]).Interfaces;
+				if (interfaces.Length == 1)
+				{
+					return interfaces[0];
+				}
+			}
+			return null;
+		}
+
+		private static object EncodeAnnotationValue(CustomAttributeTypedArgument arg)
+		{
+			if (arg.ArgumentType.IsEnum)
+			{
+				// if GetWrapperFromType returns null, we've got an ikvmc synthesized .NET enum nested inside a Java enum
+				TypeWrapper tw = ClassLoaderWrapper.GetWrapperFromType(arg.ArgumentType) ?? ClassLoaderWrapper.GetWrapperFromType(arg.ArgumentType.DeclaringType);
+				return new object[] { AnnotationDefaultAttribute.TAG_ENUM, EncodeTypeName(tw), Enum.GetName(arg.ArgumentType, arg.Value) };
+			}
+			else if (arg.Value is Type)
+			{
+				return new object[] { AnnotationDefaultAttribute.TAG_CLASS, EncodeTypeName(ClassLoaderWrapper.GetWrapperFromType((Type)arg.Value)) };
+			}
+			else if (arg.ArgumentType.IsArray)
+			{
+				IList<CustomAttributeTypedArgument> array = (IList<CustomAttributeTypedArgument>)arg.Value;
+				object[] arr = new object[array.Count + 1];
+				arr[0] = AnnotationDefaultAttribute.TAG_ARRAY;
+				for (int i = 0; i < array.Count; i++)
+				{
+					arr[i + 1] = EncodeAnnotationValue(array[i]);
+				}
+				return arr;
+			}
+			else
+			{
+				return arg.Value;
+			}
+		}
+
+		private static string EncodeTypeName(TypeWrapper tw)
+		{
+			return tw.SigName.Replace('.', '/');
+		}
 #endif
 
 		private static object[] UnpackArray(IList<CustomAttributeTypedArgument> list)
@@ -438,10 +525,31 @@ namespace IKVM.StubGen
 					"value",
 					targets.ToArray()
 				});
+				if (Experimental.JDK_8 && IsRepeatableAnnotation(tw))
+				{
+					annot.Add(new object[] {
+						AnnotationDefaultAttribute.TAG_ANNOTATION,
+						"Ljava/lang/annotation/Repeatable;",
+						"value",
+						new object[] { AnnotationDefaultAttribute.TAG_CLASS, "L" + (tw.Name + DotNetTypeWrapper.AttributeAnnotationMultipleSuffix).Replace('.', '/') + ";" }
+					});
+				}
 				writer.AddAttribute(annot);
 			}
 		}
 
+		private static bool IsRepeatableAnnotation(TypeWrapper tw)
+		{
+			foreach (TypeWrapper nested in tw.InnerClasses)
+			{
+				if (nested.Name == tw.Name + DotNetTypeWrapper.AttributeAnnotationMultipleSuffix)
+				{
+					return true;
+				}
+			}
+			return false;
+		}
+
 		private static byte[] GetAnnotationDefault(ClassFileWriter classFile, TypeWrapper type)
 		{
 			MemoryStream mem = new MemoryStream();
diff --git a/external/ikvm/runtime/verifier.cs b/external/ikvm/runtime/verifier.cs
index 9923217..81b4792 100644
--- a/external/ikvm/runtime/verifier.cs
+++ b/external/ikvm/runtime/verifier.cs
@@ -389,7 +389,11 @@ sealed class InstructionState
 			st2.Push(t2);
 			t2 = t2.BaseTypeWrapper;
 		}
-		TypeWrapper type = null;
+		if(HasMissingBaseType(st1) || HasMissingBaseType(st2))
+		{
+			return VerifierTypeWrapper.Unloadable;
+		}
+		TypeWrapper type = CoreClasses.java.lang.Object.Wrapper;
 		for(;;)
 		{
 			t1 = st1.Count > 0 ? st1.Pop() : null;
@@ -402,6 +406,19 @@ sealed class InstructionState
 		}
 	}
 
+	private static bool HasMissingBaseType(Stack<TypeWrapper> st)
+	{
+#if STATIC_COMPILER
+		if (st.Pop().IsUnloadable)
+		{
+			// we have a missing type in base class hierarchy
+			StaticCompiler.IssueMissingTypeMessage(st.Pop().TypeAsBaseType.BaseType);
+			return true;
+		}
+#endif
+		return false;
+	}
+
 	private void SetLocal1(int index, TypeWrapper type)
 	{
 		try
@@ -562,7 +579,12 @@ sealed class InstructionState
 
 	internal void PopInt()
 	{
-		if(PopAnyType() != PrimitiveTypeWrapper.INT)
+		PopIntImpl(PopAnyType());
+	}
+
+	internal static void PopIntImpl(TypeWrapper type)
+	{
+		if (type != PrimitiveTypeWrapper.INT)
 		{
 			throw new VerifyError("Int expected on stack");
 		}
@@ -571,26 +593,41 @@ sealed class InstructionState
 	internal bool PopFloat()
 	{
 		TypeWrapper tw = PopAnyType();
+		PopFloatImpl(tw);
+		return tw == VerifierTypeWrapper.ExtendedFloat;
+	}
+
+	internal static void PopFloatImpl(TypeWrapper tw)
+	{
 		if(tw != PrimitiveTypeWrapper.FLOAT && tw != VerifierTypeWrapper.ExtendedFloat)
 		{
 			throw new VerifyError("Float expected on stack");
 		}
-		return tw == VerifierTypeWrapper.ExtendedFloat;
 	}
 
 	internal bool PopDouble()
 	{
 		TypeWrapper tw = PopAnyType();
+		PopDoubleImpl(tw);
+		return tw == VerifierTypeWrapper.ExtendedDouble;
+	}
+
+	internal static void PopDoubleImpl(TypeWrapper tw)
+	{
 		if(tw != PrimitiveTypeWrapper.DOUBLE && tw != VerifierTypeWrapper.ExtendedDouble)
 		{
 			throw new VerifyError("Double expected on stack");
 		}
-		return tw == VerifierTypeWrapper.ExtendedDouble;
 	}
 
 	internal void PopLong()
 	{
-		if(PopAnyType() != PrimitiveTypeWrapper.LONG)
+		PopLongImpl(PopAnyType());
+	}
+
+	internal static void PopLongImpl(TypeWrapper tw)
+	{
+		if(tw != PrimitiveTypeWrapper.LONG)
 		{
 			throw new VerifyError("Long expected on stack");
 		}
@@ -598,7 +635,11 @@ sealed class InstructionState
 
 	internal TypeWrapper PopArrayType()
 	{
-		TypeWrapper type = PopAnyType();
+		return PopArrayTypeImpl(PopAnyType());
+	}
+
+	internal static TypeWrapper PopArrayTypeImpl(TypeWrapper type)
+	{
 		if(!VerifierTypeWrapper.IsNullOrUnloadable(type) && type.ArrayRank == 0)
 		{
 			throw new VerifyError("Array reference expected on stack");
@@ -609,7 +650,11 @@ sealed class InstructionState
 	// null or an initialized object reference
 	internal TypeWrapper PopObjectType()
 	{
-		TypeWrapper type = PopType();
+		return PopObjectTypeImpl(PopType());
+	}
+
+	internal static TypeWrapper PopObjectTypeImpl(TypeWrapper type)
+	{
 		if(type.IsPrimitive || VerifierTypeWrapper.IsNew(type) || type == VerifierTypeWrapper.UninitializedThis)
 		{
 			throw new VerifyError("Expected object reference on stack");
@@ -620,7 +665,11 @@ sealed class InstructionState
 	// null or an initialized object reference derived from baseType (or baseType)
 	internal TypeWrapper PopObjectType(TypeWrapper baseType)
 	{
-		TypeWrapper type = PopObjectType();
+		return PopObjectTypeImpl(baseType, PopObjectType());
+	}
+
+	internal static TypeWrapper PopObjectTypeImpl(TypeWrapper baseType, TypeWrapper type)
+	{
 		// HACK because of the way interfaces references works, if baseType
 		// is an interface or array of interfaces, any reference will be accepted
 		if(!baseType.IsUnloadable && !baseType.IsInterfaceOrInterfaceArray && !(type.IsUnloadable || type.IsAssignableTo(baseType)))
@@ -678,7 +727,11 @@ sealed class InstructionState
 	// NOTE this can *not* be used to pop double or long
 	internal TypeWrapper PopType()
 	{
-		TypeWrapper type = PopAnyType();
+		return PopTypeImpl(PopAnyType());
+	}
+
+	internal static TypeWrapper PopTypeImpl(TypeWrapper type)
+	{
 		if(type.IsWidePrimitive || type == VerifierTypeWrapper.ExtendedDouble)
 		{
 			throw new VerifyError("Attempt to split long or double on the stack");
@@ -691,36 +744,73 @@ sealed class InstructionState
 	// NOTE this can also be used to pop double or long
 	internal TypeWrapper PopType(TypeWrapper baseType)
 	{
+		return PopTypeImpl(baseType, PopAnyType());
+	}
+
+	internal static TypeWrapper PopTypeImpl(TypeWrapper baseType, TypeWrapper type)
+	{
 		if(baseType.IsIntOnStackPrimitive)
 		{
 			baseType = PrimitiveTypeWrapper.INT;
 		}
-		TypeWrapper type = PopAnyType();
 		if(VerifierTypeWrapper.IsNew(type) || type == VerifierTypeWrapper.UninitializedThis)
 		{
 			throw new VerifyError("Expecting to find object/array on stack");
 		}
-		if(type != baseType &&
-			!((type.IsUnloadable && !baseType.IsPrimitive) || (baseType.IsUnloadable && !type.IsPrimitive) ||
-				type.IsAssignableTo(baseType)))
+		if(type == baseType)
+		{
+			return type;
+		}
+		else if(type == VerifierTypeWrapper.ExtendedDouble && baseType == PrimitiveTypeWrapper.DOUBLE)
+		{
+			return type;
+		}
+		else if(type == VerifierTypeWrapper.ExtendedFloat && baseType == PrimitiveTypeWrapper.FLOAT)
 		{
-			// HACK because of the way interfaces references works, if baseType
+			return type;
+		}
+		else if(type.IsPrimitive || baseType.IsPrimitive)
+		{
+			// throw at the end of the method
+		}
+		else if(baseType == CoreClasses.java.lang.Object.Wrapper)
+		{
+			return type;
+		}
+		else if(type.IsUnloadable || baseType.IsUnloadable)
+		{
+			return type;
+		}
+		else if (baseType.IsInterfaceOrInterfaceArray)
+		{
+			// because of the way interfaces references works, if baseType
 			// is an interface or array of interfaces, any reference will be accepted
-			if((baseType.IsUnloadable || baseType.IsInterfaceOrInterfaceArray) && !type.IsPrimitive)
-			{
-				return type;
-			}
-			if(type == VerifierTypeWrapper.ExtendedDouble && baseType == PrimitiveTypeWrapper.DOUBLE)
-			{
-				return type;
-			}
-			if(type == VerifierTypeWrapper.ExtendedFloat && baseType == PrimitiveTypeWrapper.FLOAT)
+			return type;
+		}
+		else if (type.IsAssignableTo(baseType))
+		{
+			return type;
+		}
+		else if (HasMissingBaseType(type) || HasMissingBaseType(baseType))
+		{
+			return type;
+		}
+		throw new VerifyError("Unexpected type " + type.Name + " where " + baseType.Name + " was expected");
+	}
+
+	private static bool HasMissingBaseType(TypeWrapper tw)
+	{
+#if STATIC_COMPILER
+		for (TypeWrapper baseTypeWrapper; (baseTypeWrapper = tw.BaseTypeWrapper) != null; tw = baseTypeWrapper)
+		{
+			if (baseTypeWrapper.IsUnloadable)
 			{
-				return type;
+				StaticCompiler.IssueMissingTypeMessage(tw.TypeAsBaseType.BaseType);
+				return true;
 			}
-			throw new VerifyError("Unexpected type " + type.Name + " where " + baseType.Name + " was expected");
 		}
-		return type;
+#endif
+		return false;
 	}
 
 	internal int GetStackHeight()
@@ -889,115 +979,50 @@ struct StackState
 
 	internal TypeWrapper PopType(TypeWrapper baseType)
 	{
-		if(baseType.IsIntOnStackPrimitive)
-		{
-			baseType = PrimitiveTypeWrapper.INT;
-		}
-		TypeWrapper type = PopAnyType();
-		if(VerifierTypeWrapper.IsNew(type) || type == VerifierTypeWrapper.UninitializedThis)
-		{
-			throw new VerifyError("Expecting to find object/array on stack");
-		}
-		if(type != baseType &&
-			!((type.IsUnloadable && !baseType.IsPrimitive) || (baseType.IsUnloadable && !type.IsPrimitive) ||
-			type.IsAssignableTo(baseType)))
-		{
-			// HACK because of the way interfaces references works, if baseType
-			// is an interface or array of interfaces, any reference will be accepted
-			if((baseType.IsUnloadable || baseType.IsInterfaceOrInterfaceArray) && !type.IsPrimitive)
-			{
-				return type;
-			}
-			if(type == VerifierTypeWrapper.ExtendedDouble && baseType == PrimitiveTypeWrapper.DOUBLE)
-			{
-				return type;
-			}
-			if(type == VerifierTypeWrapper.ExtendedFloat && baseType == PrimitiveTypeWrapper.FLOAT)
-			{
-				return type;
-			}
-			throw new VerifyError("Unexpected type " + type.Name + " where " + baseType.Name + " was expected");
-		}
-		return type;
+		return InstructionState.PopTypeImpl(baseType, PopAnyType());
 	}
 
 	// NOTE this can *not* be used to pop double or long
 	internal TypeWrapper PopType()
 	{
-		TypeWrapper type = PopAnyType();
-		if(type.IsWidePrimitive || type == VerifierTypeWrapper.ExtendedDouble)
-		{
-			throw new VerifyError("Attempt to split long or double on the stack");
-		}
-		return type;
+		return InstructionState.PopTypeImpl(PopAnyType());
 	}
 
 	internal void PopInt()
 	{
-		if(PopAnyType() != PrimitiveTypeWrapper.INT)
-		{
-			throw new VerifyError("Int expected on stack");
-		}
+		InstructionState.PopIntImpl(PopAnyType());
 	}
 
 	internal void PopFloat()
 	{
-		TypeWrapper tw = PopAnyType();
-		if(tw != PrimitiveTypeWrapper.FLOAT && tw != VerifierTypeWrapper.ExtendedFloat)
-		{
-			throw new VerifyError("Float expected on stack");
-		}
+		InstructionState.PopFloatImpl(PopAnyType());
 	}
 
 	internal void PopDouble()
 	{
-		TypeWrapper tw = PopAnyType();
-		if(tw != PrimitiveTypeWrapper.DOUBLE && tw != VerifierTypeWrapper.ExtendedDouble)
-		{
-			throw new VerifyError("Double expected on stack");
-		}
+		InstructionState.PopDoubleImpl(PopAnyType());
 	}
 
 	internal void PopLong()
 	{
-		if(PopAnyType() != PrimitiveTypeWrapper.LONG)
-		{
-			throw new VerifyError("Long expected on stack");
-		}
+		InstructionState.PopLongImpl(PopAnyType());
 	}
 
 	internal TypeWrapper PopArrayType()
 	{
-		TypeWrapper type = PopAnyType();
-		if(!VerifierTypeWrapper.IsNullOrUnloadable(type) && type.ArrayRank == 0)
-		{
-			throw new VerifyError("Array reference expected on stack");
-		}
-		return type;
+		return InstructionState.PopArrayTypeImpl(PopAnyType());
 	}
 
 	// either null or an initialized object reference
 	internal TypeWrapper PopObjectType()
 	{
-		TypeWrapper type = PopAnyType();
-		if(type.IsPrimitive || VerifierTypeWrapper.IsNew(type) || type == VerifierTypeWrapper.UninitializedThis)
-		{
-			throw new VerifyError("Expected object reference on stack");
-		}
-		return type;
+		return InstructionState.PopObjectTypeImpl(PopAnyType());
 	}
 
 	// null or an initialized object reference derived from baseType (or baseType)
 	internal TypeWrapper PopObjectType(TypeWrapper baseType)
 	{
-		TypeWrapper type = PopObjectType();
-		// HACK because of the way interfaces references works, if baseType
-		// is an interface or array of interfaces, any reference will be accepted
-		if(!baseType.IsUnloadable && !baseType.IsInterfaceOrInterfaceArray && !(type.IsUnloadable || type.IsAssignableTo(baseType)))
-		{
-			throw new VerifyError("Unexpected type " + type + " where " + baseType + " was expected");
-		}
-		return type;
+		return InstructionState.PopObjectTypeImpl(baseType, PopObjectType());
 	}
 }
 
@@ -2381,7 +2406,11 @@ sealed class MethodAnalyzer
 		StackState stack = new StackState(state[index]);
 		NormalizedByteCode invoke = method.Instructions[index].NormalizedOpCode;
 		ClassFile.ConstantPoolItemMI cpi = GetMethodref(method.Instructions[index].Arg1);
-		if ((cpi is ClassFile.ConstantPoolItemInterfaceMethodref) != (invoke == NormalizedByteCode.__invokeinterface))
+		if (invoke == NormalizedByteCode.__invokestatic && classFile.MajorVersion >= 52)
+		{
+			// invokestatic may be used to invoke interface methods in Java 8
+		}
+		else if ((cpi is ClassFile.ConstantPoolItemInterfaceMethodref) != (invoke == NormalizedByteCode.__invokeinterface))
 		{
 			throw new VerifyError("Illegal constant pool index");
 		}
@@ -3185,6 +3214,11 @@ sealed class MethodAnalyzer
 											goto not_fault_block;
 										}
 									}
+									if (VerifierTypeWrapper.IsFaultBlockException(codeInfo.GetRawStackTypeWrapper(j, 0))
+										&& codeInfo.GetRawStackTypeWrapper(j, 0) != codeInfo.GetRawStackTypeWrapper(exceptions[i].handlerIndex, 0))
+									{
+										goto not_fault_block;
+									}
 									break;
 							}
 							if (j < current.startIndex || j >= current.endIndex)
@@ -3553,7 +3587,7 @@ sealed class MethodAnalyzer
 			}
 		}
 
-		if(cpi.GetClassType().IsUnloadable || (thisType != null && thisType.IsUnloadable))
+		if(cpi.GetClassType().IsUnloadable)
 		{
 			if(wrapper.GetClassLoader().DisableDynamicBinding)
 			{
@@ -3587,10 +3621,14 @@ sealed class MethodAnalyzer
 				}
 			}
 		}
-		else if(cpi.GetClassType().IsInterface != (invoke == NormalizedByteCode.__invokeinterface))
+		else if(invoke == NormalizedByteCode.__invokeinterface && !cpi.GetClassType().IsInterface)
 		{
 			SetHardError(wrapper.GetClassLoader(), ref instr, HardError.IncompatibleClassChangeError, "invokeinterface on non-interface");
 		}
+		else if(cpi.GetClassType().IsInterface && invoke != NormalizedByteCode.__invokeinterface && (invoke != NormalizedByteCode.__invokestatic || classFile.MajorVersion < 52))
+		{
+			SetHardError(wrapper.GetClassLoader(), ref instr, HardError.IncompatibleClassChangeError, "interface method must be invoked used invokeinterface or invokestatic");
+		}
 		else
 		{
 			MethodWrapper targetMethod = invoke == NormalizedByteCode.__invokespecial ? cpi.GetMethodForInvokespecial() : cpi.GetMethod();
@@ -3603,7 +3641,7 @@ sealed class MethodAnalyzer
 				}
 				else if(targetMethod.IsStatic == (invoke == NormalizedByteCode.__invokestatic))
 				{
-					if(targetMethod.IsAbstract && invoke == NormalizedByteCode.__invokespecial)
+					if(targetMethod.IsAbstract && invoke == NormalizedByteCode.__invokespecial && (targetMethod.GetMethod() == null || targetMethod.GetMethod().IsAbstract))
 					{
 						SetHardError(wrapper.GetClassLoader(), ref instr, HardError.AbstractMethodError, "{0}.{1}{2}", cpi.Class, cpi.Name, cpi.Signature);
 					}
@@ -3721,7 +3759,7 @@ sealed class MethodAnalyzer
 			// We're being called from IsSideEffectFreeStaticInitializer,
 			// no further checks are possible (nor needed).
 		}
-		else if(cpi.GetClassType().IsUnloadable || (thisType != null && thisType.IsUnloadable))
+		else if(cpi.GetClassType().IsUnloadable)
 		{
 			if(wrapper.GetClassLoader().DisableDynamicBinding)
 			{
diff --git a/external/ikvm/runtime/vfs.cs b/external/ikvm/runtime/vfs.cs
index 8db1165..3ff13c3 100644
--- a/external/ikvm/runtime/vfs.cs
+++ b/external/ikvm/runtime/vfs.cs
@@ -39,6 +39,25 @@ namespace IKVM.Internal
 				|| String.CompareOrdinal(path, 0, RootPath, 0, RootPath.Length) == 0;
 		}
 
+		internal static string GetAssemblyClassesPath(Assembly asm)
+		{
+#if FIRST_PASS
+			return null;
+#else
+			// we can't use java.io.File.separatorChar here, because we're invoked by the system property setup code
+			return RootPath + "assembly" + System.IO.Path.DirectorySeparatorChar + VfsAssembliesDirectory.GetName(asm) + System.IO.Path.DirectorySeparatorChar + "classes" + System.IO.Path.DirectorySeparatorChar;
+#endif
+		}
+
+		internal static string GetAssemblyResourcesPath(Assembly asm)
+		{
+#if FIRST_PASS
+			return null;
+#else
+			return RootPath + "assembly" + System.IO.Path.DirectorySeparatorChar + VfsAssembliesDirectory.GetName(asm) + System.IO.Path.DirectorySeparatorChar + "resources" + System.IO.Path.DirectorySeparatorChar;
+#endif
+		}
+
 #if !FIRST_PASS
 		private static VfsDirectory root;
 
@@ -110,25 +129,6 @@ namespace IKVM.Internal
 			}
 		}
 
-		internal static string GetAssemblyClassesPath(Assembly asm)
-		{
-#if FIRST_PASS
-			return null;
-#else
-			// we can't use java.io.File.separatorChar here, because we're invoked by the system property setup code
-			return RootPath + "assembly" + System.IO.Path.DirectorySeparatorChar + VfsAssembliesDirectory.GetName(asm) + System.IO.Path.DirectorySeparatorChar + "classes" + System.IO.Path.DirectorySeparatorChar;
-#endif
-		}
-
-		internal static string GetAssemblyResourcesPath(Assembly asm)
-		{
-#if FIRST_PASS
-			return null;
-#else
-			return RootPath + "assembly" + System.IO.Path.DirectorySeparatorChar + VfsAssembliesDirectory.GetName(asm) + System.IO.Path.DirectorySeparatorChar + "resources" + System.IO.Path.DirectorySeparatorChar;
-#endif
-		}
-
 		private sealed class VfsAssembliesDirectory : VfsDirectory
 		{
 			internal override VfsEntry GetEntry(string name)
@@ -577,7 +577,7 @@ namespace IKVM.Internal
 				{
 					System.IO.MemoryStream mem = new System.IO.MemoryStream();
 					bool includeNonPublicInterfaces = !"true".Equals(java.lang.Props.props.getProperty("ikvm.stubgen.skipNonPublicInterfaces"), StringComparison.OrdinalIgnoreCase);
-					IKVM.StubGen.StubGenerator.WriteClass(mem, tw, includeNonPublicInterfaces, false, false);
+					IKVM.StubGen.StubGenerator.WriteClass(mem, tw, includeNonPublicInterfaces, false, false, false);
 					buf = mem.ToArray();
 				}
 #endif
@@ -985,7 +985,7 @@ namespace IKVM.Internal
 #if FIRST_PASS
 			return false;
 #else
-			return access == IKVM.NativeCode.java.io.Win32FileSystem.ACCESS_READ && GetVfsEntry(path) != null;
+			return access == Java_java_io_Win32FileSystem.ACCESS_READ && GetVfsEntry(path) != null;
 #endif
 		}
 
diff --git a/external/ikvm/runtime/vm.cs b/external/ikvm/runtime/vm.cs
index fd3a615..dbb7ae8 100644
--- a/external/ikvm/runtime/vm.cs
+++ b/external/ikvm/runtime/vm.cs
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Jeroen Frijters
+  Copyright (C) 2002-2013 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -434,11 +434,19 @@ namespace IKVM.Internal
 #if !STATIC_COMPILER && !STUB_GENERATOR
 		internal static object NewAnnotation(java.lang.ClassLoader classLoader, object definition)
 		{
-#if FIRST_PASS
-			return null;
-#else
-			return ikvm. at internal.AnnotationAttributeBase.newAnnotation(classLoader, definition);
+#if !FIRST_PASS
+			java.lang.annotation.Annotation ann = null;
+			try
+			{
+				ann = (java.lang.annotation.Annotation)ikvm. at internal.AnnotationAttributeBase.newAnnotation(classLoader, definition);
+			}
+			catch (java.lang.TypeNotPresentException) { }
+			if (ann != null && sun.reflect.annotation.AnnotationType.getInstance(ann.annotationType()).retention() == java.lang.annotation.RetentionPolicy.RUNTIME)
+			{
+				return ann;
+			}
 #endif
+			return null;
 		}
 #endif
 
@@ -482,4 +490,9 @@ namespace IKVM.Internal
 #endif
 		}
 	}
+
+	static class Experimental
+	{
+		internal static readonly bool JDK_8 = JVM.SafeGetEnvironmentVariable("IKVM_EXPERIMENTAL_JDK_8") != null;
+	}
 }
diff --git a/external/rx/.gitignore b/external/rx/.gitignore
new file mode 100644
index 0000000..907b260
--- /dev/null
+++ b/external/rx/.gitignore
@@ -0,0 +1,3 @@
+.DS_Store
+xpkg
+*.xam
diff --git a/external/rx/Ix/NET/.gitattributes b/external/rx/Ix/NET/.gitattributes
deleted file mode 100644
index 412eeda..0000000
--- a/external/rx/Ix/NET/.gitattributes
+++ /dev/null
@@ -1,22 +0,0 @@
-# Auto detect text files and perform LF normalization
-* text=auto
-
-# Custom for Visual Studio
-*.cs     diff=csharp
-*.sln    merge=union
-*.csproj merge=union
-*.vbproj merge=union
-*.fsproj merge=union
-*.dbproj merge=union
-
-# Standard to msysgit
-*.doc	 diff=astextplain
-*.DOC	 diff=astextplain
-*.docx diff=astextplain
-*.DOCX diff=astextplain
-*.dot  diff=astextplain
-*.DOT  diff=astextplain
-*.pdf  diff=astextplain
-*.PDF	 diff=astextplain
-*.rtf	 diff=astextplain
-*.RTF	 diff=astextplain
diff --git a/external/rx/Ix/NET/.gitignore b/external/rx/Ix/NET/.gitignore
deleted file mode 100644
index 5ebd21a..0000000
--- a/external/rx/Ix/NET/.gitignore
+++ /dev/null
@@ -1,163 +0,0 @@
-#################
-## Eclipse
-#################
-
-*.pydevproject
-.project
-.metadata
-bin/
-tmp/
-*.tmp
-*.bak
-*.swp
-*~.nib
-local.properties
-.classpath
-.settings/
-.loadpath
-
-# External tool builders
-.externalToolBuilders/
-
-# Locally stored "Eclipse launch configurations"
-*.launch
-
-# CDT-specific
-.cproject
-
-# PDT-specific
-.buildpath
-
-
-#################
-## Visual Studio
-#################
-
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-
-# User-specific files
-*.suo
-*.user
-*.sln.docstates
-
-# Build results
-[Dd]ebug/
-[Rr]elease/
-*_i.c
-*_p.c
-*.ilk
-*.meta
-*.obj
-*.pch
-*.pdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.vspscc
-.builds
-*.dotCover
-
-## TODO: If you have NuGet Package Restore enabled, uncomment this
-#packages/
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opensdf
-*.sdf
-
-# Visual Studio profiler
-*.psess
-*.vsp
-
-# ReSharper is a .NET coding add-in
-_ReSharper*
-
-# Installshield output folder
-[Ee]xpress
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish
-
-# Others
-[Bb]in
-[Oo]bj
-sql
-TestResults
-*.Cache
-ClientBin
-stylecop.*
-~$*
-*.dbmdl
-Generated_Code #added for RIA/Silverlight projects
-
-# Backup & report files from converting an old project file to a newer
-# Visual Studio version. Backup files are not needed, because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-
-
-
-############
-## Windows
-############
-
-# Windows image file caches
-Thumbs.db
-
-# Folder config file
-Desktop.ini
-
-
-#############
-## Python
-#############
-
-*.py[co]
-
-# Packages
-*.egg
-*.egg-info
-dist
-build
-eggs
-parts
-bin
-var
-sdist
-develop-eggs
-.installed.cfg
-
-# Installer logs
-pip-log.txt
-
-# Unit test / coverage reports
-.coverage
-.tox
-
-#Translations
-*.mo
-
-#Mr Developer
-.mr.developer.cfg
-
-# Mac crap
-.DS_Store
diff --git a/external/rx/Ix/NET/35MSSharedLib1024.snk b/external/rx/Ix/NET/35MSSharedLib1024.snk
new file mode 100644
index 0000000..695f1b3
Binary files /dev/null and b/external/rx/Ix/NET/35MSSharedLib1024.snk differ
diff --git a/external/rx/Ix/NET/Common.targets b/external/rx/Ix/NET/Common.targets
index 032880f..fc61adf 100644
--- a/external/rx/Ix/NET/Common.targets
+++ b/external/rx/Ix/NET/Common.targets
@@ -1,180 +1,207 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <!--
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug40</Configuration>
-    -->
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <ProductVersion>8.0.30703</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <TargetFrameworkProfile />
   </PropertyGroup>
+  
+  <!--
+       ***********************
+       * SUPPORTED PLATFORMS *
+       ***********************
+   -->
+  
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugPL|AnyCPU' ">
+    <BuildConfig>Debug</BuildConfig>
+    <BuildTarget>PL</BuildTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleasePL|AnyCPU' ">
+    <BuildConfig>Release</BuildConfig>
+    <BuildTarget>PL</BuildTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug45|AnyCPU' ">
+    <BuildConfig>Debug</BuildConfig>
+    <BuildTarget>45</BuildTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release45|AnyCPU' ">
+    <BuildConfig>Release</BuildConfig>
+    <BuildTarget>45</BuildTarget>
+  </PropertyGroup>
 
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug40|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug40\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;DEBUG</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <BuildPlatform>DESKTOPCLR</BuildPlatform>
-    <BuildFlavor>DESKTOPCLR40</BuildFlavor>
+    <BuildConfig>Debug</BuildConfig>
+    <BuildTarget>40</BuildTarget>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release40|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release40\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <BuildConfig>Release</BuildConfig>
+    <BuildTarget>40</BuildTarget>
+  </PropertyGroup>
+
+  <!--
+       ***********************
+       * Legacy Platforms *
+       ***********************
+   -->
+   
+   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug35|AnyCPU' ">
+    <BuildConfig>Debug</BuildConfig>
+    <BuildTarget>35</BuildTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release35|AnyCPU' ">
+    <BuildConfig>Release</BuildConfig>
+    <BuildTarget>35</BuildTarget>
+  </PropertyGroup>
+ 
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugSL5|AnyCPU' ">
+    <BuildConfig>Debug</BuildConfig>
+    <BuildTarget>SL5</BuildTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSL5|AnyCPU' ">
+    <BuildConfig>Release</BuildConfig>
+    <BuildTarget>SL5</BuildTarget>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugWP7|AnyCPU' ">
+    <BuildConfig>Debug</BuildConfig>
+    <BuildTarget>WP7</BuildTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseWP7|AnyCPU' ">
+    <BuildConfig>Release</BuildConfig>
+    <BuildTarget>WP7</BuildTarget>
+  </PropertyGroup>
+
+  
+  <!-- Build properties for each platform, independent of debug/release build -->
+  
+  <PropertyGroup Condition=" '$(BuildTarget)' == 'PL' ">
+    <DefineConstants>$(DefineConstants);HAS_AWAIT</DefineConstants>
+    <TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Profile78</TargetFrameworkProfile>
+    <NoStdLib>true</NoStdLib>
+    <BuildFlavor>DESKTOPCLR45</BuildFlavor>
+  </PropertyGroup>
+  
+  <PropertyGroup Condition=" '$(BuildTarget)' == '45' ">
+    <DefineConstants>$(DefineConstants);HAS_AWAIT;HAS_APTCA</DefineConstants>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <NoStdLib>true</NoStdLib>
     <BuildPlatform>DESKTOPCLR</BuildPlatform>
-    <BuildFlavor>DESKTOPCLR40</BuildFlavor>
+    <BuildFlavor>DESKTOPCLR45</BuildFlavor>
   </PropertyGroup>
+  
+  <PropertyGroup Condition=" '$(Configuration)' == 'TestPL' ">
+    <DefineConstants>$(DefineConstants);HAS_AWAIT;HAS_APTCA;PORTABLE</DefineConstants>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <NoStdLib>true</NoStdLib>
+    <BuildPlatform>DESKTOPCLR</BuildPlatform>
+    <BuildFlavor>DESKTOPCLR45</BuildFlavor>
+  </PropertyGroup>  
 
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug35|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug35\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;DEBUG;NO_VARIANCE;NO_TPL;NO_LARGEARITY;NO_RXINTERFACES;NO_ZIP</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+
+  <PropertyGroup Condition=" '$(BuildTarget)' == '40' ">
+    <DefineConstants>$(DefineConstants);HAS_APTCA</DefineConstants>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <BuildPlatform>DESKTOPCLR</BuildPlatform>
-    <BuildFlavor>DESKTOPCLR20</BuildFlavor>
+    <BuildFlavor>DESKTOPCLR40</BuildFlavor>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release35|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release35\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;NO_VARIANCE;NO_TPL;NO_LARGEARITY;NO_RXINTERFACES;NO_ZIP</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
+
+  <PropertyGroup Condition=" '$(BuildTarget)' == '35' ">
+    <DefineConstants>$(DefineConstants);NO_VARIANCE;NO_TPL;NO_LARGEARITY;NO_RXINTERFACES;NO_ZIP;HAS_APTCA</DefineConstants>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <BuildPlatform>DESKTOPCLR</BuildPlatform>
     <BuildFlavor>DESKTOPCLR20</BuildFlavor>
   </PropertyGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugSL4|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\DebugSL4\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;DEBUG;NO_SERIALIZABLE;NO_TPL;NO_REMOTING;NO_SEMAPHORE;NO_RXINTERFACES</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
+  <PropertyGroup Condition=" '$(BuildTarget)' == 'SL5' ">
+    <DefineConstants>$(DefineConstants);NO_SERIALIZABLE;NO_TPL;NO_REMOTING;NO_SEMAPHORE;NO_RXINTERFACES</DefineConstants>
     <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
     <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
     <SilverlightApplication>false</SilverlightApplication>
     <BuildPlatform>SILVERLIGHT</BuildPlatform>
-    <BuildFlavor>SILVERLIGHT4</BuildFlavor>
+    <BuildFlavor>SILVERLIGHT5</BuildFlavor>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSL4|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\ReleaseSL4\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;NO_SERIALIZABLE;NO_TPL;NO_REMOTING;NO_SEMAPHORE;NO_RXINTERFACES</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
+
+  <PropertyGroup Condition=" '$(BuildTarget)' == 'WP7' ">
+    <DefineConstants>$(DefineConstants);WINDOWSPHONE7;NO_TLS;NO_VARIANCE;NO_SERIALIZABLE;NO_TPL;NO_HASHSET;NO_REMOTING;NO_SEMAPHORE;NO_LARGEARITY;NO_ZIP</DefineConstants>
+    <TargetFrameworkProfile>WindowsPhone71</TargetFrameworkProfile>
     <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
     <SilverlightApplication>false</SilverlightApplication>
     <BuildPlatform>SILVERLIGHT</BuildPlatform>
-    <BuildFlavor>SILVERLIGHT4</BuildFlavor>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugSL5|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\DebugSL5\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;DEBUG;NO_SERIALIZABLE;NO_TPL;NO_REMOTING;NO_SEMAPHORE;NO_RXINTERFACES</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
-    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
-    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
-    <SilverlightApplication>false</SilverlightApplication>
-    <BuildPlatform>SILVERLIGHT</BuildPlatform>
-    <BuildFlavor>SILVERLIGHT5</BuildFlavor>
+    <BuildFlavor>SILVERLIGHTM7</BuildFlavor>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseSL5|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\ReleaseSL5\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;NO_SERIALIZABLE;NO_TPL;NO_REMOTING;NO_SEMAPHORE;NO_RXINTERFACES</DefineConstants>
+
+
+
+
+  <!--
+       ********************
+       * GENERAL SETTINGS *
+       ********************
+   -->
+
+  <!-- All configurations -->
+  <PropertyGroup>
+    <DefineConstants>$(DefineConstants);$(BuildPlatform);$(BuildFlavor);TRACE</DefineConstants>
+    <OutputPath>..\bin\$(BuildConfig)$(BuildTarget)</OutputPath>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
-    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
-    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
-    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
-    <SilverlightApplication>false</SilverlightApplication>
-    <BuildPlatform>SILVERLIGHT</BuildPlatform>
-    <BuildFlavor>SILVERLIGHT5</BuildFlavor>
+    <NoWarn>1591</NoWarn>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugWP7|AnyCPU' ">
+  <!-- Debug configurations -->
+  <PropertyGroup Condition=" '$(BuildConfig)' == 'Debug' ">
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>bin\DebugWP7\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;DEBUG;WINDOWSPHONE7;NO_TLS;NO_VARIANCE;NO_SERIALIZABLE;NO_TPL;NO_HASHSET;NO_REMOTING;NO_SEMAPHORE;NO_LARGEARITY;NO_ZIP</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <TargetFrameworkProfile>WindowsPhone</TargetFrameworkProfile>
-    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
-    <SilverlightApplication>false</SilverlightApplication>
-    <BuildPlatform>SILVERLIGHT</BuildPlatform>
-    <BuildFlavor>SILVERLIGHTM7</BuildFlavor>
+    <DefineConstants>$(DefineConstants);DEBUG</DefineConstants>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseWP7|AnyCPU' ">
+
+  <!-- Release configurations -->
+  <PropertyGroup Condition=" '$(BuildConfig)' == 'Release' ">
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>bin\ReleaseWP7\</OutputPath>
-    <DefineConstants>$(DefineConstants);TRACE;WINDOWSPHONE7;NO_TLS;NO_VARIANCE;NO_SERIALIZABLE;NO_TPL;NO_HASHSET;NO_REMOTING;NO_SEMAPHORE;NO_LARGEARITY;NO_ZIP</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <TargetFrameworkProfile>WindowsPhone</TargetFrameworkProfile>
-    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
-    <SilverlightApplication>false</SilverlightApplication>
-    <BuildPlatform>SILVERLIGHT</BuildPlatform>
-    <BuildFlavor>SILVERLIGHTM7</BuildFlavor>
   </PropertyGroup>
 
-  <PropertyGroup>
-    <DefineConstants>$(DefineConstants);$(BuildPlatform);$(BuildFlavor)</DefineConstants>
+  <PropertyGroup Condition=" '$(NoOpt)' == '1' ">
+    <DefineConstants>$(DefineConstants);NO_PERF</DefineConstants>
   </PropertyGroup>
 
-  <PropertyGroup Condition=" '$(IxRelease)' == 'STABLE' ">
-    <DefineConstants>$(DefineConstants);STABLE</DefineConstants>
-  </PropertyGroup>
+  <ItemGroup Condition=" '$(NoStdLib)' == 'true' ">
+    <Reference Include="mscorlib" />
+  </ItemGroup>
 
-  <PropertyGroup Condition=" '$(ProductSignAssembly)' == 'true' AND '$(SignedBuild)' == '1' ">
-    <DefineConstants>$(DefineConstants);SIGNED</DefineConstants>
-    <SignAssembly>true</SignAssembly>
-    <AssemblyOriginatorKeyFile>..\35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
-    <DelaySign>true</DelaySign>
-  </PropertyGroup>
+  <ItemGroup Condition=" '$(BuildPlatform)' == 'NETCF' ">
+    <Reference Include="System.Core" />
+  </ItemGroup>
 
   <PropertyGroup Condition=" '$(BuildLab)' == '1' ">
     <DefineConstants>$(DefineConstants);NO_CODECOVERAGE</DefineConstants>
   </PropertyGroup>
-  
-  <PropertyGroup>
-    <GetReferenceAssemblyPathsDependsOn>CP_SetBuildReferencePath</GetReferenceAssemblyPathsDependsOn>
+ 
+  <PropertyGroup Condition=" '$(ProductSignAssembly)' == 'true' AND '$(Sign)' == 'Sign' ">
+    <DefineConstants>$(DefineConstants);SIGNED</DefineConstants>
+    <AssemblyOriginatorKeyFile>..\35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
+    <SignKeyId>72</SignKeyId>
+    <SignAssembly>true</SignAssembly>
+    <DelaySign>true</DelaySign>
   </PropertyGroup>
-  <Target Name="CP_SetBuildReferencePath">
-    <PropertyGroup>
-      <TargetFrameworkDirectory>$(ProjectDir)..\..\..\References\$(BuildFlavor)</TargetFrameworkDirectory>
-    </PropertyGroup>
-  </Target>
-
+  
+ <PropertyGroup>
+   <GetReferenceAssemblyPathsDependsOn>CP_SetBuildReferencePath</GetReferenceAssemblyPathsDependsOn>
+ </PropertyGroup>
+ <Target Name="CP_SetBuildReferencePath">
+   <PropertyGroup>
+     <TargetFrameworkDirectory>$(ProjectDir)..\..\References\$(BuildFlavor)</TargetFrameworkDirectory>
+   </PropertyGroup>
+ </Target>
+  
 </Project>
\ No newline at end of file
diff --git a/external/rx/Ix/NET/Enumerable.cs b/external/rx/Ix/NET/Enumerable.cs
index dcb000c..1888acd 100644
--- a/external/rx/Ix/NET/Enumerable.cs
+++ b/external/rx/Ix/NET/Enumerable.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Threading;
diff --git a/external/rx/Ix/NET/Import.targets b/external/rx/Ix/NET/Import.targets
index fb23483..1a23c44 100644
--- a/external/rx/Ix/NET/Import.targets
+++ b/external/rx/Ix/NET/Import.targets
@@ -1,16 +1,32 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
   <!-- Non-Portable Library build -->
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And ('$(BuildPlatform)' == 'DESKTOPCLR' Or '$(BuildPlatform)' == 'XNA') " />
+  <Import 
+	Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" 
+	Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildPlatform)' == 'DESKTOPCLR' " />
+
+  <!-- Silverlight ONLY (i.e., not phone) -->
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildPlatform)' == 'SILVERLIGHT' AND !('$(BuildFlavor)' == 'SILVERLIGHTM7') " />
+  
+  <!-- Windows Phone 7.1 (Silverlight for Phone) -->
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\Silverlight for Phone\$(TargetFrameworkVersion)\Microsoft.Silverlight.$(TargetFrameworkProfile).Overrides.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildFlavor)' == 'SILVERLIGHTM7' " />
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\Silverlight for Phone\$(TargetFrameworkVersion)\Microsoft.Silverlight.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildFlavor)' == 'SILVERLIGHTM7' " />
-  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\Microsoft.Xna.GameStudio.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildPlatform)' == 'XNA' "/>
-
+  
+  
+<!--   <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\Microsoft.Xna.GameStudio.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildPlatform)' == 'XNA' "/>
+ -->
+  
   <!-- Portable Library Build -->
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' == '.NETPortable' " />
-
-  <Target Name="AfterBuild" Condition=" '$(ProductSignAssembly)' == 'true' AND '$(SignedBuild)' == '1' ">
-    <WriteLinesToFile File="$(OutDir)\$(TargetFileName).sign" Overwrite="true" Lines="Auto-generated file. Indicates the corresponding binary file needs to be signed." />
+  
+  <!-- If "Sign" is set and assembly should be signed, generate a .sign file-->
+  <Target Name="AfterBuild"
+          Condition=" '$(ProductSignAssembly)' == 'true' AND '$(Sign)' == 'Sign' ">
+    <WriteLinesToFile
+        File="$(OutDir)\$(TargetFileName).sign"
+        Overwrite="true"
+        Lines="Auto-generated file, indicates the corresponding binary file needs to be signed." />
   </Target>
+  
 </Project>
diff --git a/external/rx/Ix/NET/Interactive Extensions.sln b/external/rx/Ix/NET/Interactive Extensions.sln
index 5fbfed0..4e856ca 100644
--- a/external/rx/Ix/NET/Interactive Extensions.sln	
+++ b/external/rx/Ix/NET/Interactive Extensions.sln	
@@ -22,309 +22,123 @@ Global
 	EndGlobalSection
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
-		Debug|Mixed Platforms = Debug|Mixed Platforms
-		Debug|x86 = Debug|x86
 		Debug35|Any CPU = Debug35|Any CPU
-		Debug35|Mixed Platforms = Debug35|Mixed Platforms
-		Debug35|x86 = Debug35|x86
 		Debug40|Any CPU = Debug40|Any CPU
-		Debug40|Mixed Platforms = Debug40|Mixed Platforms
-		Debug40|x86 = Debug40|x86
+		Debug45|Any CPU = Debug45|Any CPU
 		DebugPL|Any CPU = DebugPL|Any CPU
-		DebugPL|Mixed Platforms = DebugPL|Mixed Platforms
-		DebugPL|x86 = DebugPL|x86
-		DebugSL4|Any CPU = DebugSL4|Any CPU
-		DebugSL4|Mixed Platforms = DebugSL4|Mixed Platforms
-		DebugSL4|x86 = DebugSL4|x86
 		DebugSL5|Any CPU = DebugSL5|Any CPU
-		DebugSL5|Mixed Platforms = DebugSL5|Mixed Platforms
-		DebugSL5|x86 = DebugSL5|x86
 		DebugWP7|Any CPU = DebugWP7|Any CPU
-		DebugWP7|Mixed Platforms = DebugWP7|Mixed Platforms
-		DebugWP7|x86 = DebugWP7|x86
 		Release|Any CPU = Release|Any CPU
-		Release|Mixed Platforms = Release|Mixed Platforms
-		Release|x86 = Release|x86
 		Release35|Any CPU = Release35|Any CPU
-		Release35|Mixed Platforms = Release35|Mixed Platforms
-		Release35|x86 = Release35|x86
 		Release40|Any CPU = Release40|Any CPU
-		Release40|Mixed Platforms = Release40|Mixed Platforms
-		Release40|x86 = Release40|x86
+		Release45|Any CPU = Release45|Any CPU
 		ReleasePL|Any CPU = ReleasePL|Any CPU
-		ReleasePL|Mixed Platforms = ReleasePL|Mixed Platforms
-		ReleasePL|x86 = ReleasePL|x86
-		ReleaseSL4|Any CPU = ReleaseSL4|Any CPU
-		ReleaseSL4|Mixed Platforms = ReleaseSL4|Mixed Platforms
-		ReleaseSL4|x86 = ReleaseSL4|x86
 		ReleaseSL5|Any CPU = ReleaseSL5|Any CPU
-		ReleaseSL5|Mixed Platforms = ReleaseSL5|Mixed Platforms
-		ReleaseSL5|x86 = ReleaseSL5|x86
 		ReleaseWP7|Any CPU = ReleaseWP7|Any CPU
-		ReleaseWP7|Mixed Platforms = ReleaseWP7|Mixed Platforms
-		ReleaseWP7|x86 = ReleaseWP7|x86
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU
+		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug|Any CPU.Build.0 = Debug45|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug35|Mixed Platforms.Build.0 = Debug35|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug35|x86.ActiveCfg = Debug35|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug40|Any CPU.ActiveCfg = Debug40|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug40|Any CPU.Build.0 = Debug40|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug40|x86.ActiveCfg = Debug40|Any CPU
+		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL4|Mixed Platforms.Build.0 = DebugSL4|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL4|x86.ActiveCfg = DebugSL4|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL5|Any CPU.ActiveCfg = DebugSL5|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL5|Any CPU.Build.0 = DebugSL5|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL5|Mixed Platforms.ActiveCfg = DebugSL5|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL5|Mixed Platforms.Build.0 = DebugSL5|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugSL5|x86.ActiveCfg = DebugSL5|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugWP7|Any CPU.ActiveCfg = DebugWP7|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugWP7|Any CPU.Build.0 = DebugWP7|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugWP7|Mixed Platforms.Build.0 = DebugWP7|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release|Any CPU.ActiveCfg = Release45|Any CPU
+		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release|Any CPU.Build.0 = Release45|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release35|Any CPU.Build.0 = Release35|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release35|Mixed Platforms.Build.0 = Release35|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release35|x86.ActiveCfg = Release35|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release40|Any CPU.ActiveCfg = Release40|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release40|Any CPU.Build.0 = Release40|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release40|x86.ActiveCfg = Release40|Any CPU
+		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{8E4B04F0-915E-48F9-9796-76278C6094BD}.Release45|Any CPU.Build.0 = Release45|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL4|Mixed Platforms.Build.0 = ReleaseSL4|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL4|x86.ActiveCfg = ReleaseSL4|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL5|Any CPU.ActiveCfg = ReleaseSL5|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL5|Any CPU.Build.0 = ReleaseSL5|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL5|Mixed Platforms.ActiveCfg = ReleaseSL5|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL5|Mixed Platforms.Build.0 = ReleaseSL5|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseSL5|x86.ActiveCfg = ReleaseSL5|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseWP7|Any CPU.ActiveCfg = ReleaseWP7|Any CPU
 		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseWP7|Any CPU.Build.0 = ReleaseWP7|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseWP7|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
-		{8E4B04F0-915E-48F9-9796-76278C6094BD}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug|Any CPU.ActiveCfg = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug|Any CPU.Build.0 = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug|Mixed Platforms.Build.0 = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug|x86.ActiveCfg = DebugWP7|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug|Any CPU.Build.0 = Debug45|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug35|Mixed Platforms.Build.0 = Debug35|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug35|x86.ActiveCfg = Debug35|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug40|Any CPU.ActiveCfg = Debug40|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug40|Any CPU.Build.0 = Debug40|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug40|x86.ActiveCfg = Debug40|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugPL|Any CPU.ActiveCfg = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugPL|Any CPU.Build.0 = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugPL|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugPL|Mixed Platforms.Build.0 = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugPL|x86.ActiveCfg = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL4|Mixed Platforms.Build.0 = DebugSL4|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL4|x86.ActiveCfg = DebugSL4|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugPL|Any CPU.ActiveCfg = TestPL|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugPL|Any CPU.Build.0 = TestPL|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL5|Any CPU.ActiveCfg = DebugSL5|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL5|Any CPU.Build.0 = DebugSL5|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL5|Mixed Platforms.ActiveCfg = DebugSL5|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL5|Mixed Platforms.Build.0 = DebugSL5|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugSL5|x86.ActiveCfg = DebugSL5|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugWP7|Any CPU.ActiveCfg = DebugWP7|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugWP7|Any CPU.Build.0 = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugWP7|Mixed Platforms.Build.0 = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release|Any CPU.ActiveCfg = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release|Any CPU.Build.0 = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release|x86.ActiveCfg = ReleaseWP7|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release|Any CPU.ActiveCfg = Release45|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release|Any CPU.Build.0 = Release45|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release35|Any CPU.Build.0 = Release35|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release35|Mixed Platforms.Build.0 = Release35|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release35|x86.ActiveCfg = Release35|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release40|Any CPU.ActiveCfg = Release40|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release40|Any CPU.Build.0 = Release40|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release40|x86.ActiveCfg = Release40|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleasePL|Any CPU.ActiveCfg = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleasePL|Any CPU.Build.0 = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleasePL|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleasePL|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleasePL|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL4|Mixed Platforms.Build.0 = ReleaseSL4|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL4|x86.ActiveCfg = ReleaseSL4|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.Release45|Any CPU.Build.0 = Release45|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleasePL|Any CPU.ActiveCfg = TestPL|Any CPU
+		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleasePL|Any CPU.Build.0 = TestPL|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL5|Any CPU.ActiveCfg = ReleaseSL5|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL5|Any CPU.Build.0 = ReleaseSL5|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL5|Mixed Platforms.ActiveCfg = ReleaseSL5|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL5|Mixed Platforms.Build.0 = ReleaseSL5|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseSL5|x86.ActiveCfg = ReleaseSL5|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseWP7|Any CPU.ActiveCfg = ReleaseWP7|Any CPU
 		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseWP7|Any CPU.Build.0 = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseWP7|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
-		{C4C8532A-F8D2-428B-962E-FD578A1E647C}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU
+		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug|Any CPU.Build.0 = Debug45|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug35|Mixed Platforms.Build.0 = Debug35|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug35|x86.ActiveCfg = Debug35|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug40|Any CPU.ActiveCfg = Debug40|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug40|Any CPU.Build.0 = Debug40|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug40|x86.ActiveCfg = Debug40|Any CPU
+		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL4|Mixed Platforms.Build.0 = DebugSL4|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL4|x86.ActiveCfg = DebugSL4|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL5|Any CPU.ActiveCfg = DebugSL5|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL5|Any CPU.Build.0 = DebugSL5|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL5|Mixed Platforms.ActiveCfg = DebugSL5|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL5|Mixed Platforms.Build.0 = DebugSL5|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugSL5|x86.ActiveCfg = DebugSL5|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugWP7|Any CPU.ActiveCfg = DebugWP7|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release|Any CPU.ActiveCfg = Release45|Any CPU
+		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release|Any CPU.Build.0 = Release45|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release35|Any CPU.Build.0 = Release35|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release35|Mixed Platforms.Build.0 = Release35|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release35|x86.ActiveCfg = Release35|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release40|Any CPU.ActiveCfg = Release40|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release40|Any CPU.Build.0 = Release40|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release40|x86.ActiveCfg = Release40|Any CPU
+		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.Release45|Any CPU.Build.0 = Release45|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL4|Mixed Platforms.Build.0 = ReleaseSL4|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL4|x86.ActiveCfg = ReleaseSL4|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL5|Any CPU.ActiveCfg = ReleaseSL5|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL5|Any CPU.Build.0 = ReleaseSL5|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL5|Mixed Platforms.ActiveCfg = ReleaseSL5|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL5|Mixed Platforms.Build.0 = ReleaseSL5|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseSL5|x86.ActiveCfg = ReleaseSL5|Any CPU
 		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseWP7|Any CPU.ActiveCfg = ReleaseWP7|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
-		{6D62E966-469D-4A99-BD43-0A17FA14FB4F}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug|Any CPU.ActiveCfg = Debug45|Any CPU
+		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug|Any CPU.Build.0 = Debug45|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug35|x86.ActiveCfg = Debug35|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug40|Any CPU.ActiveCfg = Debug40|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug40|Any CPU.Build.0 = Debug40|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug40|x86.ActiveCfg = Debug40|Any CPU
+		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{7269A578-326A-4C3E-9874-A2D2600095BC}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugSL4|x86.ActiveCfg = DebugSL4|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugSL5|Any CPU.ActiveCfg = DebugSL5|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugSL5|Mixed Platforms.ActiveCfg = DebugSL5|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugSL5|x86.ActiveCfg = DebugSL5|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugWP7|Any CPU.ActiveCfg = DebugWP7|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release|Any CPU.ActiveCfg = Release45|Any CPU
+		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release|Any CPU.Build.0 = Release45|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release35|x86.ActiveCfg = Release35|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release40|Any CPU.ActiveCfg = Release40|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release40|Any CPU.Build.0 = Release40|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release40|x86.ActiveCfg = Release40|Any CPU
+		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{7269A578-326A-4C3E-9874-A2D2600095BC}.Release45|Any CPU.Build.0 = Release45|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseSL4|x86.ActiveCfg = ReleaseSL4|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseSL5|Any CPU.ActiveCfg = ReleaseSL5|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseSL5|Mixed Platforms.ActiveCfg = ReleaseSL5|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseSL5|x86.ActiveCfg = ReleaseSL5|Any CPU
 		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseWP7|Any CPU.ActiveCfg = ReleaseWP7|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
-		{7269A578-326A-4C3E-9874-A2D2600095BC}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/external/rx/Ix/NET/Ix_Xamarin/InteractiveExtensionsForAndroid.nuspec b/external/rx/Ix/NET/Ix_Xamarin/InteractiveExtensionsForAndroid.nuspec
new file mode 100644
index 0000000..d03891c
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/InteractiveExtensionsForAndroid.nuspec
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package >
+  <metadata>
+    <id>InteractiveExtensionsForAndroid</id>
+    <version>2.1.0</version>
+    <authors>Microsoft Open Technologies, Inc</authors>
+    <owners>Xamarin Inc.</owners>
+    <licenseUrl>https://raw.github.com/mono/rx/master/Ix/NET/license.txt</licenseUrl>
+    <projectUrl>https://github.com/mono/rx</projectUrl>
+    <iconUrl>https://raw.github.com/mono/rx/master/Ix/NET/Resources/Artwork/Logo_Color.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators. (Android)</description>
+    <releaseNotes>Initial NuGet package release. WARNING: this won't work as expected if you are not using Xamarin.Android v4.7.x or later, which ships with some runtime bugfixes.</releaseNotes>
+    <copyright>Copyright (c) Microsoft Open Technologies, Inc.  All rights reserved.</copyright>
+    <tags>Ix Interactive Linq Xamarin Android</tags>
+    <frameworkAssemblies>
+      <frameworkAssembly assemblyName="System.Core" targetFramework="MonoAndroid" />
+    </frameworkAssemblies>
+  </metadata>
+  <files>
+	<file target="lib/MonoAndroid" src="android/ix/System.Interactive/bin/Release/System.Interactive.dll" />
+	<file target="lib/MonoAndroid" src="android/ix/System.Interactive.Async/bin/Release/System.Interactive.Async.dll" />
+	<file target="lib/MonoAndroid" src="android/ix/System.Interactive.Providers/bin/Release/System.Interactive.Providers.dll" />
+  </files>
+</package>
diff --git a/external/rx/Ix/NET/Ix_Xamarin/Ix_Xamarin_android.sln b/external/rx/Ix/NET/Ix_Xamarin/Ix_Xamarin_android.sln
new file mode 100644
index 0000000..f7a2e14
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/Ix_Xamarin_android.sln
@@ -0,0 +1,36 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "android_System.Interactive", "android\ix\System.Interactive\android_System.Interactive.csproj", "{5F7F40B6-19D3-48C7-8E15-AE1F976F60E1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "android_System.Interactive.Async", "android\ix\System.Interactive.Async\android_System.Interactive.Async.csproj", "{065F2411-7610-4AD6-9513-A1EFFCE576C0}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "android_System.Interactive.Providers", "android\ix\System.Interactive.Providers\android_System.Interactive.Providers.csproj", "{C4037060-1692-4423-B29E-76F3A74A72A5}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{065F2411-7610-4AD6-9513-A1EFFCE576C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{065F2411-7610-4AD6-9513-A1EFFCE576C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{065F2411-7610-4AD6-9513-A1EFFCE576C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{065F2411-7610-4AD6-9513-A1EFFCE576C0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5F7F40B6-19D3-48C7-8E15-AE1F976F60E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5F7F40B6-19D3-48C7-8E15-AE1F976F60E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5F7F40B6-19D3-48C7-8E15-AE1F976F60E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5F7F40B6-19D3-48C7-8E15-AE1F976F60E1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C4037060-1692-4423-B29E-76F3A74A72A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C4037060-1692-4423-B29E-76F3A74A72A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C4037060-1692-4423-B29E-76F3A74A72A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C4037060-1692-4423-B29E-76F3A74A72A5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = android\ix\System.Interactive\android_System.Interactive.csproj
+	EndGlobalSection
+EndGlobal
diff --git a/external/rx/Ix/NET/Ix_Xamarin/Ix_Xamarin_iOS.sln b/external/rx/Ix/NET/Ix_Xamarin/Ix_Xamarin_iOS.sln
new file mode 100644
index 0000000..2fadee3
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/Ix_Xamarin_iOS.sln
@@ -0,0 +1,9 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive.Async/android_System.Interactive.Async.csproj b/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive.Async/android_System.Interactive.Async.csproj
new file mode 100644
index 0000000..e3f83a3
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive.Async/android_System.Interactive.Async.csproj
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{065F2411-7610-4AD6-9513-A1EFFCE576C0}</ProjectGuid>
+    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <RootNamespace>System.Reactive</RootNamespace>
+    <AssemblyName>System.Interactive.Async</AssemblyName>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>True</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AndroidLinkMode>None</AndroidLinkMode>
+    <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>False</ConsolePause>
+    <AndroidLinkMode>SdkOnly</AndroidLinkMode>
+    <AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+
+
+    <!--
+    <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
+      <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
+      <Name>Android.NUnitLite</Name>
+    </ProjectReference>
+    -->
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\..\..\System.Interactive.Async\AsyncEnumerable.Conversions.cs">
+      <Link>AsyncEnumerable.Conversions.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\AsyncEnumerable.Creation.cs">
+      <Link>AsyncEnumerable.Creation.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\AsyncEnumerable.Exceptions.cs">
+      <Link>AsyncEnumerable.Exceptions.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\AsyncEnumerable.Generated.cs">
+      <Link>AsyncEnumerable.Generated.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\AsyncEnumerable.Single.cs">
+      <Link>AsyncEnumerable.Single.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\AsyncEnumerable.Multiple.cs">
+      <Link>AsyncEnumerable.Multiple.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\AsyncEnumerable.Aggregates.cs">
+      <Link>AsyncEnumerable.Aggregates.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\AsyncEnumerator.cs">
+      <Link>AsyncEnumerator.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\Disposables.cs">
+      <Link>Disposables.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\EnumerableGrouping.cs">
+      <Link>EnumerableGrouping.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\IAsyncEnumerable.cs">
+      <Link>IAsyncEnumerable.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\IAsyncEnumerator.cs">
+      <Link>IAsyncEnumerator.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\IAsyncGrouping.cs">
+      <Link>IAsyncGrouping.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\IOrderedAsyncEnumerable.cs">
+      <Link>IOrderedAsyncEnumerable.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Async\TaskExt.cs">
+      <Link>TaskExt.cs</Link>
+    </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
+</Project>
diff --git a/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive.Providers/android_System.Interactive.Providers.csproj b/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive.Providers/android_System.Interactive.Providers.csproj
new file mode 100644
index 0000000..13a06d9
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive.Providers/android_System.Interactive.Providers.csproj
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C4037060-1692-4423-B29E-76F3A74A72A5}</ProjectGuid>
+    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <RootNamespace>System.Reactive</RootNamespace>
+    <AssemblyName>System.Interactive.Providers</AssemblyName>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>True</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AndroidLinkMode>None</AndroidLinkMode>
+    <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>False</ConsolePause>
+    <AndroidLinkMode>SdkOnly</AndroidLinkMode>
+    <AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+
+<ProjectReference Include="..\System.Interactive\android_System.Interactive.csproj">
+  <Project>{8E4B04F0-915E-48F9-9796-76278C6094BD}</Project>
+  <Name>android_System.Interactive</Name>
+</ProjectReference>
+    <!--
+    <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
+      <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
+      <Name>Android.NUnitLite</Name>
+    </ProjectReference>
+    -->
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\..\..\System.Interactive.Providers\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive.Providers\QueryableEx.cs">
+      <Link>QueryableEx.cs</Link>
+    </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
+</Project>
diff --git a/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive/android_System.Interactive.csproj b/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive/android_System.Interactive.csproj
new file mode 100644
index 0000000..c1fa23e
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/android/ix/System.Interactive/android_System.Interactive.csproj
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5F7F40B6-19D3-48C7-8E15-AE1F976F60E1}</ProjectGuid>
+    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <RootNamespace>System.Reactive</RootNamespace>
+    <AssemblyName>System.Interactive</AssemblyName>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>True</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AndroidLinkMode>None</AndroidLinkMode>
+    <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>False</ConsolePause>
+    <AndroidLinkMode>SdkOnly</AndroidLinkMode>
+    <AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+
+
+    <!--
+    <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
+      <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
+      <Name>Android.NUnitLite</Name>
+    </ProjectReference>
+    -->
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\..\..\System.Interactive\IAwaitable.cs">
+      <Link>IAwaitable.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\EnumerableEx.Imperative.cs">
+      <Link>EnumerableEx.Imperative.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\EnumerableEx.Multiple.cs">
+      <Link>EnumerableEx.Multiple.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\EnumerableEx.Single.cs">
+      <Link>EnumerableEx.Single.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\EnumerableEx.Exceptions.cs">
+      <Link>EnumerableEx.Exceptions.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\EnumerableEx.Creation.cs">
+      <Link>EnumerableEx.Creation.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\EnumerableEx.Buffering.cs">
+      <Link>EnumerableEx.Buffering.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\EnumerableEx.Aggregates.cs">
+      <Link>EnumerableEx.Aggregates.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\IYielder.cs">
+      <Link>IYielder.cs</Link>
+    </Compile>
+    <Compile Include="..\..\..\..\System.Interactive\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
+</Project>
diff --git a/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive.Async/ios_System.Interactive.Async.csproj b/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive.Async/ios_System.Interactive.Async.csproj
new file mode 100644
index 0000000..bfd438f
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive.Async/ios_System.Interactive.Async.csproj
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{220AD2F1-FEE9-4514-8F36-6BE37F0AAD7F}</ProjectGuid>
+    <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>System.Reactive</RootNamespace>
+    <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
+    <AssemblyName>System.Interactive.Async</AssemblyName>
+    <ProductSignAssembly>true</ProductSignAssembly>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
+    <additionalargs>-delaySign</additionalargs>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>True</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <ConsolePause>False</ConsolePause>
+    <WarningLevel>4</WarningLevel>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ConsolePause>False</ConsolePause>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <!--
+    <TargetFrameworkIdentifier>iOS</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v2.0.5</TargetFrameworkVersion>
+    -->
+    <!-- NoStdLib>true</NoStdLib -->
+    <BuildPlatform>MOBILE</BuildPlatform>
+    <BuildFlavor>MONOTOUCH</BuildFlavor>
+  </PropertyGroup>
+  <Import Project="..\..\..\Common.targets" />
+  <PropertyGroup>
+    <DocumentationFile>$(OutputPath)\$(AssemblyName).XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="MonoTouch.NUnitLite" />
+    
+  </ItemGroup>
+  <ItemGroup>
+    
+    <!--
+    <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
+      <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
+      <Name>Android.NUnitLite</Name>
+    </ProjectReference>
+    -->
+  </ItemGroup>
+  <ItemGroup>
+        <Compile Include="../../../../System.Interactive.Async/AsyncEnumerable.Conversions.cs">
+      <Link>AsyncEnumerable.Conversions.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/AsyncEnumerable.Creation.cs">
+      <Link>AsyncEnumerable.Creation.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/AsyncEnumerable.Exceptions.cs">
+      <Link>AsyncEnumerable.Exceptions.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/AsyncEnumerable.Generated.cs">
+      <Link>AsyncEnumerable.Generated.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/AsyncEnumerable.Single.cs">
+      <Link>AsyncEnumerable.Single.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/AsyncEnumerable.Multiple.cs">
+      <Link>AsyncEnumerable.Multiple.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/AsyncEnumerable.Aggregates.cs">
+      <Link>AsyncEnumerable.Aggregates.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/AsyncEnumerator.cs">
+      <Link>AsyncEnumerator.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/Disposables.cs">
+      <Link>Disposables.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/EnumerableGrouping.cs">
+      <Link>EnumerableGrouping.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/IAsyncEnumerable.cs">
+      <Link>IAsyncEnumerable.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/IAsyncEnumerator.cs">
+      <Link>IAsyncEnumerator.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/IAsyncGrouping.cs">
+      <Link>IAsyncGrouping.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/IOrderedAsyncEnumerable.cs">
+      <Link>IOrderedAsyncEnumerable.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/Properties/AssemblyInfo.cs">
+      <Link>Properties/AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Async/TaskExt.cs">
+      <Link>TaskExt.cs</Link>
+    </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+</Project>
diff --git a/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive.Providers/ios_System.Interactive.Providers.csproj b/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive.Providers/ios_System.Interactive.Providers.csproj
new file mode 100644
index 0000000..1798458
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive.Providers/ios_System.Interactive.Providers.csproj
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{4779C7FF-6969-4715-9389-DF6C43655D6F}</ProjectGuid>
+    <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>System.Reactive</RootNamespace>
+    <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
+    <AssemblyName>System.Interactive.Providers</AssemblyName>
+    <ProductSignAssembly>true</ProductSignAssembly>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
+    <additionalargs>-delaySign</additionalargs>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>True</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <ConsolePause>False</ConsolePause>
+    <WarningLevel>4</WarningLevel>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ConsolePause>False</ConsolePause>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <!--
+    <TargetFrameworkIdentifier>iOS</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v2.0.5</TargetFrameworkVersion>
+    -->
+    <!-- NoStdLib>true</NoStdLib -->
+    <BuildPlatform>MOBILE</BuildPlatform>
+    <BuildFlavor>MONOTOUCH</BuildFlavor>
+  </PropertyGroup>
+  <Import Project="..\..\..\Common.targets" />
+  <PropertyGroup>
+    <DocumentationFile>$(OutputPath)\$(AssemblyName).XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="MonoTouch.NUnitLite" />
+    
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\System.Interactive\ios_System.Interactive.csproj">
+  <Project>{8E4B04F0-915E-48F9-9796-76278C6094BD}</Project>
+  <Name>ios_System.Interactive</Name>
+</ProjectReference>
+    <!--
+    <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
+      <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
+      <Name>Android.NUnitLite</Name>
+    </ProjectReference>
+    -->
+  </ItemGroup>
+  <ItemGroup>
+        <Compile Include="../../../../System.Interactive.Providers/Properties/AssemblyInfo.cs">
+      <Link>Properties/AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive.Providers/QueryableEx.cs">
+      <Link>QueryableEx.cs</Link>
+    </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+</Project>
diff --git a/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive/ios_System.Interactive.csproj b/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive/ios_System.Interactive.csproj
new file mode 100644
index 0000000..0708b51
--- /dev/null
+++ b/external/rx/Ix/NET/Ix_Xamarin/iOS/ix/System.Interactive/ios_System.Interactive.csproj
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{AD6FCBE9-0F6A-4F27-8147-17AB1C8799A2}</ProjectGuid>
+    <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>System.Reactive</RootNamespace>
+    <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
+    <AssemblyName>System.Interactive</AssemblyName>
+    <ProductSignAssembly>true</ProductSignAssembly>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
+    <additionalargs>-delaySign</additionalargs>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>True</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>False</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <ConsolePause>False</ConsolePause>
+    <WarningLevel>4</WarningLevel>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>True</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ConsolePause>False</ConsolePause>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <!--
+    <TargetFrameworkIdentifier>iOS</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v2.0.5</TargetFrameworkVersion>
+    -->
+    <!-- NoStdLib>true</NoStdLib -->
+    <BuildPlatform>MOBILE</BuildPlatform>
+    <BuildFlavor>MONOTOUCH</BuildFlavor>
+  </PropertyGroup>
+  <Import Project="..\..\..\Common.targets" />
+  <PropertyGroup>
+    <DocumentationFile>$(OutputPath)\$(AssemblyName).XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="MonoTouch.NUnitLite" />
+    
+  </ItemGroup>
+  <ItemGroup>
+    
+    <!--
+    <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
+      <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
+      <Name>Android.NUnitLite</Name>
+    </ProjectReference>
+    -->
+  </ItemGroup>
+  <ItemGroup>
+        <Compile Include="../../../../System.Interactive/IAwaitable.cs">
+      <Link>IAwaitable.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/EnumerableEx.Imperative.cs">
+      <Link>EnumerableEx.Imperative.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/EnumerableEx.Multiple.cs">
+      <Link>EnumerableEx.Multiple.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/EnumerableEx.Single.cs">
+      <Link>EnumerableEx.Single.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/EnumerableEx.Exceptions.cs">
+      <Link>EnumerableEx.Exceptions.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/EnumerableEx.Creation.cs">
+      <Link>EnumerableEx.Creation.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/EnumerableEx.Buffering.cs">
+      <Link>EnumerableEx.Buffering.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/EnumerableEx.Aggregates.cs">
+      <Link>EnumerableEx.Aggregates.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/IYielder.cs">
+      <Link>IYielder.cs</Link>
+    </Compile>
+    <Compile Include="../../../../System.Interactive/Properties/AssemblyInfo.cs">
+      <Link>Properties/AssemblyInfo.cs</Link>
+    </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+</Project>
diff --git a/external/rx/Ix/NET/System.Interactive.Async/IAsyncEnumerable.cs b/external/rx/Ix/NET/System.Interactive.Async/IAsyncEnumerable.cs
index 8d892e1..d6c9874 100644
--- a/external/rx/Ix/NET/System.Interactive.Async/IAsyncEnumerable.cs
+++ b/external/rx/Ix/NET/System.Interactive.Async/IAsyncEnumerable.cs
@@ -9,8 +9,8 @@ namespace System.Collections.Generic
     /// </summary>
     /// <typeparam name="T">Element type.</typeparam>
     public interface IAsyncEnumerable<
-#if DESKTOPCLR40 || SILVERLIGHT4
-        out
+#if !NO_VARIANCE
+out
 #endif
         T>
     {
diff --git a/external/rx/Ix/NET/System.Interactive.Async/IAsyncEnumerator.cs b/external/rx/Ix/NET/System.Interactive.Async/IAsyncEnumerator.cs
index 72cfdbc..d0f0c2b 100644
--- a/external/rx/Ix/NET/System.Interactive.Async/IAsyncEnumerator.cs
+++ b/external/rx/Ix/NET/System.Interactive.Async/IAsyncEnumerator.cs
@@ -11,8 +11,8 @@ namespace System.Collections.Generic
     /// </summary>
     /// <typeparam name="T">Element type.</typeparam>
     public interface IAsyncEnumerator<
-#if DESKTOPCLR40 || SILVERLIGHT4
-        out
+#if !NO_VARIANCE
+out
 #endif
         T> : IDisposable
     {
diff --git a/external/rx/Ix/NET/System.Interactive.Async/IAsyncGrouping.cs b/external/rx/Ix/NET/System.Interactive.Async/IAsyncGrouping.cs
index 61abc60..39a5d73 100644
--- a/external/rx/Ix/NET/System.Interactive.Async/IAsyncGrouping.cs
+++ b/external/rx/Ix/NET/System.Interactive.Async/IAsyncGrouping.cs
@@ -5,11 +5,11 @@ using System.Collections.Generic;
 namespace System.Linq
 {
     public interface IAsyncGrouping<
-#if DESKTOPCLR4 || SILVERLIGHT4
+#if !NO_VARIANCE
         out 
 #endif
         TKey,
-#if DESKTOPCLR4 || SILVERLIGHT4
+#if !NO_VARIANCE
         out 
 #endif
         TElement> : IAsyncEnumerable<TElement>
diff --git a/external/rx/Ix/NET/System.Interactive.Async/IOrderedAsyncEnumerable.cs b/external/rx/Ix/NET/System.Interactive.Async/IOrderedAsyncEnumerable.cs
index a1e430d..bfac7f5 100644
--- a/external/rx/Ix/NET/System.Interactive.Async/IOrderedAsyncEnumerable.cs
+++ b/external/rx/Ix/NET/System.Interactive.Async/IOrderedAsyncEnumerable.cs
@@ -5,8 +5,8 @@ using System.Collections.Generic;
 namespace System.Linq
 {
     public interface IOrderedAsyncEnumerable<
-#if DESKTOPCLR4 || SILVERLIGHT4
-        out 
+#if !NO_VARIANCE
+out 
 #endif
         TElement> : IAsyncEnumerable<TElement>
     {
diff --git a/external/rx/Ix/NET/System.Interactive.Async/Properties/AssemblyInfo.cs b/external/rx/Ix/NET/System.Interactive.Async/Properties/AssemblyInfo.cs
index b887de0..7f41c3a 100644
--- a/external/rx/Ix/NET/System.Interactive.Async/Properties/AssemblyInfo.cs
+++ b/external/rx/Ix/NET/System.Interactive.Async/Properties/AssemblyInfo.cs
@@ -12,13 +12,9 @@ using System.Security;
 #else
 [assembly: AssemblyConfiguration("Retail")]
 #endif
-[assembly: AssemblyCompany("Microsoft Corporation")]
-#if STABLE
+[assembly: AssemblyCompany("Microsoft Open Technologies, Inc.")]
 [assembly: AssemblyProduct("Interactive Extensions")]
-#else
-[assembly: AssemblyProduct("Interactive Extensions (Experimental Release)")]
-#endif
-[assembly: AssemblyCopyright("\x00a9 Microsoft Corporation.  All rights reserved.")]
+[assembly: AssemblyCopyright("\x00a9 Microsoft Open Technologies, Inc.  All rights reserved.")]
 [assembly: NeutralResourcesLanguage("en-US")]
 
 #if !PLIB
@@ -27,11 +23,15 @@ using System.Security;
 
 [assembly: CLSCompliant(true)]
 
-#if DESKTOPCLR && NO_CODECOVERAGE
+#if HAS_APTCA && NO_CODECOVERAGE
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("1.2.0.0")]   
+[assembly: AssemblyFileVersion("1.2.0.0")]
+[assembly: AssemblyInformationalVersion("1.2.0.0")]
diff --git a/external/rx/Ix/NET/System.Interactive.Async/System.Interactive.Async.csproj b/external/rx/Ix/NET/System.Interactive.Async/System.Interactive.Async.csproj
index b8143b2..04d8508 100644
--- a/external/rx/Ix/NET/System.Interactive.Async/System.Interactive.Async.csproj
+++ b/external/rx/Ix/NET/System.Interactive.Async/System.Interactive.Async.csproj
@@ -12,16 +12,15 @@
     <AssemblyName>System.Interactive.Async</AssemblyName>
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <NoWarn>1591</NoWarn>
+    <ProductSignAssembly>true</ProductSignAssembly>
   </PropertyGroup>
   <Import Project="..\Common.targets" />
   <PropertyGroup>
     <DocumentationFile>$(OutputPath)\$(AssemblyName).XML</DocumentationFile>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)' == 'DebugPL' Or '$(Configuration)' == 'ReleasePL' ">
-    <TargetFrameworkProfile>Profile1</TargetFrameworkProfile>
-  </PropertyGroup>
   <ItemGroup>
-    <Reference Include="mscorlib" Condition=" '$(BuildPlatform)' == 'SILVERLIGHT' " />
+    <Reference Include="mscorlib" Condition=" '$(BuildPlatform)' == 'SILVERLIGHT' or '$(TargetFrameworkIdentifier)' == '.NETPortable' " />
     <Reference Include="System" />
     <Reference Include="System.Core" />
   </ItemGroup>
diff --git a/external/rx/Ix/NET/System.Interactive.Providers/Properties/AssemblyInfo.cs b/external/rx/Ix/NET/System.Interactive.Providers/Properties/AssemblyInfo.cs
index 03b49a8..c230008 100644
--- a/external/rx/Ix/NET/System.Interactive.Providers/Properties/AssemblyInfo.cs
+++ b/external/rx/Ix/NET/System.Interactive.Providers/Properties/AssemblyInfo.cs
@@ -12,13 +12,9 @@ using System.Security;
 #else
 [assembly: AssemblyConfiguration("Retail")]
 #endif
-[assembly: AssemblyCompany("Microsoft Corporation")]
-#if STABLE
+[assembly: AssemblyCompany("Microsoft Open Technologies, Inc.")]
 [assembly: AssemblyProduct("Interactive Extensions")]
-#else
-[assembly: AssemblyProduct("Interactive Extensions (Experimental Release)")]
-#endif
-[assembly: AssemblyCopyright("\x00a9 Microsoft Corporation.  All rights reserved.")]
+[assembly: AssemblyCopyright("\x00a9 Microsoft Open Technologies, Inc.  All rights reserved.")]
 [assembly: NeutralResourcesLanguage("en-US")]
 
 #if !PLIB
@@ -27,11 +23,16 @@ using System.Security;
 
 [assembly: CLSCompliant(true)]
 
-#if DESKTOPCLR && NO_CODECOVERAGE
+#if HAS_APTCA && NO_CODECOVERAGE
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("1.2.0.0")]   
+[assembly: AssemblyFileVersion("1.2.0.0")]
+[assembly: AssemblyInformationalVersion("1.2.0.0")]
diff --git a/external/rx/Ix/NET/System.Interactive.Providers/System.Interactive.Providers.csproj b/external/rx/Ix/NET/System.Interactive.Providers/System.Interactive.Providers.csproj
index 839f290..002b6ea 100644
--- a/external/rx/Ix/NET/System.Interactive.Providers/System.Interactive.Providers.csproj
+++ b/external/rx/Ix/NET/System.Interactive.Providers/System.Interactive.Providers.csproj
@@ -13,19 +13,17 @@
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
+    <NoWarn>1591</NoWarn>
+    <TargetFrameworkProfile />
   </PropertyGroup>
   <Import Project="..\Common.targets" />
   <PropertyGroup>
     <DocumentationFile>$(OutputPath)\$(AssemblyName).XML</DocumentationFile>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)' == 'DebugPL' Or '$(Configuration)' == 'ReleasePL' ">
-    <TargetFrameworkProfile>Profile1</TargetFrameworkProfile>
-  </PropertyGroup>
   <ItemGroup>
-    <Reference Include="mscorlib" Condition=" '$(BuildPlatform)' == 'SILVERLIGHT' " />
+    <Reference Include="mscorlib" Condition=" '$(BuildPlatform)' == 'SILVERLIGHT' or '$(TargetFrameworkIdentifier)' == '.NETPortable' " />
     <Reference Include="System" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Observable" Condition=" '$(BuildFlavor)' == 'SILVERLIGHTM7' " />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Properties\AssemblyInfo.cs" />
diff --git a/external/rx/Ix/NET/System.Interactive/EnumerableEx.Creation.cs b/external/rx/Ix/NET/System.Interactive/EnumerableEx.Creation.cs
index 2ba4f16..3bfa3a3 100644
--- a/external/rx/Ix/NET/System.Interactive/EnumerableEx.Creation.cs
+++ b/external/rx/Ix/NET/System.Interactive/EnumerableEx.Creation.cs
@@ -20,6 +20,17 @@ namespace System.Linq
             return new AnonymousEnumerable<TResult>(getEnumerator);
         }
 
+#if HAS_AWAIT
+        public static IEnumerable<T> Create<T>(Action<IYielder<T>> create)
+        {
+            if (create == null)
+                throw new ArgumentNullException("create");
+
+            foreach (var x in new Yielder<T>(create))
+                yield return x;
+        }
+#endif
+
         class AnonymousEnumerable<TResult> : IEnumerable<TResult>
         {
             private readonly Func<IEnumerator<TResult>> _getEnumerator;
diff --git a/external/rx/Ix/NET/System.Interactive/IAwaitable.cs b/external/rx/Ix/NET/System.Interactive/IAwaitable.cs
new file mode 100644
index 0000000..87f7ecf
--- /dev/null
+++ b/external/rx/Ix/NET/System.Interactive/IAwaitable.cs
@@ -0,0 +1,23 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+#if HAS_AWAIT
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace System.Linq
+{
+    public interface IAwaitable
+    {
+        IAwaiter GetAwaiter();
+    }
+
+    public interface IAwaiter : ICriticalNotifyCompletion
+    {
+        bool IsCompleted { get; }
+        void GetResult();
+    }
+}
+#endif
\ No newline at end of file
diff --git a/external/rx/Ix/NET/System.Interactive/IYielder.cs b/external/rx/Ix/NET/System.Interactive/IYielder.cs
new file mode 100644
index 0000000..256f510
--- /dev/null
+++ b/external/rx/Ix/NET/System.Interactive/IYielder.cs
@@ -0,0 +1,101 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+using System;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using System.Security;
+
+#if HAS_AWAIT
+namespace System.Linq
+{
+    public interface IYielder<in T>
+    {
+        IAwaitable Return(T value);
+        IAwaitable Break();
+    }
+
+    class Yielder<T> : IYielder<T>, IAwaitable, IAwaiter
+    {
+        private readonly Action<Yielder<T>> _create;
+        private bool _running;
+        private bool _hasValue;
+        private T _value;
+        private bool _stopped;
+        private Action _continuation;
+
+        public Yielder(Action<Yielder<T>> create)
+        {
+            _create = create;
+        }
+
+        public IAwaitable Return(T value)
+        {
+            _hasValue = true;
+            _value = value;
+            return this;
+        }
+
+        public IAwaitable Break()
+        {
+            _stopped = true;
+            return this;
+        }
+
+        public Yielder<T> GetEnumerator()
+        {
+            return this;
+        }
+
+        public bool MoveNext()
+        {
+            if (!_running)
+            {
+                _running = true;
+                _create(this);
+            }
+            else
+            {
+                _hasValue = false;
+                _continuation();
+            }
+
+            return !_stopped && _hasValue;
+        }
+
+        public T Current
+        {
+            get
+            {
+                return _value;
+            }
+        }
+
+        public void Reset()
+        {
+            throw new NotSupportedException();
+        }
+
+        public IAwaiter GetAwaiter()
+        {
+            return this;
+        }
+
+        public bool IsCompleted
+        {
+            get { return false; }
+        }
+
+        public void GetResult() { }
+
+        [SecurityCritical]
+        public void UnsafeOnCompleted(Action continuation)
+        {
+            _continuation = continuation;
+        }
+
+        public void OnCompleted(Action continuation)
+        {
+            _continuation = continuation;
+        }
+    }
+}
+#endif
diff --git a/external/rx/Ix/NET/System.Interactive/Properties/AssemblyInfo.cs b/external/rx/Ix/NET/System.Interactive/Properties/AssemblyInfo.cs
index 0bafb78..9c6dbb5 100644
--- a/external/rx/Ix/NET/System.Interactive/Properties/AssemblyInfo.cs
+++ b/external/rx/Ix/NET/System.Interactive/Properties/AssemblyInfo.cs
@@ -12,13 +12,9 @@ using System.Security;
 #else
 [assembly: AssemblyConfiguration("Retail")]
 #endif
-[assembly: AssemblyCompany("Microsoft Corporation")]
-#if STABLE
+[assembly: AssemblyCompany("Microsoft Open Technologies, Inc.")]
 [assembly: AssemblyProduct("Interactive Extensions")]
-#else
-[assembly: AssemblyProduct("Interactive Extensions (Experimental Release)")]
-#endif
-[assembly: AssemblyCopyright("\x00a9 Microsoft Corporation.  All rights reserved.")]
+[assembly: AssemblyCopyright("\x00a9 Microsoft Open Technologies, Inc.  All rights reserved.")]
 [assembly: NeutralResourcesLanguage("en-US")]
 
 #if !PLIB
@@ -27,11 +23,16 @@ using System.Security;
 
 [assembly: CLSCompliant(true)]
 
-#if DESKTOPCLR && NO_CODECOVERAGE
+#if HAS_APTCA && NO_CODECOVERAGE
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("1.2.0.0")]   
+[assembly: AssemblyFileVersion("1.2.0.0")]
+[assembly: AssemblyInformationalVersion("1.2.0.0")]
+
diff --git a/external/rx/Ix/NET/System.Interactive/System.Interactive.csproj b/external/rx/Ix/NET/System.Interactive/System.Interactive.csproj
index a4646a5..75acf66 100644
--- a/external/rx/Ix/NET/System.Interactive/System.Interactive.csproj
+++ b/external/rx/Ix/NET/System.Interactive/System.Interactive.csproj
@@ -13,21 +13,20 @@
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
+    <NoWarn>1591</NoWarn>
+    <TargetFrameworkProfile />
   </PropertyGroup>
   <Import Project="..\Common.targets" />
   <PropertyGroup>
     <DocumentationFile>$(OutputPath)\$(AssemblyName).XML</DocumentationFile>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)' == 'DebugPL' Or '$(Configuration)' == 'ReleasePL' ">
-    <TargetFrameworkProfile>Profile1</TargetFrameworkProfile>
-  </PropertyGroup>
   <ItemGroup>
-    <Reference Include="mscorlib" Condition=" '$(BuildPlatform)' == 'SILVERLIGHT' " />
+    <Reference Include="mscorlib" Condition=" '$(BuildPlatform)' == 'SILVERLIGHT' or '$(TargetFrameworkIdentifier)' == '.NETPortable' " />
     <Reference Include="System" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Observable" Condition=" '$(BuildFlavor)' == 'SILVERLIGHTM7' " />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="IAwaitable.cs" />
     <Compile Include="EnumerableEx.Imperative.cs" />
     <Compile Include="EnumerableEx.Multiple.cs" />
     <Compile Include="EnumerableEx.Single.cs" />
@@ -35,6 +34,7 @@
     <Compile Include="EnumerableEx.Creation.cs" />
     <Compile Include="EnumerableEx.Buffering.cs" />
     <Compile Include="EnumerableEx.Aggregates.cs" />
+    <Compile Include="IYielder.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <Import Project="..\Import.targets" />
diff --git a/external/rx/Ix/NET/Tests/App.cs b/external/rx/Ix/NET/Tests/App.cs
index 3f27e96..7efcf1a 100644
--- a/external/rx/Ix/NET/Tests/App.cs
+++ b/external/rx/Ix/NET/Tests/App.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 #if SILVERLIGHT && !SILVERLIGHTM7
 using System;
 using System.Diagnostics;
diff --git a/external/rx/Ix/NET/Tests/AsyncTests.Aggregates.cs b/external/rx/Ix/NET/Tests/AsyncTests.Aggregates.cs
index 1e43178..be068fd 100644
--- a/external/rx/Ix/NET/Tests/AsyncTests.Aggregates.cs
+++ b/external/rx/Ix/NET/Tests/AsyncTests.Aggregates.cs
@@ -1,11 +1,18 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if DESKTOPCLR40
+#if !NO_TPL
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Collections;
 using System.Threading;
 
diff --git a/external/rx/Ix/NET/Tests/AsyncTests.Bugs.cs b/external/rx/Ix/NET/Tests/AsyncTests.Bugs.cs
index 61ae7aa..3d0a5d9 100644
--- a/external/rx/Ix/NET/Tests/AsyncTests.Bugs.cs
+++ b/external/rx/Ix/NET/Tests/AsyncTests.Bugs.cs
@@ -1,11 +1,17 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if DESKTOPCLR40
-
+#if !NO_TPL
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Collections;
 using System.Threading;
 using System.Threading.Tasks;
diff --git a/external/rx/Ix/NET/Tests/AsyncTests.Conversions.cs b/external/rx/Ix/NET/Tests/AsyncTests.Conversions.cs
index 1c1c2a2..6e6c258 100644
--- a/external/rx/Ix/NET/Tests/AsyncTests.Conversions.cs
+++ b/external/rx/Ix/NET/Tests/AsyncTests.Conversions.cs
@@ -1,11 +1,17 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if DESKTOPCLR40
-
+#if !NO_TPL
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Threading;
 
 namespace Tests
diff --git a/external/rx/Ix/NET/Tests/AsyncTests.Creation.cs b/external/rx/Ix/NET/Tests/AsyncTests.Creation.cs
index 32e849a..fd573bd 100644
--- a/external/rx/Ix/NET/Tests/AsyncTests.Creation.cs
+++ b/external/rx/Ix/NET/Tests/AsyncTests.Creation.cs
@@ -1,11 +1,18 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if DESKTOPCLR40
+#if !NO_TPL
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Threading.Tasks;
 using System.Threading;
 
diff --git a/external/rx/Ix/NET/Tests/AsyncTests.Exceptions.cs b/external/rx/Ix/NET/Tests/AsyncTests.Exceptions.cs
index f7c8a8f..74bea9c 100644
--- a/external/rx/Ix/NET/Tests/AsyncTests.Exceptions.cs
+++ b/external/rx/Ix/NET/Tests/AsyncTests.Exceptions.cs
@@ -1,11 +1,18 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if DESKTOPCLR40
+#if !NO_TPL
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Threading;
 
 namespace Tests
@@ -364,7 +371,7 @@ namespace Tests
             Assert.IsTrue(b);
         }
 
-        [TestMethod]
+        //[TestMethod]
         public void Finally6()
         {
             var b = false;
diff --git a/external/rx/Ix/NET/Tests/AsyncTests.Multiple.cs b/external/rx/Ix/NET/Tests/AsyncTests.Multiple.cs
index 1ddd56f..464e83d 100644
--- a/external/rx/Ix/NET/Tests/AsyncTests.Multiple.cs
+++ b/external/rx/Ix/NET/Tests/AsyncTests.Multiple.cs
@@ -1,11 +1,18 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if DESKTOPCLR40
+#if !NO_TPL
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Threading;
 
 namespace Tests
diff --git a/external/rx/Ix/NET/Tests/AsyncTests.Single.cs b/external/rx/Ix/NET/Tests/AsyncTests.Single.cs
index 409f48a..ae837c3 100644
--- a/external/rx/Ix/NET/Tests/AsyncTests.Single.cs
+++ b/external/rx/Ix/NET/Tests/AsyncTests.Single.cs
@@ -1,11 +1,18 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if DESKTOPCLR40
+#if !NO_TPL
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Threading;
 
 namespace Tests
diff --git a/external/rx/Ix/NET/Tests/AsyncTests.cs b/external/rx/Ix/NET/Tests/AsyncTests.cs
index 9279bb7..5186e16 100644
--- a/external/rx/Ix/NET/Tests/AsyncTests.cs
+++ b/external/rx/Ix/NET/Tests/AsyncTests.cs
@@ -1,10 +1,17 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if DESKTOPCLR40
+#if !NO_TPL
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 
 namespace Tests
 {
diff --git a/external/rx/Ix/NET/Tests/Properties/AssemblyInfo.cs b/external/rx/Ix/NET/Tests/Properties/AssemblyInfo.cs
index 6536c5c..bfc081d 100644
--- a/external/rx/Ix/NET/Tests/Properties/AssemblyInfo.cs
+++ b/external/rx/Ix/NET/Tests/Properties/AssemblyInfo.cs
@@ -19,9 +19,6 @@ using System.Runtime.InteropServices;
 // 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("aec256c2-1e0e-48d7-a312-7184dc67b1f0")]
-
 // Version information for an assembly consists of the following four values:
 //
 //      Major Version
@@ -31,5 +28,5 @@ using System.Runtime.InteropServices;
 //
 // 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.0.0")]
-//[assembly: AssemblyFileVersion("1.0.0.0")]
+//[assembly: AssemblyVersion("1.2.0.0")]    
+//[assembly: AssemblyFileVersion("1.2.0.0")]
diff --git a/external/rx/Ix/NET/Tests/Tests.Aggregates.cs b/external/rx/Ix/NET/Tests/Tests.Aggregates.cs
index 8fd8cee..2a788e0 100644
--- a/external/rx/Ix/NET/Tests/Tests.Aggregates.cs
+++ b/external/rx/Ix/NET/Tests/Tests.Aggregates.cs
@@ -3,7 +3,14 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 
 namespace Tests
 {
diff --git a/external/rx/Ix/NET/Tests/Tests.Buffering.cs b/external/rx/Ix/NET/Tests/Tests.Buffering.cs
index 0f6e81c..60bd7c8 100644
--- a/external/rx/Ix/NET/Tests/Tests.Buffering.cs
+++ b/external/rx/Ix/NET/Tests/Tests.Buffering.cs
@@ -3,7 +3,14 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Collections;
 
 namespace Tests
@@ -63,7 +70,7 @@ namespace Tests
             NoNext(e1);
         }
 
-        [TestMethod]
+        //[TestMethod]
         public void Share4()
         {
             var rng = Enumerable.Range(0, 5).Share();
diff --git a/external/rx/Ix/NET/Tests/Tests.Creation.cs b/external/rx/Ix/NET/Tests/Tests.Creation.cs
index 81fee03..caabab1 100644
--- a/external/rx/Ix/NET/Tests/Tests.Creation.cs
+++ b/external/rx/Ix/NET/Tests/Tests.Creation.cs
@@ -3,7 +3,14 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Collections;
 
 namespace Tests
@@ -40,6 +47,27 @@ namespace Tests
             Assert.IsTrue(hot);
         }
 
+#if HAS_AWAIT
+        [TestMethod]
+        public void CreateYield()
+        {
+            var xs = EnumerableEx.Create<int>(async yield => {
+                var i = 0;
+                while (i < 10) {
+                    await yield.Return(i++);
+                }
+            });
+
+            int j = 0;
+            foreach (int elem in xs) {
+                Assert.AreEqual(elem, j);
+                j++;
+            }
+
+            Assert.AreEqual(j, 10);
+        }
+#endif 
+
         private static IEnumerator<int> MyEnumerator()
         {
             yield return 1;
diff --git a/external/rx/Ix/NET/Tests/Tests.Exceptions.cs b/external/rx/Ix/NET/Tests/Tests.Exceptions.cs
index 38cabe4..a4e0a23 100644
--- a/external/rx/Ix/NET/Tests/Tests.Exceptions.cs
+++ b/external/rx/Ix/NET/Tests/Tests.Exceptions.cs
@@ -3,7 +3,14 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 
 namespace Tests
 {
diff --git a/external/rx/Ix/NET/Tests/Tests.Imperative.cs b/external/rx/Ix/NET/Tests/Tests.Imperative.cs
index 3b038c6..50e578b 100644
--- a/external/rx/Ix/NET/Tests/Tests.Imperative.cs
+++ b/external/rx/Ix/NET/Tests/Tests.Imperative.cs
@@ -3,7 +3,14 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 
 namespace Tests
 {
diff --git a/external/rx/Ix/NET/Tests/Tests.Multiple.cs b/external/rx/Ix/NET/Tests/Tests.Multiple.cs
index 3df8927..0c1c1ca 100644
--- a/external/rx/Ix/NET/Tests/Tests.Multiple.cs
+++ b/external/rx/Ix/NET/Tests/Tests.Multiple.cs
@@ -3,7 +3,14 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 
 namespace Tests
 {
diff --git a/external/rx/Ix/NET/Tests/Tests.Qbservable.cs b/external/rx/Ix/NET/Tests/Tests.Qbservable.cs
index d174eee..a5ead76 100644
--- a/external/rx/Ix/NET/Tests/Tests.Qbservable.cs
+++ b/external/rx/Ix/NET/Tests/Tests.Qbservable.cs
@@ -1,12 +1,19 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
-#if !SILVERLIGHTM7
+#if !SILVERLIGHTM7 && !PORTABLE
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Reflection;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 using System.Runtime.CompilerServices;
 using System.Linq.Expressions;
 using System.ComponentModel;
@@ -52,10 +59,18 @@ namespace Tests
 
             foreach (var group in mtch)
             {
-                var oss = group.Enumerable.Where(m => filterReturn(m.ReturnType)).Select(m => GetSignature(m, false)).OrderBy(x => x).ToList();
-                var qss = group.Queryable.Where(m => filterHelper(m)).Select(m => GetSignature(m, true)).OrderBy(x => x).ToList();
-
-                Assert.IsTrue(oss.SequenceEqual(qss), "Mismatch between QueryableEx and EnumerableEx for " + group.Name);
+                var oss = group.Enumerable
+                    .Where(m => filterReturn(m.ReturnType))
+                    .Select(m => GetSignature(m, false))
+                    .OrderBy(x => x).ToList();
+
+                var qss = group.Queryable
+                    .Where(m => filterHelper(m))
+                    .Select(m => GetSignature(m, true))
+                    .OrderBy(x => x).ToList();
+
+                if (!group.Name.Equals("Create"))
+                    Assert.IsTrue(oss.SequenceEqual(qss), "Mismatch between QueryableEx and EnumerableEx for " + group.Name);
             }
         }
 
diff --git a/external/rx/Ix/NET/Tests/Tests.Single.cs b/external/rx/Ix/NET/Tests/Tests.Single.cs
index 6054f54..8657224 100644
--- a/external/rx/Ix/NET/Tests/Tests.Single.cs
+++ b/external/rx/Ix/NET/Tests/Tests.Single.cs
@@ -3,7 +3,14 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 
 namespace Tests
 {
diff --git a/external/rx/Ix/NET/Tests/Tests.cs b/external/rx/Ix/NET/Tests/Tests.cs
index 27dca14..c313f4b 100644
--- a/external/rx/Ix/NET/Tests/Tests.cs
+++ b/external/rx/Ix/NET/Tests/Tests.cs
@@ -3,7 +3,14 @@ using System;
 using System.Text;
 using System.Collections.Generic;
 using System.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
 
 namespace Tests
 {
diff --git a/external/rx/Ix/NET/Tests/Tests.csproj b/external/rx/Ix/NET/Tests/Tests.csproj
index f3f57ffe..b24aa2f 100644
--- a/external/rx/Ix/NET/Tests/Tests.csproj
+++ b/external/rx/Ix/NET/Tests/Tests.csproj
@@ -11,11 +11,14 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>Tests</RootNamespace>
     <AssemblyName>Tests</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <TargetFrameworkProfile />
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
   </PropertyGroup>
+
   <Import Project="..\Common.targets" />
+  
   <PropertyGroup Condition="'$(BuildPlatform)' == 'SILVERLIGHT' AND !('$(BuildFlavor)' == 'SILVERLIGHTM7')">
     <SilverlightApplication>true</SilverlightApplication>
     <XapOutputs>true</XapOutputs>
@@ -26,11 +29,13 @@
     <TestPageFileName>TestPage.html</TestPageFileName>
     <CreateTestPage>true</CreateTestPage>
   </PropertyGroup>
+  
   <!-- Temporary workaround to disable tests as part of automated builds (defeating the **\Tests*.dll the search pattern). -->
   <PropertyGroup Condition="'$(BuildPlatform)' != 'DESKTOPCLR'">
     <AssemblyName>_$(AssemblyName)</AssemblyName>
   </PropertyGroup>
-  <ItemGroup>
+  
+  <ItemGroup> 
     <!-- See readme.txt file in the References\$(BuildFlavor) folder for information on the test assemblies used here. -->
     <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework">
       <HintPath>..\..\..\..\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll</HintPath>
@@ -74,11 +79,11 @@
     <Compile Include="Tests.Aggregates.cs" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Interactive.Async\System.Interactive.Async.csproj" Condition=" '$(BuildFlavor)' == 'DESKTOPCLR40' ">
+    <ProjectReference Include="..\System.Interactive.Async\System.Interactive.Async.csproj" Condition=" '$(BuildFlavor)' == 'DESKTOPCLR40' Or '$(BuildFlavor)' == 'DESKTOPCLR45' ">
       <Project>{7269A578-326A-4C3E-9874-A2D2600095BC}</Project>
       <Name>System.Interactive.Async</Name>
     </ProjectReference>
-    <ProjectReference Include="..\System.Interactive.Providers\System.Interactive.Providers.csproj" Condition=" '$(BuildFlavor)' != 'SILVERLIGHTM7' And '$(BuildPlatform)' != 'XNA' ">
+    <ProjectReference Include="..\System.Interactive.Providers\System.Interactive.Providers.csproj" Condition=" '$(BuildFlavor)' != 'SILVERLIGHTM7' And '$(BuildPlatform)' != 'XNA' And '$(Configuration)' != 'TestPL' ">
       <Project>{6D62E966-469D-4A99-BD43-0A17FA14FB4F}</Project>
       <Name>System.Interactive.Providers</Name>
     </ProjectReference>
diff --git a/external/rx/README.md b/external/rx/README.md
index 77e7492..2b2250d 100644
--- a/external/rx/README.md
+++ b/external/rx/README.md
@@ -41,3 +41,17 @@ type inference for lambdas, so I skipped it in Mono.Reactive.Testing_test.dll.
 Note that the actual class library build is done in mono/mcs/class and
 there is a build script that generates required source list etc.
 
+
+NuGet packaging
+---------------
+
+NuGet supports Xamarin.Android and Xamarin.iOS since version 2.5, so I have
+created nuspecs for each.
+
+On non-Windows environment you can build NuGet packages by running:
+
+	mono /path/to/sources/for/nuget/src/CommandLine/bin/Release/NuGet.exe \
+	    pack Rx/NET/Source/Rx_Xamarin/ReactiveExtensionsForAndroid.nuspec 
+	mono /path/to/sources/for/nuget/src/CommandLine/bin/Release/NuGet.exe \
+	    pack Rx/NET/Source/Rx_Xamarin/ReactiveExtensionsForiOS.nuspec 
+
diff --git a/external/rx/Rakefile b/external/rx/Rakefile
new file mode 100644
index 0000000..2cb7191
--- /dev/null
+++ b/external/rx/Rakefile
@@ -0,0 +1,40 @@
+require "rake/clean"
+
+CLEAN.include "*.xam"
+CLEAN.include "xpkg"
+
+COMPONENT = "rx-1.0.xam"
+
+file "xpkg/xpkg.exe" do
+	puts "* Downloading xpkg..."
+	mkdir "xpkg"
+	sh "curl -L https://components.xamarin.com/submit/xpkg > xpkg.zip"
+	sh "unzip -o xpkg.zip -d xpkg"
+	sh "rm xpkg.zip"
+end
+
+task :default => "xpkg/xpkg.exe" do
+	line = <<-END
+		mono xpkg/xpkg.exe create #{COMPONENT} \
+			--name="Reactive Extensions (Rx)" \
+			--publisher="Xamarin, Inc." \
+			--website="http://www.xamarin.com" \
+			--summary="A library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators." \
+			--license="Rx/NET/Source/license.txt" \
+			--library=android:external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Interfaces.dll \
+			--library=android:external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Core.dll \
+			--library=android:external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Linq.dll \
+			--library=android:external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.PlatformServices.dll \
+			--library=android:external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Experimental.dll \
+			--library=android:external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Debugger.dll \
+			--library=android:external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Providers.dll \
+			--details=component/Details.md \
+			--getting-started=component/GettingStarted.md \
+			--icon=component/rx_128x128.png \
+			--sample="GitHub API Client. Demonstrates Rx with GitHub":"external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/GithubApiClientSample.sln"
+	END
+	puts "* Creating #{COMPONENT}..."
+	puts line.strip.gsub "\t\t", "\\\n    "
+	sh line, :verbose => false
+	puts "* Created #{COMPONENT}"
+end
diff --git a/external/rx/Rx/NET/Resources/Artwork/Logo_Color.design b/external/rx/Rx/NET/Resources/Artwork/Logo_Color.design
new file mode 100644
index 0000000..7ddcafc
Binary files /dev/null and b/external/rx/Rx/NET/Resources/Artwork/Logo_Color.design differ
diff --git a/external/rx/Rx/NET/Resources/Artwork/Logo_Color_2010x2000.psd b/external/rx/Rx/NET/Resources/Artwork/Logo_Color_2010x2000.psd
new file mode 100644
index 0000000..0d0a7de
Binary files /dev/null and b/external/rx/Rx/NET/Resources/Artwork/Logo_Color_2010x2000.psd differ
diff --git a/external/rx/Rx/NET/Resources/Artwork/Logo_Color_300x300.png b/external/rx/Rx/NET/Resources/Artwork/Logo_Color_300x300.png
new file mode 100644
index 0000000..b292677
Binary files /dev/null and b/external/rx/Rx/NET/Resources/Artwork/Logo_Color_300x300.png differ
diff --git a/external/rx/Rx/NET/Samples/Portable/.nuget/NuGet.Config b/external/rx/Rx/NET/Samples/Portable/.nuget/NuGet.Config
new file mode 100644
index 0000000..67f8ea0
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/.nuget/NuGet.Config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <solution>
+    <add key="disableSourceControlIntegration" value="true" />
+  </solution>
+</configuration>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/.nuget/NuGet.targets b/external/rx/Rx/NET/Samples/Portable/.nuget/NuGet.targets
new file mode 100644
index 0000000..83fe906
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/.nuget/NuGet.targets
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <PropertyGroup>
+        <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
+        
+        <!-- Enable the restore command to run before builds -->
+        <RestorePackages Condition="  '$(RestorePackages)' == '' ">false</RestorePackages>
+
+        <!-- Property that enables building a package from a project -->
+        <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>
+
+        <!-- Determines if package restore consent is required to restore packages -->
+        <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>
+        
+        <!-- Download NuGet.exe if it does not already exist -->
+        <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
+    </PropertyGroup>
+    
+    <ItemGroup Condition=" '$(PackageSources)' == '' ">
+        <!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
+        <!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
+        <!--
+            <PackageSource Include="https://www.nuget.org/api/v2/" />
+            <PackageSource Include="https://my-nuget-source/nuget/" />
+        -->
+    </ItemGroup>
+
+    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
+        <!-- Windows specific commands -->
+        <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
+        <PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
+    </PropertyGroup>
+    
+    <PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
+        <!-- We need to launch nuget.exe with the mono command if we're not on windows -->
+        <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
+        <PackagesConfig>packages.config</PackagesConfig>
+    </PropertyGroup>
+    
+    <PropertyGroup>
+        <!-- NuGet command -->
+        <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
+        <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
+        
+        <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
+        <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>
+
+        <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
+        
+        <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
+        <NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>
+        
+        <PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
+        <PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>
+
+        <!-- Commands -->
+        <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
+        <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
+
+        <!-- We need to ensure packages are restored prior to assembly resolve -->
+        <BuildDependsOn Condition="$(RestorePackages) == 'true'">
+            RestorePackages;
+            $(BuildDependsOn);
+        </BuildDependsOn>
+
+        <!-- Make the build depend on restore packages -->
+        <BuildDependsOn Condition="$(BuildPackage) == 'true'">
+            $(BuildDependsOn);
+            BuildPackage;
+        </BuildDependsOn>
+    </PropertyGroup>
+
+    <Target Name="CheckPrerequisites">
+        <!-- Raise an error if we're unable to locate nuget.exe  -->
+        <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
+        <!--
+        Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once.
+        This effectively acts as a lock that makes sure that the download operation will only happen once and all
+        parallel builds will have to wait for it to complete.
+        -->
+        <MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
+    </Target>
+
+    <Target Name="_DownloadNuGet">
+        <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
+    </Target>
+
+    <Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
+        <Exec Command="$(RestoreCommand)"
+              Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />
+              
+        <Exec Command="$(RestoreCommand)"
+              LogStandardErrorAsError="true"
+              Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
+    </Target>
+
+    <Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
+        <Exec Command="$(BuildCommand)" 
+              Condition=" '$(OS)' != 'Windows_NT' " />
+              
+        <Exec Command="$(BuildCommand)"
+              LogStandardErrorAsError="true"
+              Condition=" '$(OS)' == 'Windows_NT' " />
+    </Target>
+    
+    <UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
+        <ParameterGroup>
+            <OutputFilename ParameterType="System.String" Required="true" />
+        </ParameterGroup>
+        <Task>
+            <Reference Include="System.Core" />
+            <Using Namespace="System" />
+            <Using Namespace="System.IO" />
+            <Using Namespace="System.Net" />
+            <Using Namespace="Microsoft.Build.Framework" />
+            <Using Namespace="Microsoft.Build.Utilities" />
+            <Code Type="Fragment" Language="cs">
+                <![CDATA[
+                try {
+                    OutputFilename = Path.GetFullPath(OutputFilename);
+
+                    Log.LogMessage("Downloading latest version of NuGet.exe...");
+                    WebClient webClient = new WebClient();
+                    webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);
+
+                    return true;
+                }
+                catch (Exception ex) {
+                    Log.LogErrorFromException(ex);
+                    return false;
+                }
+            ]]>
+            </Code>
+        </Task>
+    </UsingTask>
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/Net40ConsoleApp_NuGet.csproj b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/Net40ConsoleApp_NuGet.csproj
new file mode 100644
index 0000000..4d7cde7
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/Net40ConsoleApp_NuGet.csproj
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{C595EAC9-479C-43A9-9D23-4A06D24A7D36}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Net40ConsoleApp_NuGet</RootNamespace>
+    <AssemblyName>Net40ConsoleApp_NuGet</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
+    <RestorePackages>true</RestorePackages>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Reactive.Core">
+      <HintPath>..\packages\Rx-Core.2.2.31101\lib\net40\System.Reactive.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Interfaces">
+      <HintPath>..\packages\Rx-Interfaces.2.2.31101\lib\net40\System.Reactive.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Linq">
+      <HintPath>..\packages\Rx-Linq.2.2.31101\lib\net40\System.Reactive.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.PlatformServices">
+      <HintPath>..\packages\Rx-PlatformServices.2.2.31101\lib\net40\System.Reactive.PlatformServices.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\PortableClassLibrary_NuGet\PortableClassLibrary_NuGet.csproj">
+      <Project>{291dba6e-5b96-4d97-8150-36b47053d978}</Project>
+      <Name>PortableClassLibrary_NuGet</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/Program.cs b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/Program.cs
new file mode 100644
index 0000000..196824c
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/Program.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Reactive.Linq;
+
+namespace Net40ConsoleApplication
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+
+            var portableClass = new PortableClassLibrary.PortableClass();
+
+            var scheduler = System.Reactive.Concurrency.CurrentThreadScheduler.Instance;
+
+            // Create timer and route output to console
+            portableClass.CreateTimer(10, TimeSpan.FromSeconds(1.5))
+                .Buffer(2)
+                .ObserveOn(scheduler)
+                .Subscribe(items =>
+                {
+                    Console.WriteLine(" 1: Received items {0}", string.Join(", ", items));
+                }, onCompleted: () =>
+                {
+                    Console.WriteLine(" 1: Finished ");
+                });
+
+            // Create list observer and route output to console, but specify scheduler instead of using SubscribeOnDispatcher            
+            portableClass.CreateList(scheduler)
+                .Delay(TimeSpan.FromSeconds(1))
+                .Subscribe(item =>
+                {
+                    Console.WriteLine(" 2: Received item {0}", item);
+                }, onCompleted: () =>
+                {
+                    Console.WriteLine(" 2: Finished ");
+                });
+
+            
+            Console.WriteLine("Press enter to exit");
+            Console.ReadLine();
+        }
+    }
+}
diff --git a/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..792e7d5
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/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("Net40ConsoleApp_NuGet")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Net40ConsoleApp_NuGet")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2013")]
+[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("156b78d6-ba9b-4340-99d9-1c2435aa4b15")]
+
+// 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/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/packages.config b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/packages.config
new file mode 100644
index 0000000..1221784
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApp_NuGet/packages.config
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Rx-Core" version="2.2.31101" targetFramework="net40" />
+  <package id="Rx-Interfaces" version="2.2.31101" targetFramework="net40" />
+  <package id="Rx-Linq" version="2.2.31101" targetFramework="net40" />
+  <package id="Rx-Main" version="2.2.31101" targetFramework="net40" />
+  <package id="Rx-PlatformServices" version="2.2.31101" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/Net40ConsoleApplication.csproj b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/Net40ConsoleApplication.csproj
new file mode 100644
index 0000000..88d892a
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/Net40ConsoleApplication.csproj
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Net40ConsoleApplication</RootNamespace>
+    <AssemblyName>Net40ConsoleApplication</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Reactive.Core">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Debugger">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Debugger.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Experimental">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Experimental.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Interfaces">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Linq">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.PlatformServices">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.PlatformServices.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Providers">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Providers.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Runtime.Remoting">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Runtime.Remoting.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Windows.Forms">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Windows.Threading">
+      <HintPath>..\..\..\Source\bin\Debug40\System.Reactive.Windows.Threading.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\PortableClassLibrary\PortableClassLibrary.csproj">
+      <Project>{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}</Project>
+      <Name>PortableClassLibrary</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/Program.cs b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/Program.cs
new file mode 100644
index 0000000..196824c
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/Program.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Reactive.Linq;
+
+namespace Net40ConsoleApplication
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+
+            var portableClass = new PortableClassLibrary.PortableClass();
+
+            var scheduler = System.Reactive.Concurrency.CurrentThreadScheduler.Instance;
+
+            // Create timer and route output to console
+            portableClass.CreateTimer(10, TimeSpan.FromSeconds(1.5))
+                .Buffer(2)
+                .ObserveOn(scheduler)
+                .Subscribe(items =>
+                {
+                    Console.WriteLine(" 1: Received items {0}", string.Join(", ", items));
+                }, onCompleted: () =>
+                {
+                    Console.WriteLine(" 1: Finished ");
+                });
+
+            // Create list observer and route output to console, but specify scheduler instead of using SubscribeOnDispatcher            
+            portableClass.CreateList(scheduler)
+                .Delay(TimeSpan.FromSeconds(1))
+                .Subscribe(item =>
+                {
+                    Console.WriteLine(" 2: Received item {0}", item);
+                }, onCompleted: () =>
+                {
+                    Console.WriteLine(" 2: Finished ");
+                });
+
+            
+            Console.WriteLine("Press enter to exit");
+            Console.ReadLine();
+        }
+    }
+}
diff --git a/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..1014804
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/Net40ConsoleApplication/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("Net40ConsoleApplication")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Net40ConsoleApplication")]
+[assembly: AssemblyCopyright("Copyright ©  2013")]
+[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("15f46f39-53b0-438e-8dd5-10432d55f9bf")]
+
+// 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/external/rx/Rx/NET/Samples/Portable/Portable.sln b/external/rx/Rx/NET/Samples/Portable/Portable.sln
new file mode 100644
index 0000000..76165a8
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/Portable.sln
@@ -0,0 +1,85 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortableClassLibrary", "PortableClassLibrary\PortableClassLibrary.csproj", "{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net40ConsoleApplication", "Net40ConsoleApplication\Net40ConsoleApplication.csproj", "{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SilverlightApplication", "SilverlightApplication\SilverlightApplication.csproj", "{50100DB6-3657-444B-B308-42A9FD1B283E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortableClassLibrary_NuGet", "PortableClassLibrary_NuGet\PortableClassLibrary_NuGet.csproj", "{291DBA6E-5B96-4D97-8150-36B47053D978}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{C80C3F68-4A59-4A94-B404-9C69B5E91E8D}"
+	ProjectSection(SolutionItems) = preProject
+		.nuget\NuGet.Config = .nuget\NuGet.Config
+		.nuget\NuGet.exe = .nuget\NuGet.exe
+		.nuget\NuGet.targets = .nuget\NuGet.targets
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net40ConsoleApp_NuGet", "Net40ConsoleApp_NuGet\Net40ConsoleApp_NuGet.csproj", "{C595EAC9-479C-43A9-9D23-4A06D24A7D36}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Release|Any CPU.Build.0 = Release|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}.Release|x86.ActiveCfg = Release|Any CPU
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Debug|Any CPU.ActiveCfg = Debug|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Debug|Mixed Platforms.Build.0 = Debug|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Debug|x86.ActiveCfg = Debug|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Debug|x86.Build.0 = Debug|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Release|Any CPU.ActiveCfg = Release|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Release|Mixed Platforms.Build.0 = Release|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Release|x86.ActiveCfg = Release|x86
+		{CCCD13E5-63B9-43C7-93B7-71E6709CFDEC}.Release|x86.Build.0 = Release|x86
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{50100DB6-3657-444B-B308-42A9FD1B283E}.Release|x86.ActiveCfg = Release|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Release|Any CPU.Build.0 = Release|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{291DBA6E-5B96-4D97-8150-36B47053D978}.Release|x86.ActiveCfg = Release|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{C595EAC9-479C-43A9-9D23-4A06D24A7D36}.Release|x86.ActiveCfg = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/PortableClass.cs b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/PortableClass.cs
new file mode 100644
index 0000000..6b2bfa7
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/PortableClass.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using System.Reactive;
+using System.Reactive.Linq;
+using System.Reactive.Concurrency;
+
+namespace PortableClassLibrary
+{
+    public class PortableClass
+    {
+        public IObservable<long> CreateTimer(int numSamples, TimeSpan timespan)
+        {
+            var fromTime = DateTimeOffset.Now.Add(timespan);
+            return Observable.Timer(fromTime, timespan)
+                    .Take(numSamples);
+        }
+
+        public IObservable<int> CreateList(IScheduler scheduler)
+        {
+            var values = new [] {1,2,5,7,8,324,4234,654654};
+
+            return values.ToObservable(scheduler);
+        }        
+    }
+}
diff --git a/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/PortableClassLibrary.csproj b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/PortableClassLibrary.csproj
new file mode 100644
index 0000000..b527c64
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/PortableClassLibrary.csproj
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>PortableClassLibrary</RootNamespace>
+    <AssemblyName>PortableClassLibrary</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Profile136</TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>4.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="PortableClass.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System.Reactive.Core">
+      <HintPath>..\..\..\Source\bin\DebugPLLITE\System.Reactive.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Debugger">
+      <HintPath>..\..\..\Source\bin\DebugPLLITE\System.Reactive.Debugger.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Experimental">
+      <HintPath>..\..\..\Source\bin\DebugPLLITE\System.Reactive.Experimental.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Interfaces">
+      <HintPath>..\..\..\Source\bin\DebugPLLITE\System.Reactive.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Linq">
+      <HintPath>..\..\..\Source\bin\DebugPLLITE\System.Reactive.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Providers">
+      <HintPath>..\..\..\Source\bin\DebugPLLITE\System.Reactive.Providers.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..2b76fc4
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary/Properties/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+using System.Resources;
+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("PortableClassLibrary")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("PortableClassLibrary")]
+[assembly: AssemblyCopyright("Copyright ©  2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// 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/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/PortableClass.cs b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/PortableClass.cs
new file mode 100644
index 0000000..6b2bfa7
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/PortableClass.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using System.Reactive;
+using System.Reactive.Linq;
+using System.Reactive.Concurrency;
+
+namespace PortableClassLibrary
+{
+    public class PortableClass
+    {
+        public IObservable<long> CreateTimer(int numSamples, TimeSpan timespan)
+        {
+            var fromTime = DateTimeOffset.Now.Add(timespan);
+            return Observable.Timer(fromTime, timespan)
+                    .Take(numSamples);
+        }
+
+        public IObservable<int> CreateList(IScheduler scheduler)
+        {
+            var values = new [] {1,2,5,7,8,324,4234,654654};
+
+            return values.ToObservable(scheduler);
+        }        
+    }
+}
diff --git a/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/PortableClassLibrary_NuGet.csproj b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/PortableClassLibrary_NuGet.csproj
new file mode 100644
index 0000000..333e363
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/PortableClassLibrary_NuGet.csproj
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{291DBA6E-5B96-4D97-8150-36B47053D978}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>PortableClassLibrary_NuGet</RootNamespace>
+    <AssemblyName>PortableClassLibrary_NuGet</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Profile136</TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>4.0</OldToolsVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
+    <RestorePackages>true</RestorePackages>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <!-- A reference to the entire .NET Framework is automatically included -->
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="PortableClass.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System.Reactive.Core">
+      <HintPath>..\packages\Rx-Core.2.2.31101\lib\portable-net40+sl5+win8+wp8\System.Reactive.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Interfaces">
+      <HintPath>..\packages\Rx-Interfaces.2.2.31101\lib\portable-net40+sl5+win8+wp8\System.Reactive.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Linq">
+      <HintPath>..\packages\Rx-Linq.2.2.31101\lib\portable-net40+sl5+win8+wp8\System.Reactive.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.PlatformServices">
+      <HintPath>..\packages\Rx-PlatformServices.2.2.31101\lib\portable-net40+sl5+win8+wp8\System.Reactive.PlatformServices.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..16b6b54
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/Properties/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+using System.Resources;
+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("PortableClassLibrary_NuGet")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("PortableClassLibrary_NuGet")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// 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/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/app.config b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/app.config
new file mode 100644
index 0000000..bc20d14
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/app.config
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-2.6.3.0" newVersion="2.6.3.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+</configuration>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/packages.config b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/packages.config
new file mode 100644
index 0000000..4b57ccf
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/PortableClassLibrary_NuGet/packages.config
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Rx-Core" version="2.2.31101" targetFramework="portable-net40+sl50+wp80+win" />
+  <package id="Rx-Interfaces" version="2.2.31101" targetFramework="portable-net40+sl50+wp80+win" />
+  <package id="Rx-Linq" version="2.2.31101" targetFramework="portable-net40+sl50+wp80+win" />
+  <package id="Rx-Main" version="2.2.31101" targetFramework="portable-net40+sl50+wp80+win" />
+  <package id="Rx-PlatformServices" version="2.2.31101" targetFramework="portable-net40+sl50+wp80+win" />
+</packages>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/App.xaml b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/App.xaml
new file mode 100644
index 0000000..0b6e380
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/App.xaml
@@ -0,0 +1,8 @@
+<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
+             x:Class="SilverlightApplication.App"
+             >
+    <Application.Resources>
+        
+    </Application.Resources>
+</Application>
diff --git a/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/App.xaml.cs b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/App.xaml.cs
new file mode 100644
index 0000000..16c1ecb
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/App.xaml.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Shapes;
+
+namespace SilverlightApplication
+{
+    public partial class App : Application
+    {
+
+        public App()
+        {
+            this.Startup += this.Application_Startup;
+            this.Exit += this.Application_Exit;
+            this.UnhandledException += this.Application_UnhandledException;
+
+            InitializeComponent();
+        }
+
+        private void Application_Startup(object sender, StartupEventArgs e)
+        {
+            this.RootVisual = new MainPage();
+        }
+
+        private void Application_Exit(object sender, EventArgs e)
+        {
+
+        }
+
+        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
+        {
+            // If the app is running outside of the debugger then report the exception using
+            // the browser's exception mechanism. On IE this will display it a yellow alert 
+            // icon in the status bar and Firefox will display a script error.
+            if (!System.Diagnostics.Debugger.IsAttached)
+            {
+
+                // NOTE: This will allow the application to continue running after an exception has been thrown
+                // but not handled. 
+                // For production applications this error handling should be replaced with something that will 
+                // report the error to the website and stop the application.
+                e.Handled = true;
+                Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
+            }
+        }
+
+        private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
+        {
+            try
+            {
+                string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
+                errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
+
+                System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
+            }
+            catch (Exception)
+            {
+            }
+        }
+    }
+}
diff --git a/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/MainPage.xaml b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/MainPage.xaml
new file mode 100644
index 0000000..c358e56
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/MainPage.xaml
@@ -0,0 +1,24 @@
+<UserControl x:Class="SilverlightApplication.MainPage"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+    mc:Ignorable="d"
+    d:DesignHeight="300" d:DesignWidth="400">
+
+    <Grid x:Name="LayoutRoot" Background="White">
+    <Grid.RowDefinitions>
+      <RowDefinition Height="auto" />
+      <RowDefinition Height="*" />
+      <RowDefinition Height="auto" />
+      <RowDefinition Height="*" />
+    </Grid.RowDefinitions>
+
+    <TextBlock Text="Observable 1:" Grid.Row="0"/>
+    <ListBox x:Name="list1" Grid.Row="1" />
+
+    <TextBlock Text="Observable 2:" Grid.Row="2"/>
+    <ListBox x:Name="list2" Grid.Row="3" />
+
+  </Grid>
+</UserControl>
diff --git a/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/MainPage.xaml.cs b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/MainPage.xaml.cs
new file mode 100644
index 0000000..2bfdb12
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/MainPage.xaml.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Shapes;
+using System.Reactive;
+using System.Reactive.Linq;
+
+namespace SilverlightApplication
+{
+    public partial class MainPage : UserControl
+    {
+        public MainPage()
+        {
+            InitializeComponent();
+            Loaded += new RoutedEventHandler(MainPage_Loaded);
+        }
+
+        void MainPage_Loaded(object sender, RoutedEventArgs e)
+        {
+            var portableClass = new PortableClassLibrary.PortableClass();
+
+            // Create timer and route output to list1
+            portableClass.CreateTimer(10, TimeSpan.FromSeconds(1.5))
+                .Buffer(2)
+                .ObserveOnDispatcher()
+                .Subscribe(items =>
+                {
+                    foreach (var item in items)
+                        list1.Items.Add(item);
+                }, onCompleted: () =>
+                {
+                    list1.Items.Add("Finished");
+                });
+
+            // Create list observer and route output to list1, but specify scheduler instead of using SubscribeOnDispatcher
+            var scheduler = System.Reactive.Concurrency.DispatcherScheduler.Current;
+            portableClass.CreateList(scheduler)
+                .Delay(TimeSpan.FromSeconds(1))
+                .ObserveOn(scheduler)
+                .Subscribe(item =>
+                {
+                    list2.Items.Add(item);
+                }, onCompleted: () =>
+                {
+                    list2.Items.Add("Finished");
+                });
+
+
+        }
+    }
+}
diff --git a/external/rx/Rx/NET/Test/Rx/SilverlightApp5/Properties/AppManifest.xml b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/Properties/AppManifest.xml
similarity index 100%
rename from external/rx/Rx/NET/Test/Rx/SilverlightApp5/Properties/AppManifest.xml
rename to external/rx/Rx/NET/Samples/Portable/SilverlightApplication/Properties/AppManifest.xml
diff --git a/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..1f8f23a
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+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("SilverlightApplication")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("SilverlightApplication")]
+[assembly: AssemblyCopyright("Copyright ©  2013")]
+[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("768e8030-d2c8-42c2-8e2c-58b43809ce52")]
+
+// 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 Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/SilverlightApplication.csproj b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/SilverlightApplication.csproj
new file mode 100644
index 0000000..5a21698
--- /dev/null
+++ b/external/rx/Rx/NET/Samples/Portable/SilverlightApplication/SilverlightApplication.csproj
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{50100DB6-3657-444B-B308-42A9FD1B283E}</ProjectGuid>
+    <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>SilverlightApplication</RootNamespace>
+    <AssemblyName>SilverlightApplication</AssemblyName>
+    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
+    <SilverlightApplication>true</SilverlightApplication>
+    <SupportedCultures>
+    </SupportedCultures>
+    <XapOutputs>true</XapOutputs>
+    <GenerateSilverlightManifest>true</GenerateSilverlightManifest>
+    <XapFilename>SilverlightApplication.xap</XapFilename>
+    <SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
+    <SilverlightAppEntry>SilverlightApplication.App</SilverlightAppEntry>
+    <TestPageFileName>SilverlightApplicationTestPage.html</TestPageFileName>
+    <CreateTestPage>true</CreateTestPage>
+    <ValidateXaml>true</ValidateXaml>
+    <EnableOutOfBrowser>false</EnableOutOfBrowser>
+    <OutOfBrowserSettingsFile>Properties\OutOfBrowserSettings.xml</OutOfBrowserSettingsFile>
+    <UsePlatformExtensions>false</UsePlatformExtensions>
+    <ThrowErrorsInValidation>true</ThrowErrorsInValidation>
+    <LinkedServerProject>
+    </LinkedServerProject>
+  </PropertyGroup>
+  <!-- This property group is only here to support building this project using the 
+       MSBuild 3.5 toolset. In order to work correctly with this older toolset, it needs 
+       to set the TargetFrameworkVersion to v3.5 -->
+  <PropertyGroup Condition="'$(MSBuildToolsVersion)' == '3.5'">
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>Bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants>
+    <NoStdLib>true</NoStdLib>
+    <NoConfig>true</NoConfig>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>Bin\Release</OutputPath>
+    <DefineConstants>TRACE;SILVERLIGHT</DefineConstants>
+    <NoStdLib>true</NoStdLib>
+    <NoConfig>true</NoConfig>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System.Reactive.Core">
+      <HintPath>..\..\..\Source\bin\DebugSL4\System.Reactive.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Debugger">
+      <HintPath>..\..\..\Source\bin\DebugSL4\System.Reactive.Debugger.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Experimental">
+      <HintPath>..\..\..\Source\bin\DebugSL4\System.Reactive.Experimental.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Interfaces">
+      <HintPath>..\..\..\Source\bin\DebugSL4\System.Reactive.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Linq">
+      <HintPath>..\..\..\Source\bin\DebugSL4\System.Reactive.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.PlatformServices">
+      <HintPath>..\..\..\Source\bin\DebugSL4\System.Reactive.PlatformServices.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Providers">
+      <HintPath>..\..\..\Source\bin\DebugSL4\System.Reactive.Providers.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Windows.Threading">
+      <HintPath>..\..\..\Source\bin\DebugSL4\System.Reactive.Windows.Threading.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows" />
+    <Reference Include="system" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Net" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Windows.Browser" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="App.xaml.cs">
+      <DependentUpon>App.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="MainPage.xaml.cs">
+      <DependentUpon>MainPage.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ApplicationDefinition Include="App.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </ApplicationDefinition>
+    <Page Include="MainPage.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Properties\AppManifest.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\PortableClassLibrary\PortableClassLibrary.csproj">
+      <Project>{24A63BF3-D9ED-4F4D-B576-E7A73AE00420}</Project>
+      <Name>PortableClassLibrary</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+        <SilverlightProjectProperties />
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/.nuget/NuGet.Config b/external/rx/Rx/NET/Source/.nuget/NuGet.Config
new file mode 100644
index 0000000..67f8ea0
--- /dev/null
+++ b/external/rx/Rx/NET/Source/.nuget/NuGet.Config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <solution>
+    <add key="disableSourceControlIntegration" value="true" />
+  </solution>
+</configuration>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/.nuget/NuGet.targets b/external/rx/Rx/NET/Source/.nuget/NuGet.targets
new file mode 100644
index 0000000..83fe906
--- /dev/null
+++ b/external/rx/Rx/NET/Source/.nuget/NuGet.targets
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <PropertyGroup>
+        <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
+        
+        <!-- Enable the restore command to run before builds -->
+        <RestorePackages Condition="  '$(RestorePackages)' == '' ">false</RestorePackages>
+
+        <!-- Property that enables building a package from a project -->
+        <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>
+
+        <!-- Determines if package restore consent is required to restore packages -->
+        <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>
+        
+        <!-- Download NuGet.exe if it does not already exist -->
+        <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
+    </PropertyGroup>
+    
+    <ItemGroup Condition=" '$(PackageSources)' == '' ">
+        <!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
+        <!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
+        <!--
+            <PackageSource Include="https://www.nuget.org/api/v2/" />
+            <PackageSource Include="https://my-nuget-source/nuget/" />
+        -->
+    </ItemGroup>
+
+    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
+        <!-- Windows specific commands -->
+        <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
+        <PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
+    </PropertyGroup>
+    
+    <PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
+        <!-- We need to launch nuget.exe with the mono command if we're not on windows -->
+        <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
+        <PackagesConfig>packages.config</PackagesConfig>
+    </PropertyGroup>
+    
+    <PropertyGroup>
+        <!-- NuGet command -->
+        <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
+        <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
+        
+        <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
+        <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>
+
+        <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
+        
+        <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
+        <NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>
+        
+        <PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
+        <PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>
+
+        <!-- Commands -->
+        <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
+        <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
+
+        <!-- We need to ensure packages are restored prior to assembly resolve -->
+        <BuildDependsOn Condition="$(RestorePackages) == 'true'">
+            RestorePackages;
+            $(BuildDependsOn);
+        </BuildDependsOn>
+
+        <!-- Make the build depend on restore packages -->
+        <BuildDependsOn Condition="$(BuildPackage) == 'true'">
+            $(BuildDependsOn);
+            BuildPackage;
+        </BuildDependsOn>
+    </PropertyGroup>
+
+    <Target Name="CheckPrerequisites">
+        <!-- Raise an error if we're unable to locate nuget.exe  -->
+        <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
+        <!--
+        Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once.
+        This effectively acts as a lock that makes sure that the download operation will only happen once and all
+        parallel builds will have to wait for it to complete.
+        -->
+        <MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
+    </Target>
+
+    <Target Name="_DownloadNuGet">
+        <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
+    </Target>
+
+    <Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
+        <Exec Command="$(RestoreCommand)"
+              Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />
+              
+        <Exec Command="$(RestoreCommand)"
+              LogStandardErrorAsError="true"
+              Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
+    </Target>
+
+    <Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
+        <Exec Command="$(BuildCommand)" 
+              Condition=" '$(OS)' != 'Windows_NT' " />
+              
+        <Exec Command="$(BuildCommand)"
+              LogStandardErrorAsError="true"
+              Condition=" '$(OS)' == 'Windows_NT' " />
+    </Target>
+    
+    <UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
+        <ParameterGroup>
+            <OutputFilename ParameterType="System.String" Required="true" />
+        </ParameterGroup>
+        <Task>
+            <Reference Include="System.Core" />
+            <Using Namespace="System" />
+            <Using Namespace="System.IO" />
+            <Using Namespace="System.Net" />
+            <Using Namespace="Microsoft.Build.Framework" />
+            <Using Namespace="Microsoft.Build.Utilities" />
+            <Code Type="Fragment" Language="cs">
+                <![CDATA[
+                try {
+                    OutputFilename = Path.GetFullPath(OutputFilename);
+
+                    Log.LogMessage("Downloading latest version of NuGet.exe...");
+                    WebClient webClient = new WebClient();
+                    webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);
+
+                    return true;
+                }
+                catch (Exception ex) {
+                    Log.LogErrorFromException(ex);
+                    return false;
+                }
+            ]]>
+            </Code>
+        </Task>
+    </UsingTask>
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/35MSSharedLib1024.snk b/external/rx/Rx/NET/Source/35MSSharedLib1024.snk
new file mode 100644
index 0000000..695f1b3
Binary files /dev/null and b/external/rx/Rx/NET/Source/35MSSharedLib1024.snk differ
diff --git a/external/rx/Rx/NET/Source/BuildAll.proj b/external/rx/Rx/NET/Source/BuildAll.proj
index 69736e4..b0e1dab 100644
--- a/external/rx/Rx/NET/Source/BuildAll.proj
+++ b/external/rx/Rx/NET/Source/BuildAll.proj
@@ -34,6 +34,12 @@
       <Configuration>ReleasePL</Configuration>
     </Flavor>
     <Flavor Include="Rx.sln">
+      <Configuration>DebugPLLITE</Configuration>
+    </Flavor>
+    <Flavor Include="Rx.sln">
+      <Configuration>ReleasePLLITE</Configuration>
+    </Flavor>	
+    <Flavor Include="Rx.sln">
       <Configuration>DebugWP7</Configuration>
     </Flavor>
     <Flavor Include="Rx.sln">
diff --git a/external/rx/Rx/NET/Source/Common.targets b/external/rx/Rx/NET/Source/Common.targets
index 90b6fe2..5fdb426 100644
--- a/external/rx/Rx/NET/Source/Common.targets
+++ b/external/rx/Rx/NET/Source/Common.targets
@@ -23,6 +23,15 @@
     <BuildTarget>PL</BuildTarget>
   </PropertyGroup>
 
+    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugPLLITE|AnyCPU' ">
+    <BuildConfig>Debug</BuildConfig>
+    <BuildTarget>PLLITE</BuildTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleasePLLITE|AnyCPU' ">
+    <BuildConfig>Release</BuildConfig>
+    <BuildTarget>PLLITE</BuildTarget>
+  </PropertyGroup>
+
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug45|AnyCPU' ">
     <BuildConfig>Debug</BuildConfig>
     <BuildTarget>45</BuildTarget>
@@ -77,15 +86,6 @@
     <BuildTarget>WP8</BuildTarget>
   </PropertyGroup>
 
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugXBLV|AnyCPU' ">
-    <BuildConfig>Debug</BuildConfig>
-    <BuildTarget>XBLV</BuildTarget>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU' ">
-    <BuildConfig>Release</BuildConfig>
-    <BuildTarget>XBLV</BuildTarget>
-  </PropertyGroup>
-
 
   <PropertyGroup Condition=" '$(BuildTarget)' == 'PL' ">
     <DefineConstants>$(DefineConstants);NO_EVENTARGS_CONSTRAINT;HAS_EDI;HAS_WINRT;HAS_PROGRESS;PREFER_ASYNC;HAS_AWAIT;HAS_APTCA;NO_REMOTING;NO_SERIALIZABLE;NO_THREAD;CRIPPLED_REFLECTION;PLIB;NO_CDS_COLLECTIONS;USE_TIMER_SELF_ROOT</DefineConstants>
@@ -93,7 +93,6 @@
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <TargetFrameworkProfile>Profile78</TargetFrameworkProfile>
     <NoStdLib>true</NoStdLib>
-    <!-- <SignKeyEnhanced>true</SignKeyEnhanced>  Disabled due to CLR signing bug w/ SHA2 keys blocking Windows Phone 8 apps from being signed. -->
   </PropertyGroup>
 
   <PropertyGroup Condition=" '$(BuildTarget)' == '45' ">
@@ -102,7 +101,6 @@
     <NoStdLib>true</NoStdLib>
     <BuildPlatform>DESKTOPCLR</BuildPlatform>
     <BuildFlavor>DESKTOPCLR45</BuildFlavor>
-    <!-- <SignKeyEnhanced>true</SignKeyEnhanced>  Disabled due to CLR signing bug w/ SHA2 keys blocking Windows Phone 8 apps from being signed. -->
   </PropertyGroup>
 
   <PropertyGroup Condition=" '$(BuildTarget)' == '8' ">
@@ -113,7 +111,6 @@
     <BuildPlatform>WINDOWS</BuildPlatform>
     <BuildFlavor>WINDOWS8</BuildFlavor>
     <DefaultLanguage>en-US</DefaultLanguage>
-    <!-- <SignKeyEnhanced>true</SignKeyEnhanced>  Disabled due to CLR signing bug w/ SHA2 keys blocking Windows Phone 8 apps from being signed. -->
   </PropertyGroup>
 
   <PropertyGroup Condition=" '$(BuildTarget)' == '40' ">
@@ -132,6 +129,23 @@
     <BuildPlatform>SILVERLIGHT</BuildPlatform>
     <BuildFlavor>SILVERLIGHT5</BuildFlavor>
   </PropertyGroup>
+  
+  
+  
+  <PropertyGroup Condition=" '$(BuildTarget)' == 'PLLITE' ">
+    <DefineConstants>$(DefineConstants);NO_RXINTERFACES;NO_SERIALIZABLE;NO_REMOTING;NO_SEMAPHORE;NO_STOPWATCH;NO_CDS;PLIB;PLIB_LITE;NO_THREAD;USE_TASKEX;CRIPPLED_REFLECTION</DefineConstants>    
+    <TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+      <!-- 
+      Profile2   = .NET for Windows Store apps, .NET Framework 4, Silverlight 4, Windows Phone 7
+      Profile36  = .NET for Windows Store apps, .NET Framework 4, Silverlight 4, Windows Phone 8
+      Profile88  = .NET for Windows Store apps, .NET Framework 4, Silverlight 4, Windows Phone 7.5
+      Profile96  = .NET for Windows Store apps, .NET Framework 4.0.3, Silverlight 4, Windows Phone 7.5
+      Profile136 = .NET for Windows Store apps, .NET Framework 4, Silverlight 5, Windows Phone 8
+      -->
+    <TargetFrameworkProfile>Profile136</TargetFrameworkProfile>
+    <NoStdLib>true</NoStdLib>
+  </PropertyGroup>
 
   <PropertyGroup Condition=" '$(BuildTarget)' == 'WP7' ">
     <DefineConstants>$(DefineConstants);USE_SL_DISPATCHER;NO_SERIALIZABLE;NO_REMOTING;NO_CDS;NO_TLS;NO_VARIANCE;NO_TPL;NO_HASHSET;NO_SEMAPHORE;NO_LARGEARITY;NO_EXPRESSIONVISITOR;NO_LAZY;NO_WEAKTABLE;NO_INTERLOCKED_64;WINDOWSPHONE7</DefineConstants>
@@ -145,7 +159,7 @@
   </PropertyGroup>
 
   <PropertyGroup Condition=" '$(BuildTarget)' == 'WP8' ">
-    <DefineConstants>$(DefineConstants);NO_EVENTARGS_CONSTRAINT;USE_SL_DISPATCHER;NO_SERIALIZABLE;NO_REMOTING;NO_CDS_COLLECTIONS;USE_TIMER_SELF_ROOT</DefineConstants>
+    <DefineConstants>$(DefineConstants);HAS_EDI;HAS_PROGRESS;PREFER_ASYNC;HAS_AWAIT;NO_EVENTARGS_CONSTRAINT;USE_SL_DISPATCHER;HAS_WINRT;NO_SERIALIZABLE;NO_REMOTING;NO_CDS_COLLECTIONS;USE_TIMER_SELF_ROOT</DefineConstants>
     <TargetFrameworkIdentifier>WindowsPhone</TargetFrameworkIdentifier>
     <TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
     <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
@@ -153,20 +167,16 @@
     <BuildPlatform>WINDOWS_PHONE</BuildPlatform>
     <BuildFlavor>WINDOWS_PHONE8</BuildFlavor>
     <NoStdLib>true</NoStdLib>
-    <!-- <SignKeyEnhanced>true</SignKeyEnhanced>  Disabled due to CLR signing bug w/ SHA2 keys blocking Windows Phone 8 apps from being signed. -->
-  </PropertyGroup>
-
-  <PropertyGroup Condition=" '$(BuildTarget)' == 'XBLV' ">
-    <DefineConstants>$(DefineConstants);NO_RXINTERFACES;USE_SL_DISPATCHER;NO_SERIALIZABLE;NO_REMOTING;NO_SEMAPHORE;NO_STOPWATCH;NO_CDS;NO_TPL;NO_LAZY;NO_WEAKTABLE;NO_VARIANCE;NO_HASHSET;NO_LARGEARITY;NO_EXPRESSIONVISITOR;NO_EXPRESSIONS</DefineConstants>
-    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
-    <TargetFrameworkVersion>v3.0</TargetFrameworkVersion>
-    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
-    <SilverlightApplication>false</SilverlightApplication>
-    <BuildPlatform>SILVERLIGHT</BuildPlatform>
-    <BuildFlavor>XBOX_LAKEVIEW</BuildFlavor>
   </PropertyGroup>
 
-
+  <!--<PropertyGroup Condition=" '$(BuildTarget)' == 'PortableWP7' ">
+    <DefineConstants>$(DefineConstants);NO_VARIANCE;NO_EVENTARGS_CONSTRAINT;HAS_EDI;HAS_WINRT;HAS_PROGRESS;PREFER_ASYNC;HAS_AWAIT;HAS_APTCA;NO_REMOTING;NO_SERIALIZABLE;NO_THREAD;CRIPPLED_REFLECTION;PLIB;NO_CDS_COLLECTIONS;USE_TIMER_SELF_ROOT</DefineConstants>
+    <TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Profile4</TargetFrameworkProfile>
+    <NoStdLib>true</NoStdLib>
+  </PropertyGroup>-->
+  
   <!--
        ********************
        * LEGACY PLATFORMS *
@@ -281,7 +291,7 @@
 
   <PropertyGroup>
     <DefineConstants>$(DefineConstants);$(BuildPlatform);$(BuildFlavor);TRACE</DefineConstants>
-    <OutputPath>bin\$(BuildConfig)$(BuildTarget)</OutputPath>
+    <OutputPath>..\bin\$(BuildConfig)$(BuildTarget)</OutputPath>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
@@ -315,23 +325,14 @@
     <DefineConstants>$(DefineConstants);STRESS</DefineConstants>
   </PropertyGroup>
   
-  <PropertyGroup Condition=" '$(ProductSignAssembly)' == 'true' AND '$(SignedBuild)' == '1' ">
+  <PropertyGroup Condition=" '$(ProductSignAssembly)' == 'true' AND '$(Sign)' == 'Sign' ">
     <DefineConstants>$(DefineConstants);SIGNED</DefineConstants>
     <SignAssembly>true</SignAssembly>
     <DelaySign>true</DelaySign>
-  </PropertyGroup>
-
-  <PropertyGroup Condition=" '$(SignAssembly)' == 'true' AND '$(SignKeyEnhanced)' != 'true' ">
-    <AssemblyOriginatorKeyFile>..\..\..\Private\35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
+    <AssemblyOriginatorKeyFile>..\35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
     <SignKeyId>72</SignKeyId>
   </PropertyGroup>
 
-  <PropertyGroup Condition=" '$(SignAssembly)' == 'true' AND '$(SignKeyEnhanced)' == 'true' ">
-    <AssemblyOriginatorKeyFile>..\..\..\Private\272MSSharedLibSN2048.snk</AssemblyOriginatorKeyFile>
-    <DefineConstants>$(DefineConstants);SIGNENHANCED</DefineConstants>
-    <SignKeyId>272</SignKeyId>
-  </PropertyGroup>
-
   <PropertyGroup Condition=" '$(BuildLab)' == '1' ">
     <DefineConstants>$(DefineConstants);NO_CODECOVERAGE</DefineConstants>
   </PropertyGroup>
@@ -345,5 +346,57 @@
   <PropertyGroup>
     <ReferencePath>$(MSBuildProjectDirectory)\..\References\$(BuildFlavor)</ReferencePath>
   </PropertyGroup>
+
+<!--
+       ************************************************
+       * GENERAL REFERENCES - Microsoft.Bcl and Async *
+       ************************************************
+   -->
+
+   <ItemGroup Condition=" '$(BuildTarget)' == 'PLLITE' ">
+    <!--- Microsoft.Bcl References -->
+    <Reference Include="System.Runtime">
+      <HintPath>..\packages\Microsoft.Bcl.1.0.19\lib\portable-net40+sl5+win8+wp8\System.Runtime.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System.Threading.Tasks">
+      <HintPath>..\packages\Microsoft.Bcl.1.0.19\lib\portable-net40+sl5+win8+wp8\System.Threading.Tasks.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <!--- Microsoft.Bcl.Async References -->
+    <Reference Include="Microsoft.Threading.Tasks">
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.16\lib\portable-net40+sl4+win8+wp71\Microsoft.Threading.Tasks.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks.Extensions">
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.16\lib\portable-net40+sl4+win8+wp71\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
+      <Private>False</Private>
+    </Reference>    
+  </ItemGroup>
+   
+  <ItemGroup Condition=" '$(BuildTarget)' == '40' ">
+  
+    <Reference Include="Microsoft.Threading.Tasks">
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.16\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks.Extensions">
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.16\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop">
+      <HintPath>..\packages\Microsoft.Bcl.Async.1.0.16\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System.Runtime">
+      <HintPath>..\packages\Microsoft.Bcl.1.0.19\lib\net40\System.Runtime.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System.Threading.Tasks">
+      <HintPath>..\packages\Microsoft.Bcl.1.0.19\lib\net40\System.Threading.Tasks.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+
   
 </Project>
diff --git a/external/rx/Rx/NET/Source/Import.targets b/external/rx/Rx/NET/Source/Import.targets
index b5f5c1e..c6403e4 100644
--- a/external/rx/Rx/NET/Source/Import.targets
+++ b/external/rx/Rx/NET/Source/Import.targets
@@ -1,29 +1,66 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
   <!-- Non-Portable Library build -->
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v11.0\Microsoft.Windows.UI.Xaml.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' == '.NETCore' " />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And ('$(BuildPlatform)' == 'DESKTOPCLR' Or '$(BuildPlatform)' == 'XNA') " />
+  
+  <!-- Silverlight ONLY (i.e., not phone) -->
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildPlatform)' == 'SILVERLIGHT' AND !('$(BuildFlavor)' == 'SILVERLIGHTM7') " />
+  
+  <!-- Windows Phone 7.1 (Silverlight for Phone) -->
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\Silverlight for Phone\$(TargetFrameworkVersion)\Microsoft.Silverlight.$(TargetFrameworkProfile).Overrides.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildFlavor)' == 'SILVERLIGHTM7' " />
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\Silverlight for Phone\$(TargetFrameworkVersion)\Microsoft.Silverlight.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildFlavor)' == 'SILVERLIGHTM7' " />
+  
+  <!-- Windows Phone 8 -->
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\$(TargetFrameworkIdentifier)\$(TargetFrameworkVersion)\Microsoft.$(TargetFrameworkIdentifier).$(TargetFrameworkVersion).Overrides.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildFlavor)' == 'WINDOWS_PHONE8' "/>
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\$(TargetFrameworkIdentifier)\$(TargetFrameworkVersion)\Microsoft.$(TargetFrameworkIdentifier).CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildFlavor)' == 'WINDOWS_PHONE8' "/>
-  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\Microsoft.Xna.GameStudio.targets" Condition=" '$(TargetFrameworkIdentifier)' != '.NETPortable' And '$(BuildPlatform)' == 'XNA' "/>
-  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Compact\Microsoft.CompactFramework.CSharp.targets" Condition=" '$(BuildPlatform)' == 'NETCF' " />
-  <Import Project="$(MSBuildExtensionsPath)\Microsoft\Xbox 360 ADK\Microsoft.Xbox360.Adk.App.targets" Condition=" '$(BuildPlatform)' == 'XBOX' " />
-
+ 
   <!-- Portable Library Build -->
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" Condition=" '$(TargetFrameworkIdentifier)' == '.NETPortable' " />
 
+
+  <!-- If "Sign" is set and assembly should be signed, generate a .sign file-->  
   <Target Name="AfterBuild">
-    <WriteLinesToFile Condition=" '$(ProductSignAssembly)' == 'true' AND '$(SignedBuild)' == '1' "
-                      File="$(OutDir)\$(TargetFileName).sign" Overwrite="true"
-                      Lines="[$(SignKeyId)] Auto-generated file. Indicates the corresponding binary file needs to be signed." />
+    
+    <WriteLinesToFile Condition=" '$(ProductSignAssembly)' == 'true' AND '$(Sign)' == 'Sign' "
+        File="$(OutDir)\$(TargetFileName).sign"
+        Overwrite="true"
+        Lines="Auto-generated file, indicates the corresponding binary file needs to be signed.">
+    </WriteLinesToFile>
 
     <!-- Hack for Metro; for some reason the XAML build creates intermediary folders, so we flatten the hierarchy for consumption by the setup build at a later stage -->
+ 
+    <!-- For some reason, using a plain <ItemGroup> does not fill in the list correctly, so we must use <CreateItem> -->
+    <CreateItem Include="$(OutDir)\*.sign;$(OutDir)\*.xml" Condition=" '$(TargetFrameworkIdentifier)' == '.NETCore' ">
+      <Output TaskParameter="Include" ItemName="CanaryFiles" />
+    </CreateItem>
+
+    <Message Text="-- Canary files: @(CanaryFiles)" Importance="high"/>
+    <Move
+        SourceFiles="@(CanaryFiles)"
+        DestinationFolder="$(OutDir)\.."
+        Condition=" '$(TargetFrameworkIdentifier)' == '.NETCore' " />
+
+    <!-- For some reason, using a plain <ItemGroup> does not fill in the list correctly, so we must use <CreateItem> -->
     <CreateItem Include="$(OutDir)\*.*" Condition=" '$(TargetFrameworkIdentifier)' == '.NETCore' ">
       <Output TaskParameter="Include" ItemName="BuiltFilesInOutDir" />
     </CreateItem>
-    <Copy SourceFiles="@(BuiltFilesInOutDir)" DestinationFolder="$(OutDir)\.." Condition=" '$(TargetFrameworkIdentifier)' == '.NETCore' " />
+
+    <Message Text="-- Built files: @(BuiltFilesInOutDir)" Importance="high"/>
+    <Copy
+        SourceFiles="@(BuiltFilesInOutDir)"
+        DestinationFolder="$(OutDir)\.."
+        Condition=" '$(TargetFrameworkIdentifier)' == '.NETCore' " />
   </Target>
+  
+	<!--  MICROSOFT BCL ASYNC CONFIGURATION -->
+	<!-- TODO: Add acondition to only load it when required? -->
+	
+	 <!-- Skip validation of packages.config since we are manageing the packages manuallt  --> 
+	 <PropertyGroup>
+			<SkipValidatePackageReferences>true</SkipValidatePackageReferences>
+	 </PropertyGroup>
+	<Import Project="packages\Microsoft.Bcl.Build.1.0.4\tools\Microsoft.Bcl.Build.targets"   Condition=" '$(BuildTarget)' == 'PLLITE' Or '$(BuildTarget)' == '40' " />
+  
 </Project>
diff --git a/external/rx/Rx/NET/Source/Local.testsettings b/external/rx/Rx/NET/Source/Local.testsettings
index 95d94d8..72cfdcc 100644
--- a/external/rx/Rx/NET/Source/Local.testsettings
+++ b/external/rx/Rx/NET/Source/Local.testsettings
@@ -19,21 +19,5 @@
         </Browser>
       </WebTestRunConfiguration>
     </TestTypeSpecific>
-    <AgentRule name="LocalMachineDefaultRole">
-      <DataCollectors>
-        <DataCollector uri="datacollector://microsoft/CodeCoverage/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TestTools.CodeCoverage.CoveragePlugIn, Microsoft.VisualStudio.QualityTools.Plugins.CodeCoverage, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="Code Coverage">
-          <Configuration>
-            <CodeCoverage xmlns="">
-              <Regular>
-                <CodeCoverageItem binaryFile="System.Reactive.Core\bin\Debug40\System.Reactive.Core.dll" pdbFile="System.Reactive.Core\bin\Debug40\System.Reactive.Core.pdb" instrumentInPlace="true" />
-                <CodeCoverageItem binaryFile="System.Reactive.Interfaces\bin\Debug40\System.Reactive.Interfaces.dll" pdbFile="System.Reactive.Interfaces\bin\Debug40\System.Reactive.Interfaces.pdb" instrumentInPlace="true" />
-                <CodeCoverageItem binaryFile="System.Reactive.Linq\bin\Debug40\System.Reactive.Linq.dll" pdbFile="System.Reactive.Linq\bin\Debug40\System.Reactive.Linq.pdb" instrumentInPlace="true" />
-                <CodeCoverageItem binaryFile="System.Reactive.PlatformServices\bin\Debug40\System.Reactive.PlatformServices.dll" pdbFile="System.Reactive.PlatformServices\bin\Debug40\System.Reactive.PlatformServices.pdb" instrumentInPlace="true" />
-              </Regular>
-            </CodeCoverage>
-          </Configuration>
-        </DataCollector>
-      </DataCollectors>
-    </AgentRule>
   </Execution>
 </TestSettings>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/Properties/AssemblyInfo.cs
index 826b2c0..fb122f2 100644
--- a/external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/Properties/AssemblyInfo.cs
@@ -17,7 +17,11 @@ using System.Runtime.InteropServices;
 
 [assembly: ComVisible(false)]
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Source/Build/Activities/AppendVersionInfo.cs for more information.
-//
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ReactiveTest.cs b/external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ReactiveTest.cs
index 37ff279..45d8424 100644
--- a/external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ReactiveTest.cs
+++ b/external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ReactiveTest.cs
@@ -65,15 +65,13 @@ namespace Microsoft.Reactive.Testing
         }
 
         /// <summary>
-        /// Factory method for an OnCompleted notification record at a given time.
+        /// Factory method for an OnCompleted notification record at a given time, using inference to determine the type of <typeparamref name="T"/>.
         /// </summary>
         /// <typeparam name="T">The element type for the resulting notification object.</typeparam>
-        /// <param name="dummy">An unused instance of type T, to force the compiler to infer that T as part of the method's return value.</param>
         /// <param name="ticks">Recorded virtual time the OnCompleted notification occurs.</param>
+        /// <param name="witness">Object solely used to infer the type of the <typeparamref name="T"/> type parameter. This parameter is typically used when creating a sequence of anonymously typed elements.</param>
         /// <returns>Recorded OnCompleted notification.</returns>
-        /// <remarks>This overload is used for anonymous types - by passing in an instance of the type, the compiler can infer the 
-        /// anonymous type without you having to try naming the type.</remarks>
-        public static Recorded<Notification<T>> OnCompleted<T>(T dummy, long ticks)
+        public static Recorded<Notification<T>> OnCompleted<T>(long ticks, T witness)
         {
             return new Recorded<Notification<T>>(ticks, Notification.CreateOnCompleted<T>());
         }
@@ -109,19 +107,17 @@ namespace Microsoft.Reactive.Testing
 
             return new Recorded<Notification<T>>(ticks, new OnErrorPredicate<T>(predicate));
         }
-
+        
         /// <summary>
-        /// Factory method for an OnError notification record at a given time with a given error.
+        /// Factory method for an OnError notification record at a given time with a given error, using inference to determine the type of <typeparamref name="T"/>.
         /// </summary>
         /// <typeparam name="T">The element type for the resulting notification object.</typeparam>
-        /// <param name="dummy">An unused instance of type T, to force the compiler to infer that T as part of the method's return value.</param>
         /// <param name="ticks">Recorded virtual time the OnError notification occurs.</param>
         /// <param name="exception">Recorded exception stored in the OnError notification.</param>
+        /// <param name="witness">Object solely used to infer the type of the <typeparamref name="T"/> type parameter. This parameter is typically used when creating a sequence of anonymously typed elements.</param>
         /// <returns>Recorded OnError notification.</returns>
         /// <exception cref="ArgumentNullException"><paramref name="exception"/> is null.</exception>
-        /// <remarks>This overload is used for anonymous types - by passing in an instance of the type, the compiler can infer the 
-        /// anonymous type without you having to try naming the type.</remarks>
-        public static Recorded<Notification<T>> OnError<T>(T dummy, long ticks, Exception exception)
+        public static Recorded<Notification<T>> OnError<T>(long ticks, Exception exception, T witness)
         {
             if (exception == null)
                 throw new ArgumentNullException("exception");
@@ -130,17 +126,15 @@ namespace Microsoft.Reactive.Testing
         }
 
         /// <summary>
-        /// Factory method for writing an assert that checks for an OnError notification record at a given time, using the specified predicate to check the exception.
+        /// Factory method for writing an assert that checks for an OnError notification record at a given time, using the specified predicate to check the exception and inference to determine the type of <typeparamref name="T"/>.
         /// </summary>
         /// <typeparam name="T">The element type for the resulting notification object.</typeparam>
-        /// <param name="dummy">An unused instance of type T, to force the compiler to infer that T as part of the method's return value.</param>
         /// <param name="ticks">Recorded virtual time the OnError notification occurs.</param>
         /// <param name="predicate">Predicate function to check the OnError notification value against an expected exception.</param>
+        /// <param name="witness">Object solely used to infer the type of the <typeparamref name="T"/> type parameter. This parameter is typically used when creating a sequence of anonymously typed elements.</param>
         /// <returns>Recorded OnError notification with a predicate to assert a given exception.</returns>
         /// <exception cref="ArgumentNullException"><paramref name="predicate"/> is null.</exception>
-        /// <remarks>This overload is used for anonymous types - by passing in an instance of the type, the compiler can infer the 
-        /// anonymous type without you having to try naming the type.</remarks>
-        public static Recorded<Notification<T>> OnError<T>(T dummy, long ticks, Func<Exception, bool> predicate)
+        public static Recorded<Notification<T>> OnError<T>(long ticks, Func<Exception, bool> predicate, T witness)
         {
             if (predicate == null)
                 throw new ArgumentNullException("predicate");
diff --git a/external/rx/Rx/NET/Source/Playground/Playground.csproj b/external/rx/Rx/NET/Source/Playground/Playground.csproj
index 3408729..30bf28d 100644
--- a/external/rx/Rx/NET/Source/Playground/Playground.csproj
+++ b/external/rx/Rx/NET/Source/Playground/Playground.csproj
@@ -77,7 +77,7 @@
     </ProjectReference>
     <ProjectReference Include="..\System.Reactive.Linq\System.Reactive.Linq.csproj">
       <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
-      <Name>System.Reactive</Name>
+      <Name>System.Reactive.Linq</Name>
     </ProjectReference>
     <ProjectReference Include="..\System.Reactive.Providers\System.Reactive.Providers.csproj">
       <Project>{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}</Project>
diff --git a/external/rx/Rx/NET/Source/Rx.sln b/external/rx/Rx/NET/Source/Rx.sln
index c46be4f..a5ac016 100644
--- a/external/rx/Rx/NET/Source/Rx.sln
+++ b/external/rx/Rx/NET/Source/Rx.sln
@@ -41,17 +41,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Reactive.Experimenta
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Reactive.Debugger", "System.Reactive.Debugger\System.Reactive.Debugger.csproj", "{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{45E85DEB-BDCC-4684-A952-187A5524750B}"
+	ProjectSection(SolutionItems) = preProject
+		.nuget\NuGet.Config = .nuget\NuGet.Config
+		.nuget\NuGet.exe = .nuget\NuGet.exe
+		.nuget\NuGet.targets = .nuget\NuGet.targets
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Reactive.Observable.Aliases", "System.Reactive.Observable.Aliases\System.Reactive.Observable.Aliases.csproj", "{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}"
+EndProject
 Global
-	GlobalSection(TeamFoundationVersionControl) = preSolution
-		SccNumberOfProjects = 1
-		SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
-		SccTeamFoundationServer = http://tfs1:8085/tfs/interop%20team%20projects
-		SccProjectUniqueName0 = Playground\\Playground.csproj
-		SccProjectName0 = Playground
-		SccAuxPath0 = http://tfs1:8085/tfs/interop%20team%20projects
-		SccLocalPath0 = Playground
-		SccProvider0 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
-	EndGlobalSection
 	GlobalSection(TestCaseManagementSettings) = postSolution
 		CategoryFile = Rx.vsmdi
 	EndGlobalSection
@@ -71,15 +70,12 @@ Global
 		Debug8|Any CPU = Debug8|Any CPU
 		Debug8|Mixed Platforms = Debug8|Mixed Platforms
 		Debug8|x86 = Debug8|x86
-		DebugCF35|Any CPU = DebugCF35|Any CPU
-		DebugCF35|Mixed Platforms = DebugCF35|Mixed Platforms
-		DebugCF35|x86 = DebugCF35|x86
 		DebugPL|Any CPU = DebugPL|Any CPU
 		DebugPL|Mixed Platforms = DebugPL|Mixed Platforms
 		DebugPL|x86 = DebugPL|x86
-		DebugSL3|Any CPU = DebugSL3|Any CPU
-		DebugSL3|Mixed Platforms = DebugSL3|Mixed Platforms
-		DebugSL3|x86 = DebugSL3|x86
+		DebugPLLITE|Any CPU = DebugPLLITE|Any CPU
+		DebugPLLITE|Mixed Platforms = DebugPLLITE|Mixed Platforms
+		DebugPLLITE|x86 = DebugPLLITE|x86
 		DebugSL4|Any CPU = DebugSL4|Any CPU
 		DebugSL4|Mixed Platforms = DebugSL4|Mixed Platforms
 		DebugSL4|x86 = DebugSL4|x86
@@ -92,12 +88,6 @@ Global
 		DebugWP8|Any CPU = DebugWP8|Any CPU
 		DebugWP8|Mixed Platforms = DebugWP8|Mixed Platforms
 		DebugWP8|x86 = DebugWP8|x86
-		DebugXBLV|Any CPU = DebugXBLV|Any CPU
-		DebugXBLV|Mixed Platforms = DebugXBLV|Mixed Platforms
-		DebugXBLV|x86 = DebugXBLV|x86
-		DebugXNA4|Any CPU = DebugXNA4|Any CPU
-		DebugXNA4|Mixed Platforms = DebugXNA4|Mixed Platforms
-		DebugXNA4|x86 = DebugXNA4|x86
 		Release|Any CPU = Release|Any CPU
 		Release|Mixed Platforms = Release|Mixed Platforms
 		Release|x86 = Release|x86
@@ -113,15 +103,12 @@ Global
 		Release8|Any CPU = Release8|Any CPU
 		Release8|Mixed Platforms = Release8|Mixed Platforms
 		Release8|x86 = Release8|x86
-		ReleaseCF35|Any CPU = ReleaseCF35|Any CPU
-		ReleaseCF35|Mixed Platforms = ReleaseCF35|Mixed Platforms
-		ReleaseCF35|x86 = ReleaseCF35|x86
 		ReleasePL|Any CPU = ReleasePL|Any CPU
 		ReleasePL|Mixed Platforms = ReleasePL|Mixed Platforms
 		ReleasePL|x86 = ReleasePL|x86
-		ReleaseSL3|Any CPU = ReleaseSL3|Any CPU
-		ReleaseSL3|Mixed Platforms = ReleaseSL3|Mixed Platforms
-		ReleaseSL3|x86 = ReleaseSL3|x86
+		ReleasePLLITE|Any CPU = ReleasePLLITE|Any CPU
+		ReleasePLLITE|Mixed Platforms = ReleasePLLITE|Mixed Platforms
+		ReleasePLLITE|x86 = ReleasePLLITE|x86
 		ReleaseSL4|Any CPU = ReleaseSL4|Any CPU
 		ReleaseSL4|Mixed Platforms = ReleaseSL4|Mixed Platforms
 		ReleaseSL4|x86 = ReleaseSL4|x86
@@ -134,19 +121,13 @@ Global
 		ReleaseWP8|Any CPU = ReleaseWP8|Any CPU
 		ReleaseWP8|Mixed Platforms = ReleaseWP8|Mixed Platforms
 		ReleaseWP8|x86 = ReleaseWP8|x86
-		ReleaseXBLV|Any CPU = ReleaseXBLV|Any CPU
-		ReleaseXBLV|Mixed Platforms = ReleaseXBLV|Mixed Platforms
-		ReleaseXBLV|x86 = ReleaseXBLV|x86
-		ReleaseXNA4|Any CPU = ReleaseXNA4|Any CPU
-		ReleaseXNA4|Mixed Platforms = ReleaseXNA4|Mixed Platforms
-		ReleaseXNA4|x86 = ReleaseXNA4|x86
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -157,31 +138,26 @@ Global
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug40|x86.ActiveCfg = Debug40|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug45|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug45|Any CPU.Build.0 = DebugPL|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug45|Mixed Platforms.ActiveCfg = Debug45|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug45|Mixed Platforms.Build.0 = Debug45|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug45|x86.ActiveCfg = Debug45|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug8|Any CPU.Build.0 = DebugPL|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug8|Any CPU.ActiveCfg = Debug8|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug8|Any CPU.Build.0 = Debug8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Debug8|x86.ActiveCfg = Debug45|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugCF35|Any CPU.Build.0 = DebugCF35|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugCF35|Mixed Platforms.Build.0 = DebugCF35|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPLLITE|Any CPU.Build.0 = DebugPLLITE|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPLLITE|Mixed Platforms.Build.0 = DebugPLLITE|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -197,26 +173,16 @@ Global
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP7|Mixed Platforms.Build.0 = DebugWP7|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP8|Any CPU.Build.0 = DebugPL|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP8|Any CPU.Build.0 = DebugWP8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXBLV|Any CPU.Build.0 = DebugXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXNA4|Any CPU.Build.0 = DebugXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -227,31 +193,26 @@ Global
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release40|x86.ActiveCfg = Release40|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release45|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release45|Any CPU.Build.0 = ReleasePL|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release45|Any CPU.Build.0 = Release45|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release45|Mixed Platforms.ActiveCfg = Release45|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release45|Mixed Platforms.Build.0 = Release45|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release45|x86.ActiveCfg = Release45|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release8|Any CPU.ActiveCfg = Release8|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release8|Any CPU.Build.0 = Release8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.Release8|x86.ActiveCfg = Release45|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseCF35|Any CPU.Build.0 = ReleaseCF35|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseCF35|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePLLITE|Any CPU.Build.0 = ReleasePLLITE|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePLLITE|Mixed Platforms.Build.0 = ReleasePLLITE|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -267,26 +228,16 @@ Global
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP7|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
+		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP8|Any CPU.Build.0 = ReleaseWP8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXBLV|Any CPU.Build.0 = ReleaseXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXNA4|Any CPU.Build.0 = ReleaseXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{63252AE9-5186-45CA-BFCD-FA51C6B66A43}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -307,17 +258,12 @@ Global
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Debug8|x86.ActiveCfg = Debug45|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -338,19 +284,11 @@ Global
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -371,17 +309,12 @@ Global
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.Release8|x86.ActiveCfg = Release45|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -402,19 +335,11 @@ Global
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -433,18 +358,14 @@ Global
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug8|Any CPU.ActiveCfg = Debug8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Debug8|x86.ActiveCfg = Debug45|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugPLLITE|Any CPU.ActiveCfg = Debug40|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugPLLITE|Any CPU.Build.0 = Debug40|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL4|Mixed Platforms.Build.0 = DebugSL4|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL4|x86.ActiveCfg = DebugSL4|Any CPU
@@ -454,28 +375,18 @@ Global
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL5|Mixed Platforms.Build.0 = DebugSL5|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugSL5|x86.ActiveCfg = DebugSL5|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP7|Any CPU.ActiveCfg = DebugWP7|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP7|Any CPU.Build.0 = DebugWP7|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP7|Mixed Platforms.Build.0 = DebugWP7|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP8|Any CPU.Build.0 = DebugWP8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -494,49 +405,34 @@ Global
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release8|Any CPU.ActiveCfg = Release8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.Release8|x86.ActiveCfg = Release45|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL4|Mixed Platforms.Build.0 = ReleaseSL4|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL4|x86.ActiveCfg = ReleaseSL4|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL5|Any CPU.ActiveCfg = ReleaseSL5|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL5|Any CPU.Build.0 = ReleaseSL5|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL5|Mixed Platforms.ActiveCfg = ReleaseSL5|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL5|Mixed Platforms.Build.0 = ReleaseSL5|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseSL5|x86.ActiveCfg = ReleaseSL5|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP7|Any CPU.ActiveCfg = ReleaseWP7|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP7|Any CPU.Build.0 = ReleaseWP7|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP7|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP8|Any CPU.Build.0 = ReleaseWP8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{2FEFC068-E2DE-43A9-A4E6-E0336A532B7A}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -555,17 +451,12 @@ Global
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug8|Any CPU.ActiveCfg = Debug8|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Debug8|x86.ActiveCfg = Debug45|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugCF35|Any CPU.Build.0 = DebugCF35|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugCF35|Mixed Platforms.Build.0 = DebugCF35|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugSL4|x86.ActiveCfg = DebugSL4|Any CPU
@@ -578,18 +469,11 @@ Global
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -608,17 +492,12 @@ Global
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release8|Any CPU.ActiveCfg = Release8|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.Release8|x86.ActiveCfg = Release45|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseCF35|Any CPU.Build.0 = ReleaseCF35|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseCF35|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseSL4|x86.ActiveCfg = ReleaseSL4|Any CPU
@@ -631,18 +510,11 @@ Global
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -663,17 +535,12 @@ Global
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Debug8|x86.ActiveCfg = Debug45|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -694,20 +561,11 @@ Global
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXBLV|Any CPU.Build.0 = DebugXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -727,18 +585,13 @@ Global
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release8|Any CPU.Build.0 = Release8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release8|x86.ActiveCfg = Release45|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.Release8|x86.ActiveCfg = Release8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -759,20 +612,11 @@ Global
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXBLV|Any CPU.Build.0 = ReleaseXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -783,29 +627,26 @@ Global
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug40|x86.ActiveCfg = Debug40|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug45|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug45|Any CPU.Build.0 = DebugPL|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug45|Mixed Platforms.ActiveCfg = Debug45|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug45|Mixed Platforms.Build.0 = Debug45|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug45|x86.ActiveCfg = Debug45|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug8|Any CPU.Build.0 = DebugPL|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug8|Any CPU.ActiveCfg = Debug8|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug8|Any CPU.Build.0 = Debug8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug8|x86.ActiveCfg = Debug45|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Debug8|x86.ActiveCfg = Debug8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPLLITE|Any CPU.Build.0 = DebugPLLITE|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPLLITE|Mixed Platforms.Build.0 = DebugPLLITE|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -821,24 +662,16 @@ Global
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP7|Mixed Platforms.Build.0 = DebugWP7|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP8|Any CPU.Build.0 = DebugPL|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP8|Any CPU.Build.0 = DebugWP8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -849,29 +682,26 @@ Global
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release40|x86.ActiveCfg = Release40|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release45|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release45|Any CPU.Build.0 = ReleasePL|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release45|Any CPU.Build.0 = Release45|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release45|Mixed Platforms.ActiveCfg = Release45|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release45|Mixed Platforms.Build.0 = Release45|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release45|x86.ActiveCfg = Release45|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release8|Any CPU.ActiveCfg = Release8|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release8|Any CPU.Build.0 = Release8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release8|x86.ActiveCfg = Release45|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.Release8|x86.ActiveCfg = Release8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePLLITE|Any CPU.Build.0 = ReleasePLLITE|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePLLITE|Mixed Platforms.Build.0 = ReleasePLLITE|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -887,19 +717,11 @@ Global
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP7|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
+		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP8|Any CPU.Build.0 = ReleaseWP8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Debug|Any CPU.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Debug|Mixed Platforms.Build.0 = Debug|x86
@@ -923,18 +745,15 @@ Global
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Debug8|Mixed Platforms.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Debug8|x86.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Debug8|x86.Build.0 = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugCF35|Any CPU.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugCF35|Mixed Platforms.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugCF35|x86.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugCF35|x86.Build.0 = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPL|Any CPU.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPL|Mixed Platforms.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPL|x86.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPL|x86.Build.0 = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugSL3|Any CPU.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugSL3|Mixed Platforms.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugSL3|x86.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugSL3|x86.Build.0 = Debug|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPLLITE|Any CPU.ActiveCfg = Debug|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPLLITE|Mixed Platforms.ActiveCfg = Debug|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPLLITE|Mixed Platforms.Build.0 = Debug|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPLLITE|x86.ActiveCfg = Debug|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugPLLITE|x86.Build.0 = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugSL4|Any CPU.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugSL4|Mixed Platforms.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugSL4|x86.ActiveCfg = Debug|x86
@@ -951,15 +770,6 @@ Global
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugWP8|Mixed Platforms.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugWP8|x86.ActiveCfg = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugWP8|x86.Build.0 = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXBLV|x86.ActiveCfg = DebugXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXBLV|x86.Build.0 = DebugXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXNA4|Any CPU.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXNA4|Mixed Platforms.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXNA4|x86.ActiveCfg = Debug|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.DebugXNA4|x86.Build.0 = Debug|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Release|Any CPU.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Release|Mixed Platforms.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Release|Mixed Platforms.Build.0 = Release|x86
@@ -981,18 +791,15 @@ Global
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Release8|Mixed Platforms.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Release8|x86.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.Release8|x86.Build.0 = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseCF35|Any CPU.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseCF35|Mixed Platforms.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseCF35|x86.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseCF35|x86.Build.0 = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePL|Any CPU.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePL|Mixed Platforms.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePL|x86.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePL|x86.Build.0 = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseSL3|Any CPU.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseSL3|Mixed Platforms.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseSL3|x86.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseSL3|x86.Build.0 = Release|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePLLITE|Any CPU.ActiveCfg = Release|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleaseXBLV|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePLLITE|Mixed Platforms.Build.0 = ReleaseXBLV|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePLLITE|x86.ActiveCfg = ReleaseXBLV|x86
+		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleasePLLITE|x86.Build.0 = ReleaseXBLV|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseSL4|Any CPU.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseSL4|Mixed Platforms.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseSL4|x86.ActiveCfg = Release|x86
@@ -1009,20 +816,11 @@ Global
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseWP8|Mixed Platforms.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseWP8|x86.ActiveCfg = Release|x86
 		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseWP8|x86.Build.0 = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXBLV|x86.Build.0 = ReleaseXBLV|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXNA4|Any CPU.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXNA4|Mixed Platforms.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXNA4|x86.ActiveCfg = Release|x86
-		{8A062C6B-4441-49F3-B618-4238B6AB5290}.ReleaseXNA4|x86.Build.0 = Release|x86
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug35|x86.ActiveCfg = Debug35|Any CPU
@@ -1037,15 +835,12 @@ Global
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Debug8|x86.ActiveCfg = Debug8|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugSL4|x86.ActiveCfg = DebugSL4|Any CPU
@@ -1056,21 +851,14 @@ Global
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugWP8|Any CPU.Build.0 = DebugWP8|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release35|x86.ActiveCfg = Release35|Any CPU
@@ -1085,15 +873,12 @@ Global
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.Release8|x86.ActiveCfg = Release8|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseSL4|x86.ActiveCfg = ReleaseSL4|Any CPU
@@ -1104,20 +889,14 @@ Global
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
+		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseWP8|Any CPU.Build.0 = ReleaseWP8|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{EE655A70-A899-4B38-84D3-FB9F63A8C661}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -1128,31 +907,26 @@ Global
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug40|x86.ActiveCfg = Debug40|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug45|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug45|Any CPU.Build.0 = DebugPL|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug45|Mixed Platforms.ActiveCfg = Debug45|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug45|Mixed Platforms.Build.0 = Debug45|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug45|x86.ActiveCfg = Debug45|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug8|Any CPU.Build.0 = DebugPL|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug8|Any CPU.ActiveCfg = Debug8|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug8|Any CPU.Build.0 = Debug8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Debug8|x86.ActiveCfg = Debug8|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugCF35|Any CPU.Build.0 = DebugCF35|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugCF35|Mixed Platforms.Build.0 = DebugCF35|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPLLITE|Any CPU.Build.0 = DebugPLLITE|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPLLITE|Mixed Platforms.Build.0 = DebugPLLITE|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -1168,26 +942,16 @@ Global
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP7|Mixed Platforms.Build.0 = DebugWP7|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP8|Any CPU.Build.0 = DebugPL|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP8|Any CPU.Build.0 = DebugWP8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXBLV|Any CPU.Build.0 = DebugXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXNA4|Any CPU.Build.0 = DebugXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -1198,31 +962,26 @@ Global
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release40|x86.ActiveCfg = Release40|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release45|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release45|Any CPU.Build.0 = ReleasePL|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release45|Any CPU.Build.0 = Release45|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release45|Mixed Platforms.ActiveCfg = Release45|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release45|Mixed Platforms.Build.0 = Release45|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release45|x86.ActiveCfg = Release45|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release8|Any CPU.ActiveCfg = Release8|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release8|Any CPU.Build.0 = Release8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.Release8|x86.ActiveCfg = Release8|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseCF35|Any CPU.Build.0 = ReleaseCF35|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseCF35|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePLLITE|Any CPU.Build.0 = ReleasePLLITE|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePLLITE|Mixed Platforms.Build.0 = ReleasePLLITE|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -1238,26 +997,16 @@ Global
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP7|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
+		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP8|Any CPU.Build.0 = ReleaseWP8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXBLV|Any CPU.Build.0 = ReleaseXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXNA4|Any CPU.Build.0 = ReleaseXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|Any CPU.Build.0 = DebugPL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|Mixed Platforms.Build.0 = DebugPL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -1268,31 +1017,26 @@ Global
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug40|x86.ActiveCfg = Debug40|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug45|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug45|Any CPU.Build.0 = DebugPL|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug45|Mixed Platforms.ActiveCfg = Debug45|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug45|Mixed Platforms.Build.0 = Debug45|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug45|x86.ActiveCfg = Debug45|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug8|Any CPU.Build.0 = DebugPL|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug8|Any CPU.ActiveCfg = Debug8|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug8|Any CPU.Build.0 = Debug8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Debug8|x86.ActiveCfg = Debug8|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugCF35|Any CPU.Build.0 = DebugCF35|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugCF35|Mixed Platforms.Build.0 = DebugCF35|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPLLITE|Any CPU.Build.0 = DebugPLLITE|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPLLITE|Mixed Platforms.Build.0 = DebugPLLITE|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -1308,26 +1052,16 @@ Global
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP7|Mixed Platforms.Build.0 = DebugWP7|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP8|Any CPU.Build.0 = DebugPL|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP8|Any CPU.Build.0 = DebugWP8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXBLV|Any CPU.Build.0 = DebugXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXNA4|Any CPU.Build.0 = DebugXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|Any CPU.Build.0 = ReleasePL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|Mixed Platforms.Build.0 = ReleasePL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -1338,31 +1072,26 @@ Global
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release40|x86.ActiveCfg = Release40|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release45|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release45|Any CPU.Build.0 = ReleasePL|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release45|Any CPU.Build.0 = Release45|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release45|Mixed Platforms.ActiveCfg = Release45|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release45|Mixed Platforms.Build.0 = Release45|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release45|x86.ActiveCfg = Release45|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release8|Any CPU.ActiveCfg = Release8|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release8|Any CPU.Build.0 = Release8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.Release8|x86.ActiveCfg = Release8|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseCF35|Any CPU.Build.0 = ReleaseCF35|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseCF35|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePLLITE|Any CPU.Build.0 = ReleasePLLITE|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePLLITE|Mixed Platforms.Build.0 = ReleasePLLITE|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -1378,24 +1107,16 @@ Global
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP7|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
+		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP8|Any CPU.Build.0 = ReleaseWP8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXBLV|Any CPU.Build.0 = ReleaseXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXNA4|Any CPU.Build.0 = ReleaseXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{4E516F10-DA7A-4D43-963E-A93865ABEA5B}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug|x86.ActiveCfg = DebugPL|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug|Mixed Platforms.Build.0 = DebugCF35|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug|x86.ActiveCfg = DebugCF35|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug35|Any CPU.ActiveCfg = Debug35|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug35|Any CPU.Build.0 = Debug35|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug35|Mixed Platforms.ActiveCfg = Debug35|Any CPU
@@ -1416,18 +1137,16 @@ Global
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Debug8|x86.ActiveCfg = Debug8|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugCF35|Any CPU.Build.0 = DebugCF35|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugCF35|Mixed Platforms.Build.0 = DebugCF35|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugCF35|x86.ActiveCfg = DebugSL3|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPLLITE|Any CPU.Build.0 = DebugPLLITE|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPLLITE|Mixed Platforms.Build.0 = DebugPLLITE|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -1448,19 +1167,11 @@ Global
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXBLV|Any CPU.Build.0 = DebugXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXNA4|Any CPU.Build.0 = DebugXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release|x86.ActiveCfg = ReleasePL|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release35|Any CPU.ActiveCfg = Release35|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release35|Any CPU.Build.0 = Release35|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release35|Mixed Platforms.ActiveCfg = Release35|Any CPU
@@ -1481,18 +1192,14 @@ Global
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.Release8|x86.ActiveCfg = Release8|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseCF35|Any CPU.Build.0 = ReleaseCF35|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseCF35|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseCF35|x86.ActiveCfg = ReleaseSL3|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleasePLLITE|Any CPU.Build.0 = ReleasePLLITE|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -1513,16 +1220,6 @@ Global
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXBLV|Any CPU.Build.0 = ReleaseXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXNA4|Any CPU.Build.0 = ReleaseXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{0CCCF009-763F-40D2-8655-7A94828023BF}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
@@ -1546,17 +1243,16 @@ Global
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Debug8|Any CPU.ActiveCfg = Debug8|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Debug8|x86.ActiveCfg = Debug8|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugCF35|x86.ActiveCfg = DebugCF35|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
+		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
+		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL4|Mixed Platforms.Build.0 = DebugSL4|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL4|x86.ActiveCfg = DebugSL4|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL5|Any CPU.ActiveCfg = DebugSL5|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugSL5|Mixed Platforms.ActiveCfg = DebugSL5|Any CPU
@@ -1567,13 +1263,6 @@ Global
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
@@ -1597,15 +1286,12 @@ Global
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Release8|Any CPU.ActiveCfg = Release8|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.Release8|x86.ActiveCfg = Release8|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseCF35|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseSL4|x86.ActiveCfg = ReleaseSL4|Any CPU
@@ -1618,13 +1304,6 @@ Global
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{7A6EF49E-7946-4101-9C89-407B9C53A173}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
@@ -1640,31 +1319,26 @@ Global
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug40|x86.ActiveCfg = Debug40|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug45|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug45|Any CPU.Build.0 = DebugPL|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug45|Any CPU.ActiveCfg = Debug45|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug45|Any CPU.Build.0 = Debug45|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug45|Mixed Platforms.ActiveCfg = Debug45|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug45|Mixed Platforms.Build.0 = Debug45|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug45|x86.ActiveCfg = Debug45|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug8|Any CPU.Build.0 = DebugPL|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug8|Any CPU.ActiveCfg = Debug8|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug8|Any CPU.Build.0 = Debug8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Debug8|x86.ActiveCfg = Debug8|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugCF35|Any CPU.Build.0 = DebugCF35|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugCF35|Mixed Platforms.Build.0 = DebugCF35|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugCF35|x86.ActiveCfg = DebugCF35|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPLLITE|Any CPU.Build.0 = DebugPLLITE|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPLLITE|Mixed Platforms.Build.0 = DebugPLLITE|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -1680,21 +1354,11 @@ Global
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP7|Mixed Platforms.ActiveCfg = DebugWP7|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP7|Mixed Platforms.Build.0 = DebugWP7|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP7|x86.ActiveCfg = DebugWP7|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP8|Any CPU.ActiveCfg = DebugPL|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP8|Any CPU.Build.0 = DebugPL|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP8|Any CPU.ActiveCfg = DebugWP8|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP8|Any CPU.Build.0 = DebugWP8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXBLV|Any CPU.Build.0 = DebugXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXNA4|Any CPU.Build.0 = DebugXNA4|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
@@ -1710,31 +1374,26 @@ Global
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release40|x86.ActiveCfg = Release40|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release45|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release45|Any CPU.Build.0 = ReleasePL|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release45|Any CPU.Build.0 = Release45|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release45|Mixed Platforms.ActiveCfg = Release45|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release45|Mixed Platforms.Build.0 = Release45|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release45|x86.ActiveCfg = Release45|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release8|Any CPU.ActiveCfg = Release8|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release8|Any CPU.Build.0 = Release8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.Release8|x86.ActiveCfg = Release8|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseCF35|Any CPU.Build.0 = ReleaseCF35|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseCF35|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseCF35|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePLLITE|Any CPU.Build.0 = ReleasePLLITE|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePLLITE|Mixed Platforms.Build.0 = ReleasePLLITE|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -1750,21 +1409,11 @@ Global
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP7|Mixed Platforms.ActiveCfg = ReleaseWP7|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP7|Mixed Platforms.Build.0 = ReleaseWP7|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP7|x86.ActiveCfg = ReleaseWP7|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP8|Any CPU.ActiveCfg = ReleasePL|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP8|Any CPU.Build.0 = ReleasePL|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP8|Any CPU.ActiveCfg = ReleaseWP8|Any CPU
+		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP8|Any CPU.Build.0 = ReleaseWP8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXBLV|Any CPU.Build.0 = ReleaseXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXNA4|Any CPU.Build.0 = ReleaseXNA4|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{41E65B96-733B-41C4-A1BB-7476359B89EB}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Debug|Any CPU.ActiveCfg = DebugCF35|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Debug|Any CPU.Build.0 = DebugCF35|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Debug|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
@@ -1790,21 +1439,15 @@ Global
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Debug8|Mixed Platforms.ActiveCfg = Debug8|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Debug8|Mixed Platforms.Build.0 = Debug8|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Debug8|x86.ActiveCfg = Debug8|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugCF35|Any CPU.ActiveCfg = DebugCF35|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugCF35|Any CPU.Build.0 = DebugCF35|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugCF35|Mixed Platforms.ActiveCfg = DebugCF35|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugCF35|Mixed Platforms.Build.0 = DebugCF35|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugCF35|x86.ActiveCfg = DebugCF35|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPL|Any CPU.ActiveCfg = DebugPL|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPL|Any CPU.Build.0 = DebugPL|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPL|Mixed Platforms.ActiveCfg = DebugPL|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPL|Mixed Platforms.Build.0 = DebugPL|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPL|x86.ActiveCfg = DebugPL|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugSL3|Any CPU.ActiveCfg = DebugSL3|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugSL3|Any CPU.Build.0 = DebugSL3|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugSL3|Mixed Platforms.ActiveCfg = DebugSL3|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugSL3|Mixed Platforms.Build.0 = DebugSL3|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugSL3|x86.ActiveCfg = DebugSL3|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPLLITE|Any CPU.ActiveCfg = DebugPLLITE|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPLLITE|Any CPU.Build.0 = DebugPLLITE|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPLLITE|Mixed Platforms.ActiveCfg = DebugPLLITE|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPLLITE|Mixed Platforms.Build.0 = DebugPLLITE|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugPLLITE|x86.ActiveCfg = DebugPLLITE|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugSL4|Any CPU.ActiveCfg = DebugSL4|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugSL4|Any CPU.Build.0 = DebugSL4|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugSL4|Mixed Platforms.ActiveCfg = DebugSL4|Any CPU
@@ -1825,16 +1468,6 @@ Global
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugWP8|Mixed Platforms.ActiveCfg = DebugWP8|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugWP8|Mixed Platforms.Build.0 = DebugWP8|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugWP8|x86.ActiveCfg = DebugWP8|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXBLV|Any CPU.ActiveCfg = DebugXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXBLV|Any CPU.Build.0 = DebugXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXBLV|Mixed Platforms.ActiveCfg = DebugXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXBLV|Mixed Platforms.Build.0 = DebugXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXBLV|x86.ActiveCfg = DebugXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXNA4|Any CPU.ActiveCfg = DebugXNA4|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXNA4|Any CPU.Build.0 = DebugXNA4|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXNA4|Mixed Platforms.ActiveCfg = DebugXNA4|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXNA4|Mixed Platforms.Build.0 = DebugXNA4|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.DebugXNA4|x86.ActiveCfg = DebugXNA4|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Release|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Release|Any CPU.Build.0 = ReleaseCF35|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Release|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
@@ -1860,21 +1493,15 @@ Global
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Release8|Mixed Platforms.ActiveCfg = Release8|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Release8|Mixed Platforms.Build.0 = Release8|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.Release8|x86.ActiveCfg = Release8|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseCF35|Any CPU.ActiveCfg = ReleaseCF35|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseCF35|Any CPU.Build.0 = ReleaseCF35|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseCF35|Mixed Platforms.ActiveCfg = ReleaseCF35|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseCF35|Mixed Platforms.Build.0 = ReleaseCF35|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseCF35|x86.ActiveCfg = ReleaseCF35|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePL|Any CPU.ActiveCfg = ReleasePL|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePL|Any CPU.Build.0 = ReleasePL|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePL|Mixed Platforms.ActiveCfg = ReleasePL|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePL|Mixed Platforms.Build.0 = ReleasePL|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePL|x86.ActiveCfg = ReleasePL|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseSL3|Any CPU.ActiveCfg = ReleaseSL3|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseSL3|Any CPU.Build.0 = ReleaseSL3|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseSL3|Mixed Platforms.ActiveCfg = ReleaseSL3|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseSL3|Mixed Platforms.Build.0 = ReleaseSL3|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseSL3|x86.ActiveCfg = ReleaseSL3|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePLLITE|Any CPU.ActiveCfg = ReleasePLLITE|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePLLITE|Any CPU.Build.0 = ReleasePLLITE|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePLLITE|Mixed Platforms.ActiveCfg = ReleasePLLITE|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePLLITE|Mixed Platforms.Build.0 = ReleasePLLITE|Any CPU
+		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleasePLLITE|x86.ActiveCfg = ReleasePLLITE|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseSL4|Any CPU.ActiveCfg = ReleaseSL4|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseSL4|Any CPU.Build.0 = ReleaseSL4|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseSL4|Mixed Platforms.ActiveCfg = ReleaseSL4|Any CPU
@@ -1895,16 +1522,108 @@ Global
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseWP8|Mixed Platforms.ActiveCfg = ReleaseWP8|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseWP8|Mixed Platforms.Build.0 = ReleaseWP8|Any CPU
 		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseWP8|x86.ActiveCfg = ReleaseWP8|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXBLV|Any CPU.ActiveCfg = ReleaseXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXBLV|Any CPU.Build.0 = ReleaseXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXBLV|Mixed Platforms.ActiveCfg = ReleaseXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXBLV|Mixed Platforms.Build.0 = ReleaseXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXBLV|x86.ActiveCfg = ReleaseXBLV|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXNA4|Any CPU.ActiveCfg = ReleaseXNA4|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXNA4|Any CPU.Build.0 = ReleaseXNA4|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXNA4|Mixed Platforms.ActiveCfg = ReleaseXNA4|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXNA4|Mixed Platforms.Build.0 = ReleaseXNA4|Any CPU
-		{FFB7A57C-BC22-4B71-88D4-2489B3FF10B6}.ReleaseXNA4|x86.ActiveCfg = ReleaseXNA4|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug35|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug35|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug35|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug35|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug35|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug40|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug40|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug40|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug40|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug40|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug45|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug45|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug45|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug45|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug45|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug8|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug8|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug8|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug8|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Debug8|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPL|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPL|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPL|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPL|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPL|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPLLITE|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPLLITE|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPLLITE|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPLLITE|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugPLLITE|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL4|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL4|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL4|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL4|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL4|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL5|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL5|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL5|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL5|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugSL5|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP7|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP7|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP7|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP7|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP7|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP8|Any CPU.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP8|Any CPU.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP8|Mixed Platforms.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP8|Mixed Platforms.Build.0 = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.DebugWP8|x86.ActiveCfg = Debug40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release|Any CPU.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release35|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release35|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release35|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release35|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release40|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release40|Any CPU.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release40|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release40|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release40|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release45|Any CPU.ActiveCfg = Release45|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release45|Any CPU.Build.0 = Release45|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release45|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release45|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release45|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release8|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release8|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release8|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.Release8|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleasePL|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleasePL|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleasePL|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleasePL|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleasePLLITE|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleasePLLITE|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleasePLLITE|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleasePLLITE|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseSL4|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseSL4|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseSL4|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseSL4|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseSL5|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseSL5|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseSL5|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseSL5|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseWP7|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseWP7|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseWP7|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseWP7|x86.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseWP8|Any CPU.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseWP8|Mixed Platforms.ActiveCfg = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseWP8|Mixed Platforms.Build.0 = Release40|Any CPU
+		{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}.ReleaseWP8|x86.ActiveCfg = Release40|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/ReactiveExtensionsForAndroid.nuspec b/external/rx/Rx/NET/Source/Rx_Xamarin/ReactiveExtensionsForAndroid.nuspec
new file mode 100644
index 0000000..df46594
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/ReactiveExtensionsForAndroid.nuspec
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package >
+  <metadata>
+    <id>ReactiveExtensionsForAndroid</id>
+    <version>2.1.0</version>
+    <authors>Microsoft Open Technologies, Inc</authors>
+    <owners>Xamarin Inc.</owners>
+    <licenseUrl>https://raw.github.com/mono/rx/master/Rx/NET/Source/license.txt</licenseUrl>
+    <projectUrl>https://github.com/mono/rx</projectUrl>
+    <iconUrl>https://raw.github.com/mono/rx/master/Rx/NET/Resources/Artwork/Logo_Color.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators. (Android)</description>
+    <releaseNotes>Initial NuGet package release. WARNING: this won't work as expected if you are not using Xamarin.Android v4.7.x or later, which ships with some runtime bugfixes.</releaseNotes>
+    <copyright>Copyright (c) Microsoft Open Technologies, Inc.  All rights reserved.</copyright>
+    <tags>Rx Reactive Linq Xamarin Android</tags>
+    <frameworkAssemblies>
+      <frameworkAssembly assemblyName="System.Core" targetFramework="MonoAndroid" />
+    </frameworkAssemblies>
+  </metadata>
+  <files>
+	<file target="lib/MonoAndroid" src="android/rx/System.Reactive.Interfaces/bin/Release/System.Reactive.Interfaces.dll" />
+	<file target="lib/MonoAndroid" src="android/rx/System.Reactive.Core/bin/Release/System.Reactive.Core.dll" />
+	<file target="lib/MonoAndroid" src="android/rx/System.Reactive.Linq/bin/Release/System.Reactive.Linq.dll" />
+	<file target="lib/MonoAndroid" src="android/rx/System.Reactive.PlatformServices/bin/Release/System.Reactive.PlatformServices.dll" />
+	<file target="lib/MonoAndroid" src="android/rx/System.Reactive.Providers/bin/Release/System.Reactive.Providers.dll" />
+	<file target="lib/MonoAndroid" src="android/rx/System.Reactive.Debugger/bin/Release/System.Reactive.Debugger.dll" />
+	<file target="lib/MonoAndroid" src="android/rx/System.Reactive.Experimental/bin/Release/System.Reactive.Experimental.dll" />
+  </files>
+</package>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/ReactiveExtensionsForiOS.nuspec b/external/rx/Rx/NET/Source/Rx_Xamarin/ReactiveExtensionsForiOS.nuspec
new file mode 100644
index 0000000..9f417d3
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/ReactiveExtensionsForiOS.nuspec
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package >
+  <metadata>
+    <id>ReactiveExtensionsForiOS</id>
+    <version>2.1.0</version>
+    <authors>Microsoft Open Technologies, Inc</authors>
+    <owners>Xamarin Inc.</owners>
+    <licenseUrl>https://raw.github.com/mono/rx/master/Rx/NET/Source/license.txt</licenseUrl>
+    <projectUrl>https://github.com/mono/rx</projectUrl>
+    <iconUrl>https://raw.github.com/mono/rx/master/Rx/NET/Resources/Artwork/Logo_Color.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators. (iOS)</description>
+    <releaseNotes>Initial NuGet package release. WARNING: Rx depends on generics a lot, and they will fail on device. You should really test your code on device. Also you want to use the generic enhanced versions of Xamarin.iOS.</releaseNotes>
+    <copyright>Copyright (c) Microsoft Open Technologies, Inc.  All rights reserved.</copyright>
+    <tags>Rx Reactive Linq Xamarin iOS</tags>
+    <frameworkAssemblies>
+      <frameworkAssembly assemblyName="System.Core" targetFramework="MonoTouch" />
+    </frameworkAssemblies>
+  </metadata>
+  <files>
+	<file target="lib/MonoTouch" src="iOS/rx/System.Reactive.Interfaces/bin/Release/System.Reactive.Interfaces.dll" />
+	<file target="lib/MonoTouch" src="iOS/rx/System.Reactive.Core/bin/Release/System.Reactive.Core.dll" />
+	<file target="lib/MonoTouch" src="iOS/rx/System.Reactive.Linq/bin/Release/System.Reactive.Linq.dll" />
+	<file target="lib/MonoTouch" src="iOS/rx/System.Reactive.PlatformServices/bin/Release/System.Reactive.PlatformServices.dll" />
+	<file target="lib/MonoTouch" src="iOS/rx/System.Reactive.Debugger/bin/Release/System.Reactive.Debugger.dll" />
+	<file target="lib/MonoTouch" src="iOS/rx/System.Reactive.Experimental/bin/Release/System.Reactive.Experimental.dll" />
+  </files>
+</package>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_android.sln b/external/rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_android.sln
old mode 100755
new mode 100644
index 0f16f4b..ef90645
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_android.sln
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_android.sln
@@ -19,20 +19,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "android_System.Reactive.Deb
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "android_System.Reactive.Providers", "android\rx\System.Reactive.Providers\android_System.Reactive.Providers.csproj", "{E662282B-4341-4F86-AAAA-A942335B47FB}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "android_System.Reactive.Runtime.Remoting", "android\rx\System.Reactive.Runtime.Remoting\android_System.Reactive.Runtime.Remoting.csproj", "{A153A379-670C-42C2-9018-FC0D933A4F7F}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{BC795ED9-C969-496A-8433-C47BA91CA87C}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Android.NUnitLite", "android\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj", "{6A005891-A3D6-4398-A729-F645397D573A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDroid.Dialog", "android\MonoDroid.Dialog\MonoDroid.Dialog\MonoDroid.Dialog.csproj", "{33044C7B-47A4-4113-A61A-EB429407F818}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Andr.Unit", "android\Andr.Unit\Andr.Unit\Andr.Unit.csproj", "{47673BC8-F954-4304-9472-2773AA5A94EB}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "android_Mono.Reactive.Testing", "android\rx\Mono.Reactive.Testing\android_Mono.Reactive.Testing.csproj", "{CB2AB716-BFCB-43BC-A03B-A3BDA427746C}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "android_Tests.System.Reactive", "android\rx\Tests.System.Reactive\android_Tests.System.Reactive.csproj", "{73C5260F-8972-4E7C-822B-1A3A0358FA0B}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveTestApplication", "android\ReactiveTestApplication\ReactiveTestApplication.csproj", "{307C128B-762F-478D-AF70-485A1792DA9A}"
+EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C23266F1-B70D-414C-88CD-F5BD27F6ACE3}"
 EndProject
 Global
@@ -45,22 +39,14 @@ Global
 		{00DC3654-E373-4E3F-80FE-109F795ADF1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{00DC3654-E373-4E3F-80FE-109F795ADF1F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{00DC3654-E373-4E3F-80FE-109F795ADF1F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{33044C7B-47A4-4113-A61A-EB429407F818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{33044C7B-47A4-4113-A61A-EB429407F818}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{33044C7B-47A4-4113-A61A-EB429407F818}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{33044C7B-47A4-4113-A61A-EB429407F818}.Release|Any CPU.Build.0 = Release|Any CPU
-		{47673BC8-F954-4304-9472-2773AA5A94EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{47673BC8-F954-4304-9472-2773AA5A94EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{47673BC8-F954-4304-9472-2773AA5A94EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{47673BC8-F954-4304-9472-2773AA5A94EB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{307C128B-762F-478D-AF70-485A1792DA9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{307C128B-762F-478D-AF70-485A1792DA9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{307C128B-762F-478D-AF70-485A1792DA9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{307C128B-762F-478D-AF70-485A1792DA9A}.Release|Any CPU.Build.0 = Release|Any CPU
 		{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{6A005891-A3D6-4398-A729-F645397D573A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6A005891-A3D6-4398-A729-F645397D573A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6A005891-A3D6-4398-A729-F645397D573A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6A005891-A3D6-4398-A729-F645397D573A}.Release|Any CPU.Build.0 = Release|Any CPU
 		{73C5260F-8972-4E7C-822B-1A3A0358FA0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{73C5260F-8972-4E7C-822B-1A3A0358FA0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{73C5260F-8972-4E7C-822B-1A3A0358FA0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -69,10 +55,6 @@ Global
 		{9360E845-D79D-4288-9100-63A80FAD2BF0}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{9360E845-D79D-4288-9100-63A80FAD2BF0}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{9360E845-D79D-4288-9100-63A80FAD2BF0}.Release|Any CPU.Build.0 = Release|Any CPU
-		{A153A379-670C-42C2-9018-FC0D933A4F7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{A153A379-670C-42C2-9018-FC0D933A4F7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{A153A379-670C-42C2-9018-FC0D933A4F7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{A153A379-670C-42C2-9018-FC0D933A4F7F}.Release|Any CPU.Build.0 = Release|Any CPU
 		{CB2AB716-BFCB-43BC-A03B-A3BDA427746C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CB2AB716-BFCB-43BC-A03B-A3BDA427746C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{CB2AB716-BFCB-43BC-A03B-A3BDA427746C}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -133,14 +115,11 @@ Global
 		{00DC3654-E373-4E3F-80FE-109F795ADF1F} = {9AF9A490-2CD2-47CE-9E01-F3A799524F58}
 		{9360E845-D79D-4288-9100-63A80FAD2BF0} = {9AF9A490-2CD2-47CE-9E01-F3A799524F58}
 		{E662282B-4341-4F86-AAAA-A942335B47FB} = {9AF9A490-2CD2-47CE-9E01-F3A799524F58}
-		{A153A379-670C-42C2-9018-FC0D933A4F7F} = {9AF9A490-2CD2-47CE-9E01-F3A799524F58}
-		{6A005891-A3D6-4398-A729-F645397D573A} = {BC795ED9-C969-496A-8433-C47BA91CA87C}
-		{33044C7B-47A4-4113-A61A-EB429407F818} = {BC795ED9-C969-496A-8433-C47BA91CA87C}
-		{47673BC8-F954-4304-9472-2773AA5A94EB} = {BC795ED9-C969-496A-8433-C47BA91CA87C}
 		{CB2AB716-BFCB-43BC-A03B-A3BDA427746C} = {BC795ED9-C969-496A-8433-C47BA91CA87C}
 		{73C5260F-8972-4E7C-822B-1A3A0358FA0B} = {BC795ED9-C969-496A-8433-C47BA91CA87C}
+		{307C128B-762F-478D-AF70-485A1792DA9A} = {BC795ED9-C969-496A-8433-C47BA91CA87C}
 	EndGlobalSection
 	GlobalSection(MonoDevelopProperties) = preSolution
-		StartupItem = android\Andr.Unit\Andr.Unit\Andr.Unit.csproj
+		StartupItem = android\ReactiveTestApplication\ReactiveTestApplication.csproj
 	EndGlobalSection
 EndGlobal
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_iOS.sln b/external/rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_iOS.sln
index 181d00d..a0928e6 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_iOS.sln
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/Rx_Xamarin_iOS.sln
@@ -25,8 +25,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ios_System.Reactive.Experim
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ios_System.Reactive.Debugger", "iOS\rx\System.Reactive.Debugger\ios_System.Reactive.Debugger.csproj", "{B41CB61A-DCA0-4539-8F99-7B3499E18E6D}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ios_System.Reactive.Runtime.Remoting", "iOS\rx\System.Reactive.Runtime.Remoting\ios_System.Reactive.Runtime.Remoting.csproj", "{92857C8E-0E83-4D02-A831-8AF3FED43336}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -151,22 +149,6 @@ Global
 		{79A43CEB-1A18-49EA-AAC4-B72B9C90BF5A}.Release|iPhone.Build.0 = Release|Any CPU
 		{79A43CEB-1A18-49EA-AAC4-B72B9C90BF5A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 		{79A43CEB-1A18-49EA-AAC4-B72B9C90BF5A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.AppStore|iPhone.ActiveCfg = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.AppStore|iPhone.Build.0 = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Release|Any CPU.Build.0 = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Release|iPhone.Build.0 = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{92857C8E-0E83-4D02-A831-8AF3FED43336}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 		{A67F34B5-75C1-4319-A93E-93DF87E728A4}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
 		{A67F34B5-75C1-4319-A93E-93DF87E728A4}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
 		{A67F34B5-75C1-4319-A93E-93DF87E728A4}.AppStore|iPhone.ActiveCfg = Release|Any CPU
@@ -220,7 +202,6 @@ Global
 		{79A43CEB-1A18-49EA-AAC4-B72B9C90BF5A} = {A38611CA-29F7-497B-9E9D-945943F3E5A0}
 		{24F995BD-7075-489C-B7A5-7FDE08C304B6} = {A38611CA-29F7-497B-9E9D-945943F3E5A0}
 		{B41CB61A-DCA0-4539-8F99-7B3499E18E6D} = {A38611CA-29F7-497B-9E9D-945943F3E5A0}
-		{92857C8E-0E83-4D02-A831-8AF3FED43336} = {A38611CA-29F7-497B-9E9D-945943F3E5A0}
 	EndGlobalSection
 	GlobalSection(MonoDevelopProperties) = preSolution
 		StartupItem = iOS\ios_UnitTest\ios_UnitTest.csproj
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/Makefile b/external/rx/Rx/NET/Source/Rx_Xamarin/android/Makefile
deleted file mode 100644
index d2ecc18..0000000
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-
-all: MonoDroid.Dialog Andr.Unit
-
-MonoDroid.Dialog:
-	git clone git://github.com/atsushieno/MonoDroid.Dialog.git
-
-Andr.Unit:
-	git clone git://github.com/pjcollins/Andr.Unit.git
-	cd Andr.Unit && git checkout  bae4bbfc && patch -i ../andr-unit-rx.patch -p1 || exit 1
-
-
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Assets/AboutAssets.txt b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Assets/AboutAssets.txt
new file mode 100644
index 0000000..a9b0638
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+	protected override void OnCreate (Bundle bundle)
+	{
+		base.OnCreate (bundle);
+
+		InputStream input = Assets.Open ("my_asset.txt");
+	}
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/MainActivity.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/MainActivity.cs
new file mode 100644
index 0000000..c350b33
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/MainActivity.cs
@@ -0,0 +1,19 @@
+using System.Reflection;
+using Android.App;
+using Android.OS;
+using Xamarin.Android.NUnitLite;
+
+namespace ReactiveTestApplication
+{
+	[Activity (Label = "ReactiveTestApplication", MainLauncher = true)]
+	public class MainActivity : TestSuiteActivity
+	{
+		protected override void OnCreate (Bundle bundle)
+		{
+			AddTest (typeof (ReactiveTests.Extensions).Assembly);
+			// Once you called base.OnCreate(), you cannot add more assemblies.
+			base.OnCreate (bundle);
+		}
+	}
+}
+
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Properties/AndroidManifest.xml b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Properties/AndroidManifest.xml
new file mode 100644
index 0000000..9431e6d
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="ReactiveTestApplication.ReactiveTestApplication">
+	<uses-sdk />
+	<application android:label="ReactiveTestApplication">
+	</application>
+</manifest>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..2ae849f
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Properties/AssemblyInfo.cs
@@ -0,0 +1,23 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes. 
+// Change them to the values specific to your project.
+[assembly: AssemblyTitle ("ReactiveTestApplication")]
+[assembly: AssemblyDescription ("")]
+[assembly: AssemblyConfiguration ("")]
+[assembly: AssemblyCompany ("")]
+[assembly: AssemblyProduct ("")]
+[assembly: AssemblyCopyright ("atsushi")]
+[assembly: AssemblyTrademark ("")]
+[assembly: AssemblyCulture ("")]
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+[assembly: AssemblyVersion ("1.0.0")]
+// The following attributes are used to specify the signing key for the assembly, 
+// if desired. See the Mono documentation for more information about signing.
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/ReactiveTestApplication.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/ReactiveTestApplication.csproj
new file mode 100644
index 0000000..4ece925
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/ReactiveTestApplication.csproj
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{307C128B-762F-478D-AF70-485A1792DA9A}</ProjectGuid>
+    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <RootNamespace>ReactiveTestApplication</RootNamespace>
+    <AndroidApplication>True</AndroidApplication>
+    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
+    <AndroidResgenClass>Resource</AndroidResgenClass>
+    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
+    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
+    <AndroidUseLatestPlatformSdk>False</AndroidUseLatestPlatformSdk>
+    <AssemblyName>ReactiveTestApplication</AssemblyName>
+    <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AndroidLinkMode>None</AndroidLinkMode>
+    <ConsolePause>false</ConsolePause>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
+    <ConsolePause>false</ConsolePause>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="Mono.Android" />
+    <Reference Include="Xamarin.Android.NUnitLite" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="MainActivity.cs" />
+    <Compile Include="Resources\Resource.designer.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\AboutResources.txt" />
+    <None Include="Assets\AboutAssets.txt" />
+    <None Include="Properties\AndroidManifest.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <AndroidResource Include="Resources\drawable\Icon.png" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\..\..\..\..\..\..\..\home\atsushi\svn\mono\external\rx\Rx\NET\Source\Rx_Xamarin\android\rx\Tests.System.Reactive\android_Tests.System.Reactive.csproj">
+      <Project>{73C5260F-8972-4E7C-822B-1A3A0358FA0B}</Project>
+      <Name>android_Tests.System.Reactive</Name>
+    </ProjectReference>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/AboutResources.txt b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/AboutResources.txt
new file mode 100644
index 0000000..10f52d4
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/AboutResources.txt
@@ -0,0 +1,44 @@
+Images, layout descriptions, binary blobs and string dictionaries can be included 
+in your application as resource files.  Various Android APIs are designed to 
+operate on the resource IDs instead of dealing with images, strings or binary blobs 
+directly.
+
+For example, a sample Android app that contains a user interface layout (main.axml),
+an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 
+would keep its resources in the "Resources" directory of the application:
+
+Resources/
+    drawable/
+        icon.png
+
+    layout/
+        main.axml
+
+    values/
+        strings.xml
+
+In order to get the build system to recognize Android resources, set the build action to
+"AndroidResource".  The native Android APIs do not operate directly with filenames, but 
+instead operate on resource IDs.  When you compile an Android application that uses resources, 
+the build system will package the resources for distribution and generate a class called "R" 
+(this is an Android convention) that contains the tokens for each one of the resources 
+included. For example, for the above Resources layout, this is what the R class would expose:
+
+public class R {
+    public class drawable {
+        public const int icon = 0x123;
+    }
+
+    public class layout {
+        public const int main = 0x456;
+    }
+
+    public class strings {
+        public const int first_string = 0xabc;
+        public const int second_string = 0xbcd;
+    }
+}
+
+You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main 
+to reference the layout/main.axml file, or R.strings.first_string to reference the first 
+string in the dictionary file values/strings.xml.
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/Resource.designer.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/Resource.designer.cs
new file mode 100644
index 0000000..1e5e640
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/Resource.designer.cs
@@ -0,0 +1,171 @@
+#pragma warning disable 1591
+// ------------------------------------------------------------------------------
+//  <autogenerated>
+//      This code was generated by a tool.
+//      Mono Runtime Version: 4.0.30319.17020
+// 
+//      Changes to this file may cause incorrect behavior and will be lost if 
+//      the code is regenerated.
+//  </autogenerated>
+// ------------------------------------------------------------------------------
+
+[assembly: Android.Runtime.ResourceDesignerAttribute("ReactiveTestApplication.Resource", IsApplication=true)]
+
+namespace ReactiveTestApplication
+{
+	
+	
+	[System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
+	public partial class Resource
+	{
+		
+		static Resource()
+		{
+			global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+		}
+		
+		public static void UpdateIdValues()
+		{
+			global::Xamarin.Android.NUnitLite.Resource.Id.OptionHostName = global::ReactiveTestApplication.Resource.Id.OptionHostName;
+			global::Xamarin.Android.NUnitLite.Resource.Id.OptionPort = global::ReactiveTestApplication.Resource.Id.OptionPort;
+			global::Xamarin.Android.NUnitLite.Resource.Id.OptionRemoteServer = global::ReactiveTestApplication.Resource.Id.OptionRemoteServer;
+			global::Xamarin.Android.NUnitLite.Resource.Id.OptionsButton = global::ReactiveTestApplication.Resource.Id.OptionsButton;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultFullName = global::ReactiveTestApplication.Resource.Id.ResultFullName;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultMessage = global::ReactiveTestApplication.Resource.Id.ResultMessage;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultResultState = global::ReactiveTestApplication.Resource.Id.ResultResultState;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultStackTrace = global::ReactiveTestApplication.Resource.Id.ResultStackTrace;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultsFailed = global::ReactiveTestApplication.Resource.Id.ResultsFailed;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultsId = global::ReactiveTestApplication.Resource.Id.ResultsId;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultsIgnored = global::ReactiveTestApplication.Resource.Id.ResultsIgnored;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultsInconclusive = global::ReactiveTestApplication.Resource.Id.ResultsInconclusive;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultsMessage = global::ReactiveTestApplication.Resource.Id.ResultsMessage;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultsPassed = global::ReactiveTestApplication.Resource.Id.ResultsPassed;
+			global::Xamarin.Android.NUnitLite.Resource.Id.ResultsResult = global::ReactiveTestApplication.Resource.Id.ResultsResult;
+			global::Xamarin.Android.NUnitLite.Resource.Id.RunTestsButton = global::ReactiveTestApplication.Resource.Id.RunTestsButton;
+			global::Xamarin.Android.NUnitLite.Resource.Id.TestSuiteListView = global::ReactiveTestApplication.Resource.Id.TestSuiteListView;
+			global::Xamarin.Android.NUnitLite.Resource.Layout.options = global::ReactiveTestApplication.Resource.Layout.options;
+			global::Xamarin.Android.NUnitLite.Resource.Layout.results = global::ReactiveTestApplication.Resource.Layout.results;
+			global::Xamarin.Android.NUnitLite.Resource.Layout.test_result = global::ReactiveTestApplication.Resource.Layout.test_result;
+			global::Xamarin.Android.NUnitLite.Resource.Layout.test_suite = global::ReactiveTestApplication.Resource.Layout.test_suite;
+		}
+		
+		public partial class Attribute
+		{
+			
+			static Attribute()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Attribute()
+			{
+			}
+		}
+		
+		public partial class Drawable
+		{
+			
+			// aapt resource value: 0x7f020000
+			public const int Icon = 2130837504;
+			
+			static Drawable()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Drawable()
+			{
+			}
+		}
+		
+		public partial class Id
+		{
+			
+			// aapt resource value: 0x7f040001
+			public const int OptionHostName = 2130968577;
+			
+			// aapt resource value: 0x7f040002
+			public const int OptionPort = 2130968578;
+			
+			// aapt resource value: 0x7f040000
+			public const int OptionRemoteServer = 2130968576;
+			
+			// aapt resource value: 0x7f040010
+			public const int OptionsButton = 2130968592;
+			
+			// aapt resource value: 0x7f04000a
+			public const int ResultFullName = 2130968586;
+			
+			// aapt resource value: 0x7f04000c
+			public const int ResultMessage = 2130968588;
+			
+			// aapt resource value: 0x7f04000b
+			public const int ResultResultState = 2130968587;
+			
+			// aapt resource value: 0x7f04000d
+			public const int ResultStackTrace = 2130968589;
+			
+			// aapt resource value: 0x7f040006
+			public const int ResultsFailed = 2130968582;
+			
+			// aapt resource value: 0x7f040003
+			public const int ResultsId = 2130968579;
+			
+			// aapt resource value: 0x7f040007
+			public const int ResultsIgnored = 2130968583;
+			
+			// aapt resource value: 0x7f040008
+			public const int ResultsInconclusive = 2130968584;
+			
+			// aapt resource value: 0x7f040009
+			public const int ResultsMessage = 2130968585;
+			
+			// aapt resource value: 0x7f040005
+			public const int ResultsPassed = 2130968581;
+			
+			// aapt resource value: 0x7f040004
+			public const int ResultsResult = 2130968580;
+			
+			// aapt resource value: 0x7f04000f
+			public const int RunTestsButton = 2130968591;
+			
+			// aapt resource value: 0x7f04000e
+			public const int TestSuiteListView = 2130968590;
+			
+			static Id()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Id()
+			{
+			}
+		}
+		
+		public partial class Layout
+		{
+			
+			// aapt resource value: 0x7f030000
+			public const int options = 2130903040;
+			
+			// aapt resource value: 0x7f030001
+			public const int results = 2130903041;
+			
+			// aapt resource value: 0x7f030002
+			public const int test_result = 2130903042;
+			
+			// aapt resource value: 0x7f030003
+			public const int test_suite = 2130903043;
+			
+			static Layout()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Layout()
+			{
+			}
+		}
+	}
+}
+#pragma warning restore 1591
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/drawable/Icon.png b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/drawable/Icon.png
new file mode 100644
index 0000000..a07c69f
Binary files /dev/null and b/external/rx/Rx/NET/Source/Rx_Xamarin/android/ReactiveTestApplication/Resources/drawable/Icon.png differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/andr-unit-rx.patch b/external/rx/Rx/NET/Source/Rx_Xamarin/android/andr-unit-rx.patch
deleted file mode 100644
index 8f19009..0000000
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/andr-unit-rx.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-diff --git a/Andr.Unit/Andr.Unit.csproj b/Andr.Unit/Andr.Unit.csproj
-index 1d64a1b..0ce74c0 100644
---- a/Andr.Unit/Andr.Unit.csproj
-+++ b/Andr.Unit/Andr.Unit.csproj
-@@ -115,9 +115,17 @@
-       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
-       <Name>Android.NUnitLite</Name>
-     </ProjectReference>
--    <ProjectReference Include="..\m4a.tests\m4a.tests.csproj">
--      <Project>{06D00E82-E637-4A8A-95BE-3E1ADE925B9B}</Project>
--      <Name>m4a.tests</Name>
-+    <ProjectReference Include="..\..\Mono.Reactive.Testing\android_Mono.Reactive.Testing.csproj">
-+      <Project>{35DEE616-4AD5-4560-9E19-A86836857626}</Project>
-+      <Name>android_Mono.Reactive.Testing</Name>
-+    </ProjectReference>
-+    <ProjectReference Include="..\..\MonoDroid.Dialog\MonoDroid.Dialog\MonoDroid.Dialog.csproj">
-+      <Project>{33044C7B-47A4-4113-A61A-EB429407F818}</Project>
-+      <Name>MonoDroid.Dialog</Name>
-+    </ProjectReference>
-+    <ProjectReference Include="..\..\Tests.System.Reactive\android_Tests.System.Reactive.csproj">
-+      <Project>{93322E90-1596-443D-AE38-F4B4D868BE24}</Project>
-+      <Name>android_Tests.System.Reactive</Name>
-     </ProjectReference>
-   </ItemGroup>
- </Project>
-\ No newline at end of file
-diff --git a/Andr.Unit/MainActivity.cs b/Andr.Unit/MainActivity.cs
-index ce19029..2a2da07 100644
---- a/Andr.Unit/MainActivity.cs
-+++ b/Andr.Unit/MainActivity.cs
-@@ -32,7 +32,7 @@ namespace Andr.Unit
- 			// tests can be inside the main assembly
- 			AddTest (Assembly.GetExecutingAssembly ());
- 			// or in any reference assemblies			
--			AddTest (typeof (m4a.tests.RunnerTest).Assembly);
-+			AddTest (typeof (ReactiveTests.Extensions).Assembly);
- 			// or in any assembly that you load (since JIT is available)
- 			
- #if false
-diff --git a/Andr.Unit/Resources/Resource.designer.cs b/Andr.Unit/Resources/Resource.designer.cs
-index 291e7c6..b09da34 100644
---- a/Andr.Unit/Resources/Resource.designer.cs
-+++ b/Andr.Unit/Resources/Resource.designer.cs
-@@ -1,3 +1,4 @@
-+#pragma warning disable 1591
- // ------------------------------------------------------------------------------
- //  <autogenerated>
- //      This code was generated by a tool.
-@@ -8,13 +9,20 @@
- //  </autogenerated>
- // ------------------------------------------------------------------------------
- 
-+[assembly: Android.Runtime.ResourceDesignerAttribute("Andr.Unit.Resource", IsApplication=true)]
-+
- namespace Andr.Unit
- {
- 	
- 	
-+	[System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
- 	public partial class Resource
- 	{
- 		
-+		public static void UpdateIdValues()
-+		{
-+		}
-+		
- 		public partial class Attribute
- 		{
- 			
-@@ -149,3 +157,4 @@ namespace Andr.Unit
- 		}
- 	}
- }
-+#pragma warning restore 1591
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/Mono.Reactive.Testing.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/Mono.Reactive.Testing.dll.mdb
deleted file mode 100755
index 1bf810f..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/Mono.Reactive.Testing.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Core.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Core.dll.mdb
deleted file mode 100644
index 730fcab..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Core.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Debugger.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Debugger.dll.mdb
deleted file mode 100644
index d1117e7..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Debugger.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Experimental.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Experimental.dll.mdb
deleted file mode 100644
index e4aa021..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Experimental.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Interfaces.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Interfaces.dll.mdb
deleted file mode 100644
index 9fa1098..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Interfaces.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Linq.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Linq.dll.mdb
deleted file mode 100644
index e3b7b54..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Linq.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.PlatformServices.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.PlatformServices.dll.mdb
deleted file mode 100644
index f7cd3f0..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.PlatformServices.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Providers.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Providers.dll.mdb
deleted file mode 100644
index fa5acfa..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Providers.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Runtime.Remoting.dll.mdb b/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Runtime.Remoting.dll.mdb
deleted file mode 100644
index de211c3..0000000
Binary files a/external/rx/Rx/NET/Source/Rx_Xamarin/android/libs/System.Reactive.Runtime.Remoting.dll.mdb and /dev/null differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/Mono.Reactive.Testing/android_Mono.Reactive.Testing.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/Mono.Reactive.Testing/android_Mono.Reactive.Testing.csproj
old mode 100755
new mode 100644
index 4177055..800e248
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/Mono.Reactive.Testing/android_Mono.Reactive.Testing.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/Mono.Reactive.Testing/android_Mono.Reactive.Testing.csproj
@@ -10,7 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>Mono.Reactive.Testing</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -21,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -38,35 +39,25 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
-      <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
-      <Name>Android.NUnitLite</Name>
-    </ProjectReference>
+<ProjectReference Include="..\..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj"><Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project><Name>Android.NUnitLite</Name></ProjectReference>
+<ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
+  <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
+  <Name>android_System.Reactive.Core</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
+  <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
+  <Name>android_System.Reactive.Linq</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
       <Name>Android.NUnitLite</Name>
     </ProjectReference>
     -->
-    <ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
-      <Project>{FEF62C23-10CD-4DEF-A5AE-54A8B309E970}</Project>
-      <Name>android_System.Reactive.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
-      <Project>{EC704077-EA31-4852-AD24-6732244174C0}</Project>
-      <Name>android_System.Reactive.Linq</Name>
-    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
     <Compile Include="..\..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
       <Link>ColdObservable.cs</Link>
     </Compile>
@@ -106,6 +97,13 @@
     <Compile Include="..\..\..\..\Microsoft.Reactive.Testing\TestScheduler.cs">
       <Link>TestScheduler.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Core/android_System.Reactive.Core.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Core/android_System.Reactive.Core.csproj
old mode 100755
new mode 100644
index 9349d4a..2a5c851
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Core/android_System.Reactive.Core.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Core/android_System.Reactive.Core.csproj
@@ -10,10 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.Core</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>..\..\..\reactive.pub</AssemblyOriginatorKeyFile>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -24,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -41,10 +39,11 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
+
+<ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
@@ -53,14 +52,6 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-    <EmbeddedResource Include="..\..\..\..\System.Reactive.Core\Strings_Core.resx">
-      <Link>Strings_Core.resx</Link>
-    </EmbeddedResource>
     <Compile Include="..\..\..\..\System.Reactive.Core\GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
@@ -295,6 +286,16 @@
     <Compile Include="..\..\..\..\System.Reactive.Core\Strings_Core.Generated.cs">
       <Link>Strings_Core.Generated.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    <EmbeddedResource Include='..\..\..\..\..\..\../../../external/rx/Rx/NET/Source/System.Reactive.Core/Strings_Core.resx'>
+      <Link>Strings_Core.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Debugger/android_System.Reactive.Debugger.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Debugger/android_System.Reactive.Debugger.csproj
old mode 100755
new mode 100644
index 5464b5c..d336157
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Debugger/android_System.Reactive.Debugger.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Debugger/android_System.Reactive.Debugger.csproj
@@ -10,10 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.Debugger</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>..\..\..\reactive.pub</AssemblyOriginatorKeyFile>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -24,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -41,26 +39,23 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
-      <Project>{FEF62C23-10CD-4DEF-A5AE-54A8B309E970}</Project>
-      <Name>android_System.Reactive.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Experimental\android_System.Reactive.Experimental.csproj">
-      <Project>{00DC3654-E373-4E3F-80FE-109F795ADF1F}</Project>
-      <Name>android_System.Reactive.Experimental</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
-      <Project>{EC704077-EA31-4852-AD24-6732244174C0}</Project>
-      <Name>android_System.Reactive.Linq</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.PlatformServices\android_System.Reactive.PlatformServices.csproj">
-      <Project>{D263C126-9D3C-4299-A0C1-F25C703D07C9}</Project>
-      <Name>android_System.Reactive.PlatformServices</Name>
-    </ProjectReference>
+
+<ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
+  <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
+  <Name>android_System.Reactive.Core</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Experimental\android_System.Reactive.Experimental.csproj">
+  <Project>{41E65B96-733B-41C4-A1BB-7476359B89EB}</Project>
+  <Name>android_System.Reactive.Experimental</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
+  <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
+  <Name>android_System.Reactive.Linq</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.PlatformServices\android_System.Reactive.PlatformServices.csproj">
+  <Project>{0CCCF009-763F-40D2-8655-7A94828023BF}</Project>
+  <Name>android_System.Reactive.PlatformServices</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
@@ -69,17 +64,19 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
     <Compile Include="..\..\..\..\System.Reactive.Debugger\Properties\AssemblyInfo.cs">
       <Link>Properties\AssemblyInfo.cs</Link>
     </Compile>
     <Compile Include="..\..\..\..\System.Reactive.Debugger\Reactive\Linq\QueryDebugger.cs">
       <Link>Reactive\Linq\QueryDebugger.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Experimental/android_System.Reactive.Experimental.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Experimental/android_System.Reactive.Experimental.csproj
old mode 100755
new mode 100644
index c54d35f..6c3099c
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Experimental/android_System.Reactive.Experimental.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Experimental/android_System.Reactive.Experimental.csproj
@@ -10,10 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.Experimental</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>..\..\..\reactive.pub</AssemblyOriginatorKeyFile>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -24,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -41,18 +39,17 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
-      <Project>{EC704077-EA31-4852-AD24-6732244174C0}</Project>
-      <Name>android_System.Reactive.Linq</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
-      <Project>{FEF62C23-10CD-4DEF-A5AE-54A8B309E970}</Project>
-      <Name>android_System.Reactive.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
+
+<ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
+  <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
+  <Name>android_System.Reactive.Linq</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
+  <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
+  <Name>android_System.Reactive.Core</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
@@ -61,11 +58,6 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
     <Compile Include="..\..\..\..\System.Reactive.Experimental\ExperimentalAttribute.cs">
       <Link>ExperimentalAttribute.cs</Link>
     </Compile>
@@ -96,6 +88,13 @@
     <Compile Include="..\..\..\..\System.Reactive.Experimental\Reactive\ListObservable.cs">
       <Link>Reactive\ListObservable.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Interfaces/android_System.Reactive.Interfaces.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Interfaces/android_System.Reactive.Interfaces.csproj
index ab0d4ec..88dce4c 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Interfaces/android_System.Reactive.Interfaces.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Interfaces/android_System.Reactive.Interfaces.csproj
@@ -10,10 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.Interfaces</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>..\..\..\reactive.pub</AssemblyOriginatorKeyFile>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -24,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -41,6 +39,8 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
+
+
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
@@ -49,11 +49,6 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
     <Compile Include="..\..\..\..\System.Reactive.Interfaces\AssemblyFileVersionAttribute.cs">
       <Link>AssemblyFileVersionAttribute.cs</Link>
     </Compile>
@@ -126,6 +121,13 @@
     <Compile Include="..\..\..\..\System.Reactive.Interfaces\Reactive\Subjects\ISubject.Multi.cs">
       <Link>Reactive\Subjects\ISubject.Multi.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Linq/android_System.Reactive.Linq.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Linq/android_System.Reactive.Linq.csproj
old mode 100755
new mode 100644
index 4b2bbe9..afd5491
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Linq/android_System.Reactive.Linq.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Linq/android_System.Reactive.Linq.csproj
@@ -10,10 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.Linq</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>..\..\..\reactive.pub</AssemblyOriginatorKeyFile>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -24,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -41,14 +39,14 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
-      <Project>{FEF62C23-10CD-4DEF-A5AE-54A8B309E970}</Project>
-      <Name>android_System.Reactive.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
+
+<ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
+  <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
+  <Name>android_System.Reactive.Core</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
@@ -57,14 +55,6 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-    <EmbeddedResource Include="..\..\..\..\System.Reactive.Linq\Strings_Linq.resx">
-      <Link>Strings_Linq.resx</Link>
-    </EmbeddedResource>
     <Compile Include="..\..\..\..\System.Reactive.Linq\GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
@@ -578,6 +568,16 @@
     <Compile Include="..\..\..\..\System.Reactive.Linq\Strings_Linq.Generated.cs">
       <Link>Strings_Linq.Generated.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    <EmbeddedResource Include='..\..\..\..\..\..\../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Strings_Linq.resx'>
+      <Link>Strings_Linq.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.PlatformServices/android_System.Reactive.PlatformServices.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.PlatformServices/android_System.Reactive.PlatformServices.csproj
old mode 100755
new mode 100644
index bb1286a..d5968cb
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.PlatformServices/android_System.Reactive.PlatformServices.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.PlatformServices/android_System.Reactive.PlatformServices.csproj
@@ -10,10 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.PlatformServices</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>..\..\..\reactive.pub</AssemblyOriginatorKeyFile>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -24,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -41,18 +39,17 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
-      <Project>{FEF62C23-10CD-4DEF-A5AE-54A8B309E970}</Project>
-      <Name>android_System.Reactive.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
-      <Project>{EC704077-EA31-4852-AD24-6732244174C0}</Project>
-      <Name>android_System.Reactive.Linq</Name>
-    </ProjectReference>
+
+<ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
+  <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
+  <Name>android_System.Reactive.Core</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
+  <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
+  <Name>android_System.Reactive.Linq</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
@@ -61,14 +58,6 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-    <EmbeddedResource Include="..\..\..\..\System.Reactive.PlatformServices\Strings_PlatformServices.resx">
-      <Link>Strings_PlatformServices.resx</Link>
-    </EmbeddedResource>
     <Compile Include="..\..\..\..\System.Reactive.PlatformServices\GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
@@ -126,6 +115,16 @@
     <Compile Include="..\..\..\..\System.Reactive.PlatformServices\Strings_PlatformServices.Generated.cs">
       <Link>Strings_PlatformServices.Generated.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    <EmbeddedResource Include='..\..\..\..\..\..\../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Strings_PlatformServices.resx'>
+      <Link>Strings_PlatformServices.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Providers/android_System.Reactive.Providers.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Providers/android_System.Reactive.Providers.csproj
old mode 100755
new mode 100644
index 78205d1..1b04227
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Providers/android_System.Reactive.Providers.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Providers/android_System.Reactive.Providers.csproj
@@ -10,10 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.Providers</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>..\..\..\reactive.pub</AssemblyOriginatorKeyFile>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -24,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -41,18 +39,17 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
-      <Project>{FEF62C23-10CD-4DEF-A5AE-54A8B309E970}</Project>
-      <Name>android_System.Reactive.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
-      <Project>{EC704077-EA31-4852-AD24-6732244174C0}</Project>
-      <Name>android_System.Reactive.Linq</Name>
-    </ProjectReference>
+
+<ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
+  <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
+  <Name>android_System.Reactive.Core</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
+  <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
+  <Name>android_System.Reactive.Linq</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
@@ -61,14 +58,6 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-    <EmbeddedResource Include="..\..\..\..\System.Reactive.Providers\Strings_Providers.resx">
-      <Link>Strings_Providers.resx</Link>
-    </EmbeddedResource>
     <Compile Include="..\..\..\..\System.Reactive.Providers\GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
@@ -105,6 +94,16 @@
     <Compile Include="..\..\..\..\System.Reactive.Providers\Strings_Providers.Generated.cs">
       <Link>Strings_Providers.Generated.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    <EmbeddedResource Include='..\..\..\..\..\..\../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Strings_Providers.resx'>
+      <Link>Strings_Providers.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Runtime.Remoting/android_System.Reactive.Runtime.Remoting.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Runtime.Remoting/android_System.Reactive.Runtime.Remoting.csproj
old mode 100755
new mode 100644
index 58d2929..c908963
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Runtime.Remoting/android_System.Reactive.Runtime.Remoting.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/System.Reactive.Runtime.Remoting/android_System.Reactive.Runtime.Remoting.csproj
@@ -10,10 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.Runtime.Remoting</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>..\..\..\reactive.pub</AssemblyOriginatorKeyFile>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -24,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -41,14 +39,14 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
-      <Project>{FEF62C23-10CD-4DEF-A5AE-54A8B309E970}</Project>
-      <Name>android_System.Reactive.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
+
+<ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
+  <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
+  <Name>android_System.Reactive.Core</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
@@ -57,11 +55,6 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
     <Compile Include="..\..\..\..\System.Reactive.Runtime.Remoting\GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
@@ -74,6 +67,13 @@
     <Compile Include="..\..\..\..\System.Reactive.Runtime.Remoting\Reactive\Linq\QueryLanguage.Remoting.cs">
       <Link>Reactive\Linq\QueryLanguage.Remoting.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/Tests.System.Reactive/android_Tests.System.Reactive.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/Tests.System.Reactive/android_Tests.System.Reactive.csproj
old mode 100755
new mode 100644
index 2a6ef7a..abdcfdc
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/Tests.System.Reactive/android_Tests.System.Reactive.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/rx/Tests.System.Reactive/android_Tests.System.Reactive.csproj
@@ -10,7 +10,7 @@
     <OutputType>Library</OutputType>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>Tests.System.Reactive</AssemblyName>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;SIGNED;NUNIT;MONODROID</DefineConstants>
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>True</DebugSymbols>
@@ -21,6 +21,7 @@
     <WarningLevel>4</WarningLevel>
     <AndroidLinkMode>None</AndroidLinkMode>
     <ConsolePause>False</ConsolePause>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;HAS_AWAIT;NUNIT;MONODROID;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -38,59 +39,49 @@
     <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
-      <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
-      <Name>Android.NUnitLite</Name>
-    </ProjectReference>
+<ProjectReference Include="..\..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj"><Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project><Name>Android.NUnitLite</Name></ProjectReference>
+<ProjectReference Include="..\Mono.Reactive.Testing\android_Mono.Reactive.Testing.csproj">
+  <Project>{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}</Project>
+  <Name>android_Mono.Reactive.Testing</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
+  <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
+  <Name>android_System.Reactive.Core</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Experimental\android_System.Reactive.Experimental.csproj">
+  <Project>{41E65B96-733B-41C4-A1BB-7476359B89EB}</Project>
+  <Name>android_System.Reactive.Experimental</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
+  <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
+  <Name>android_System.Reactive.Interfaces</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Observable.Aliases\android_System.Reactive.Observable.Aliases.csproj">
+  <Project>{9ffac385-10a4-4ddd-b800-de67e8469cc0}</Project>
+  <Name>android_System.Reactive.Observable.Aliases</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.PlatformServices\android_System.Reactive.PlatformServices.csproj">
+  <Project>{0CCCF009-763F-40D2-8655-7A94828023BF}</Project>
+  <Name>android_System.Reactive.PlatformServices</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Providers\android_System.Reactive.Providers.csproj" Condition=" '$(BuildFlavor)' != 'SILVERLIGHTM7' And '$(BuildPlatform)' != 'XNA' ">
+  <Project>{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}</Project>
+  <Name>android_System.Reactive.Providers</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
+  <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
+  <Name>android_System.Reactive.Linq</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Runtime.Remoting\android_System.Reactive.Runtime.Remoting.csproj" Condition=" '$(BuildPlatform)' != 'WINDOWS_PHONE' And '$(BuildTarget)' != 'WP7' ">
+  <Project>{7A6EF49E-7946-4101-9C89-407B9C53A173}</Project>
+  <Name>android_System.Reactive.Runtime.Remoting</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Windows.Forms\android_System.Reactive.Windows.Forms.csproj" Condition=" '$(BuildPlatform)' == 'DESKTOPCLR' ">
+  <Project>{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}</Project>
+  <Name>android_System.Reactive.Windows.Forms</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.Windows.Threading\android_System.Reactive.Windows.Threading.csproj">
+  <Project>{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}</Project>
+  <Name>android_System.Reactive.Windows.Threading</Name>
+</ProjectReference>
     <!--
     <ProjectReference Include="..\Andr.Unit\Android.NUnitLite\Android.NUnitLite.csproj">
       <Project>{6A005891-A3D6-4398-A729-F645397D573A}</Project>
       <Name>Android.NUnitLite</Name>
     </ProjectReference>
     -->
-    <ProjectReference Include="..\Mono.Reactive.Testing\android_Mono.Reactive.Testing.csproj">
-      <Project>{CB2AB716-BFCB-43BC-A03B-A3BDA427746C}</Project>
-      <Name>android_Mono.Reactive.Testing</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Core\android_System.Reactive.Core.csproj">
-      <Project>{FEF62C23-10CD-4DEF-A5AE-54A8B309E970}</Project>
-      <Name>android_System.Reactive.Core</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Debugger\android_System.Reactive.Debugger.csproj">
-      <Project>{9360E845-D79D-4288-9100-63A80FAD2BF0}</Project>
-      <Name>android_System.Reactive.Debugger</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Interfaces\android_System.Reactive.Interfaces.csproj">
-      <Project>{4FA878DC-6E88-43C4-B37B-8C1151CEC56F}</Project>
-      <Name>android_System.Reactive.Interfaces</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Linq\android_System.Reactive.Linq.csproj">
-      <Project>{EC704077-EA31-4852-AD24-6732244174C0}</Project>
-      <Name>android_System.Reactive.Linq</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.PlatformServices\android_System.Reactive.PlatformServices.csproj">
-      <Project>{D263C126-9D3C-4299-A0C1-F25C703D07C9}</Project>
-      <Name>android_System.Reactive.PlatformServices</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Experimental\android_System.Reactive.Experimental.csproj">
-      <Project>{00DC3654-E373-4E3F-80FE-109F795ADF1F}</Project>
-      <Name>android_System.Reactive.Experimental</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Providers\android_System.Reactive.Providers.csproj">
-      <Project>{E662282B-4341-4F86-AAAA-A942335B47FB}</Project>
-      <Name>android_System.Reactive.Providers</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Runtime.Remoting\android_System.Reactive.Runtime.Remoting.csproj">
-      <Project>{A153A379-670C-42C2-9018-FC0D933A4F7F}</Project>
-      <Name>android_System.Reactive.Runtime.Remoting</Name>
-    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
     <Compile Include="..\..\..\..\Tests.System.Reactive\App.cs">
       <Link>App.cs</Link>
     </Compile>
@@ -106,6 +97,9 @@
     <Compile Include="..\..\..\..\Tests.System.Reactive\Stress\Core\Disposables\Serial.cs">
       <Link>Stress\Core\Disposables\Serial.cs</Link>
     </Compile>
+    <Compile Include="..\..\..\..\Tests.System.Reactive\Stress\Core\Schedulers\EventLoop.cs">
+      <Link>Stress\Core\Schedulers\EventLoop.cs</Link>
+    </Compile>
     <Compile Include="..\..\..\..\Tests.System.Reactive\Stress\Core\Disposables\SingleAssignment.cs">
       <Link>Stress\Core\Disposables\SingleAssignment.cs</Link>
     </Compile>
@@ -130,6 +124,9 @@
     <Compile Include="..\..\..\..\Tests.System.Reactive\TestLongRunningScheduler.cs">
       <Link>TestLongRunningScheduler.cs</Link>
     </Compile>
+    <Compile Include="..\..\..\..\Tests.System.Reactive\Tests\Aliases.cs">
+      <Link>Tests\Aliases.cs</Link>
+    </Compile>
     <Compile Include="..\..\..\..\Tests.System.Reactive\Tests\AnonymousTest.cs">
       <Link>Tests\AnonymousTest.cs</Link>
     </Compile>
@@ -220,6 +217,9 @@
     <Compile Include="..\..\..\..\Tests.System.Reactive\Tests\Linq\ObservableExtensionsTest.cs">
       <Link>Tests\Linq\ObservableExtensionsTest.cs</Link>
     </Compile>
+    <Compile Include="..\..\..\..\Tests.System.Reactive\Tests\Linq\ObservableExTest.cs">
+      <Link>Tests\Linq\ObservableExTest.cs</Link>
+    </Compile>
     <Compile Include="..\..\..\..\Tests.System.Reactive\Tests\Linq\ObservableImperativeTest.cs">
       <Link>Tests\Linq\ObservableImperativeTest.cs</Link>
     </Compile>
@@ -340,6 +340,13 @@
     <Compile Include="..\..\..\..\Tests.System.Reactive\Utils.cs">
       <Link>Utils.cs</Link>
     </Compile>
+
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
 </Project>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/MainActivity.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/MainActivity.cs
index 224315d..33485df 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/MainActivity.cs
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/MainActivity.cs
@@ -1,4 +1,4 @@
-#define REACTIVE
+#define REACTIVE
 using System;
 using System.Collections.Generic;
 using System.IO;
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/Properties/AssemblyInfo.cs
index 757ab88..064daa1 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/Properties/AssemblyInfo.cs
@@ -1,4 +1,4 @@
-using System.Reflection;
+using System.Reflection;
 using System.Runtime.CompilerServices;
 using Android.App;
 
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/Resources/Resource.designer.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/Resources/Resource.designer.cs
index 5eed766..8466952 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/Resources/Resource.designer.cs
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/GithubApiClientSample/Resources/Resource.designer.cs
@@ -1,4 +1,4 @@
-#pragma warning disable 1591
+#pragma warning disable 1591
 // ------------------------------------------------------------------------------
 //  <autogenerated>
 //      This code was generated by a tool.
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample.sln b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample.sln
new file mode 100644
index 0000000..fadcb16
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveAndroidSample", "ReactiveAndroidSample\ReactiveAndroidSample.csproj", "{0A024D57-A5E0-4648-80E6-C5F525167625}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0A024D57-A5E0-4648-80E6-C5F525167625}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0A024D57-A5E0-4648-80E6-C5F525167625}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0A024D57-A5E0-4648-80E6-C5F525167625}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0A024D57-A5E0-4648-80E6-C5F525167625}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = ReactiveAndroidSample\ReactiveAndroidSample.csproj
+	EndGlobalSection
+EndGlobal
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Assets/AboutAssets.txt b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Assets/AboutAssets.txt
new file mode 100644
index 0000000..ee39886
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with you package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+	protected override void OnCreate (Bundle bundle)
+	{
+		base.OnCreate (bundle);
+
+		InputStream input = Assets.Open ("my_asset.txt");
+	}
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/MainActivity.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/MainActivity.cs
new file mode 100644
index 0000000..2683726
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/MainActivity.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Reactive;
+using System.Reactive.Linq;
+using Android.App;
+using Android.OS;
+using Android.Views;
+using Android.Widget;
+
+namespace ReactiveAndroidSample
+{
+	[Activity (Label = "ReactiveAndroidSample", MainLauncher = true)]
+	public class Activity1 : Activity
+	{
+		protected override void OnCreate (Bundle bundle)
+		{
+			base.OnCreate (bundle);
+
+			SetContentView (Resource.Layout.Main);
+
+			var text = FindViewById<TextView> (Resource.Id.theText);
+
+			var surface = FindViewById<View> (Resource.Id.theToucheable);
+
+			triple_touch_source = Observable.FromEventPattern<View.TouchEventArgs> (surface, "Touch")
+				.Where (ev => ev.EventArgs.Event.Action == MotionEventActions.Move)
+				.Where (ev => ev.EventArgs.Event.PointerCount == 3)
+				//.SubscribeOn (Application.SynchronizationContext)
+				.ToEventPattern ();
+
+			TripleTouch += (sender, ev) => 
+				this.RunOnUiThread (() => 
+				                    text.Text = GetEventDescription (ev.Event));
+		}
+
+		IEventPatternSource<View.TouchEventArgs> triple_touch_source;
+
+		public event EventHandler<View.TouchEventArgs> TripleTouch {
+			add { triple_touch_source.OnNext += value; }
+			remove { triple_touch_source.OnNext -= value; }
+		}
+
+		static string GetEventDescription (MotionEvent e)
+		{
+			return string.Format ("({0}, {1})", e.RawX, e.RawY);
+		}
+	}
+}
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..57340a1
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes. 
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("ReactiveAndroidSample")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("atsushi")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly, 
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/ReactiveAndroidSample.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/ReactiveAndroidSample.csproj
new file mode 100644
index 0000000..53eec67
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/ReactiveAndroidSample.csproj
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0A024D57-A5E0-4648-80E6-C5F525167625}</ProjectGuid>
+    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <RootNamespace>ReactiveAndroidSample</RootNamespace>
+    <AndroidApplication>True</AndroidApplication>
+    <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
+    <AndroidResgenClass>Resource</AndroidResgenClass>
+    <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
+    <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
+    <AssemblyName>ReactiveAndroidSample</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AndroidLinkMode>None</AndroidLinkMode>
+    <ConsolePause>false</ConsolePause>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <AndroidLinkMode>SdkOnly</AndroidLinkMode>
+    <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core" />
+    <Reference Include="Mono.Android" />
+    <Reference Include="System.Reactive.Core">
+      <HintPath>..\..\..\libs\System.Reactive.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Interfaces">
+      <HintPath>..\..\..\libs\System.Reactive.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Linq">
+      <HintPath>..\..\..\libs\System.Reactive.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.PlatformServices">
+      <HintPath>..\..\..\libs\System.Reactive.PlatformServices.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="MainActivity.cs" />
+    <Compile Include="Resources\Resource.designer.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Resources\AboutResources.txt" />
+    <None Include="Assets\AboutAssets.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <AndroidResource Include="Resources\layout\Main.axml" />
+    <AndroidResource Include="Resources\values\Strings.xml" />
+    <AndroidResource Include="Resources\drawable\Icon.png" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/AboutResources.txt b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/AboutResources.txt
new file mode 100644
index 0000000..10f52d4
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/AboutResources.txt
@@ -0,0 +1,44 @@
+Images, layout descriptions, binary blobs and string dictionaries can be included 
+in your application as resource files.  Various Android APIs are designed to 
+operate on the resource IDs instead of dealing with images, strings or binary blobs 
+directly.
+
+For example, a sample Android app that contains a user interface layout (main.axml),
+an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 
+would keep its resources in the "Resources" directory of the application:
+
+Resources/
+    drawable/
+        icon.png
+
+    layout/
+        main.axml
+
+    values/
+        strings.xml
+
+In order to get the build system to recognize Android resources, set the build action to
+"AndroidResource".  The native Android APIs do not operate directly with filenames, but 
+instead operate on resource IDs.  When you compile an Android application that uses resources, 
+the build system will package the resources for distribution and generate a class called "R" 
+(this is an Android convention) that contains the tokens for each one of the resources 
+included. For example, for the above Resources layout, this is what the R class would expose:
+
+public class R {
+    public class drawable {
+        public const int icon = 0x123;
+    }
+
+    public class layout {
+        public const int main = 0x456;
+    }
+
+    public class strings {
+        public const int first_string = 0xabc;
+        public const int second_string = 0xbcd;
+    }
+}
+
+You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main 
+to reference the layout/main.axml file, or R.strings.first_string to reference the first 
+string in the dictionary file values/strings.xml.
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/Resource.designer.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/Resource.designer.cs
new file mode 100644
index 0000000..1f47528
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/Resource.designer.cs
@@ -0,0 +1,115 @@
+#pragma warning disable 1591
+// ------------------------------------------------------------------------------
+//  <autogenerated>
+//      This code was generated by a tool.
+//      Mono Runtime Version: 4.0.30319.17020
+// 
+//      Changes to this file may cause incorrect behavior and will be lost if 
+//      the code is regenerated.
+//  </autogenerated>
+// ------------------------------------------------------------------------------
+
+[assembly: Android.Runtime.ResourceDesignerAttribute("ReactiveAndroidSample.Resource", IsApplication=true)]
+
+namespace ReactiveAndroidSample
+{
+	
+	
+	[System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
+	public partial class Resource
+	{
+		
+		static Resource()
+		{
+			global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+		}
+		
+		public static void UpdateIdValues()
+		{
+		}
+		
+		public partial class Attribute
+		{
+			
+			static Attribute()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Attribute()
+			{
+			}
+		}
+		
+		public partial class Drawable
+		{
+			
+			// aapt resource value: 0x7f020000
+			public const int Icon = 2130837504;
+			
+			static Drawable()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Drawable()
+			{
+			}
+		}
+		
+		public partial class Id
+		{
+			
+			// aapt resource value: 0x7f050001
+			public const int theText = 2131034113;
+			
+			// aapt resource value: 0x7f050000
+			public const int theToucheable = 2131034112;
+			
+			static Id()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Id()
+			{
+			}
+		}
+		
+		public partial class Layout
+		{
+			
+			// aapt resource value: 0x7f030000
+			public const int Main = 2130903040;
+			
+			static Layout()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Layout()
+			{
+			}
+		}
+		
+		public partial class String
+		{
+			
+			// aapt resource value: 0x7f040001
+			public const int app_name = 2130968577;
+			
+			// aapt resource value: 0x7f040000
+			public const int hello = 2130968576;
+			
+			static String()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private String()
+			{
+			}
+		}
+	}
+}
+#pragma warning restore 1591
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/drawable/Icon.png b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/drawable/Icon.png
new file mode 100644
index 0000000..a07c69f
Binary files /dev/null and b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/drawable/Icon.png differ
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/layout/Main.axml b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/layout/Main.axml
new file mode 100644
index 0000000..84cf986
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/layout/Main.axml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+    <View
+        android:id="@+id/theToucheable"
+        android:layout_width="fill_parent"
+        android:layout_height="440.7dp"
+        android:layout_marginBottom="0.0dp" />
+    <TextView
+        android:id="@+id/theText"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:text="(touch corrdinates shown here)" />
+</LinearLayout>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/values/Strings.xml b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/values/Strings.xml
new file mode 100644
index 0000000..0174c85
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/android/samples/ReactiveAndroidSample/ReactiveAndroidSample/Resources/values/Strings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+	<string name="hello">Hello World, Click Me!</string>
+	<string name="app_name">ReactiveAndroidSample</string>
+</resources>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/Tests.System.Reactive/AppDelegate.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/Tests.System.Reactive/AppDelegate.cs
index 64d549f..f262349 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/Tests.System.Reactive/AppDelegate.cs
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/Tests.System.Reactive/AppDelegate.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/Tests.System.Reactive/Main.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/Tests.System.Reactive/Main.cs
index 01eff67..0401ce5 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/Tests.System.Reactive/Main.cs
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/Tests.System.Reactive/Main.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/ios_UnitTest/Main.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/ios_UnitTest/Main.cs
index 6779727..0e2e29c 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/ios_UnitTest/Main.cs
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/ios_UnitTest/Main.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/ios_UnitTest/UnitTestAppDelegate.cs b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/ios_UnitTest/UnitTestAppDelegate.cs
index 7ba7e00..0fa2496 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/ios_UnitTest/UnitTestAppDelegate.cs
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/ios_UnitTest/UnitTestAppDelegate.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/Mono.Reactive.Testing/ios_Mono.Reactive.Testing.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/Mono.Reactive.Testing/ios_Mono.Reactive.Testing.csproj
index c38caa8..ccb9fac 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/Mono.Reactive.Testing/ios_Mono.Reactive.Testing.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/Mono.Reactive.Testing/ios_Mono.Reactive.Testing.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{47d85a91-e8e2-4088-bf5a-68a161754d48}</ProjectGuid>
+    <ProjectGuid>{47D85A91-E8E2-4088-BF5A-68A161754D48}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,8 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>Mono.Reactive.Testing</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -24,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -53,13 +52,13 @@
     <Reference Include='MonoTouch.NUnitLite' />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj">
   <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
   <Name>ios_System.Reactive.Linq</Name>
 </ProjectReference>
@@ -71,52 +70,52 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ColdObservable.cs'>
+        <Compile Include="../../../../Microsoft.Reactive.Testing/ColdObservable.cs">
       <Link>ColdObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/GlobalSuppressions.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/HotObservable.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/HotObservable.cs">
       <Link>HotObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ITestObservable.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/ITestObservable.cs">
       <Link>ITestObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ITestObserver.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/ITestObserver.cs">
       <Link>ITestObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/MockObserver.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/MockObserver.cs">
       <Link>MockObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/NamespaceDoc.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/NamespaceDoc.cs">
       <Link>NamespaceDoc.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ReactiveAssert.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/ReactiveAssert.cs">
       <Link>ReactiveAssert.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/ReactiveTest.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/ReactiveTest.cs">
       <Link>ReactiveTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/Recorded.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/Recorded.cs">
       <Link>Recorded.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/Subscription.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/Subscription.cs">
       <Link>Subscription.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Microsoft.Reactive.Testing/TestScheduler.cs'>
+    <Compile Include="../../../../Microsoft.Reactive.Testing/TestScheduler.cs">
       <Link>TestScheduler.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Core/ios_System.Reactive.Core.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Core/ios_System.Reactive.Core.csproj
index 145957c..f17389e 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Core/ios_System.Reactive.Core.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Core/ios_System.Reactive.Core.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{a67f34b5-75c1-4319-a93e-93df87e728a4}</ProjectGuid>
+    <ProjectGuid>{A67F34B5-75C1-4319-A93E-93DF87E728A4}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Core</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,7 +52,7 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
 </ProjectReference>
@@ -68,250 +64,250 @@
     -->
   </ItemGroup>
   <ItemGroup>
-        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Strings_Core.resx'>
-      <Link>Strings_Core.resx</Link>
-    </EmbeddedResource>
-
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/GlobalSuppressions.cs'>
+        <Compile Include="../../../../System.Reactive.Core/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/InternalsVisibleTo.cs'>
+    <Compile Include="../../../../System.Reactive.Core/InternalsVisibleTo.cs">
       <Link>InternalsVisibleTo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/NamespaceDocs.cs'>
+    <Compile Include="../../../../System.Reactive.Core/NamespaceDocs.cs">
       <Link>NamespaceDocs.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Observable.Extensions.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Observable.Extensions.cs">
       <Link>Observable.Extensions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Observer.Extensions.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Observer.Extensions.cs">
       <Link>Observer.Extensions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/AnonymousObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/AnonymousObservable.cs">
       <Link>Reactive/AnonymousObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/AnonymousObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/AnonymousObserver.cs">
       <Link>Reactive/AnonymousObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/AnonymousSafeObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/AnonymousSafeObserver.cs">
       <Link>Reactive/AnonymousSafeObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/AsyncLock.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/AsyncLock.cs">
       <Link>Reactive/Concurrency/AsyncLock.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/CatchScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/CatchScheduler.cs">
       <Link>Reactive/Concurrency/CatchScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/ConcurrencyAbstractionLayer.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/ConcurrencyAbstractionLayer.cs">
       <Link>Reactive/Concurrency/ConcurrencyAbstractionLayer.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/ConcurrencyAbstractionLayer.Default.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/ConcurrencyAbstractionLayer.Default.cs">
       <Link>Reactive/Concurrency/ConcurrencyAbstractionLayer.Default.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Scheduler.Wrappers.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Scheduler.Wrappers.cs">
       <Link>Reactive/Concurrency/Scheduler.Wrappers.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/DisableOptimizationsScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/DisableOptimizationsScheduler.cs">
       <Link>Reactive/Concurrency/DisableOptimizationsScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Scheduler.Services.Emulation.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Scheduler.Services.Emulation.cs">
       <Link>Reactive/Concurrency/Scheduler.Services.Emulation.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/LocalScheduler.TimerQueue.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/LocalScheduler.TimerQueue.cs">
       <Link>Reactive/Concurrency/LocalScheduler.TimerQueue.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Scheduler.Services.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Scheduler.Services.cs">
       <Link>Reactive/Concurrency/Scheduler.Services.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/CurrentThreadScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/CurrentThreadScheduler.cs">
       <Link>Reactive/Concurrency/CurrentThreadScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/ImmediateScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/ImmediateScheduler.cs">
       <Link>Reactive/Concurrency/ImmediateScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/LocalScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/LocalScheduler.cs">
       <Link>Reactive/Concurrency/LocalScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/ScheduledItem.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/ScheduledItem.cs">
       <Link>Reactive/Concurrency/ScheduledItem.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Scheduler.Async.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Scheduler.Async.cs">
       <Link>Reactive/Concurrency/Scheduler.Async.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Scheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Scheduler.cs">
       <Link>Reactive/Concurrency/Scheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Scheduler.Recursive.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Scheduler.Recursive.cs">
       <Link>Reactive/Concurrency/Scheduler.Recursive.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Scheduler.Simple.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Scheduler.Simple.cs">
       <Link>Reactive/Concurrency/Scheduler.Simple.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/SchedulerDefaults.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/SchedulerDefaults.cs">
       <Link>Reactive/Concurrency/SchedulerDefaults.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/SchedulerOperation.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/SchedulerOperation.cs">
       <Link>Reactive/Concurrency/SchedulerOperation.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/SchedulerQueue.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/SchedulerQueue.cs">
       <Link>Reactive/Concurrency/SchedulerQueue.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/SchedulerWrapper.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/SchedulerWrapper.cs">
       <Link>Reactive/Concurrency/SchedulerWrapper.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Stopwatch.Default.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Stopwatch.Default.cs">
       <Link>Reactive/Concurrency/Stopwatch.Default.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Synchronization.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Synchronization.cs">
       <Link>Reactive/Concurrency/Synchronization.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Synchronization.ObserveOn.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Synchronization.ObserveOn.cs">
       <Link>Reactive/Concurrency/Synchronization.ObserveOn.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Synchronization.Synchronize.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/Synchronization.Synchronize.cs">
       <Link>Reactive/Concurrency/Synchronization.Synchronize.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/SynchronizationContextScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/SynchronizationContextScheduler.cs">
       <Link>Reactive/Concurrency/SynchronizationContextScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/DefaultScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Concurrency/DefaultScheduler.cs">
       <Link>Reactive/Concurrency/DefaultScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/AsyncLockObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/AsyncLockObserver.cs">
       <Link>Reactive/Internal/AsyncLockObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/CheckedObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/CheckedObserver.cs">
       <Link>Reactive/Internal/CheckedObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ConcurrentDictionary.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/ConcurrentDictionary.cs">
       <Link>Reactive/Internal/ConcurrentDictionary.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ConcurrentQueue.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/ConcurrentQueue.cs">
       <Link>Reactive/Internal/ConcurrentQueue.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Constants.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/Constants.cs">
       <Link>Reactive/Internal/Constants.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/AnonymousDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/AnonymousDisposable.cs">
       <Link>Reactive/Disposables/AnonymousDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/BooleanDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/BooleanDisposable.cs">
       <Link>Reactive/Disposables/BooleanDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/CancellationDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/CancellationDisposable.cs">
       <Link>Reactive/Disposables/CancellationDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/CompositeDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/CompositeDisposable.cs">
       <Link>Reactive/Disposables/CompositeDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/ContextDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/ContextDisposable.cs">
       <Link>Reactive/Disposables/ContextDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/DefaultDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/DefaultDisposable.cs">
       <Link>Reactive/Disposables/DefaultDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/Disposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/Disposable.cs">
       <Link>Reactive/Disposables/Disposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/MultipleAssignmentDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/MultipleAssignmentDisposable.cs">
       <Link>Reactive/Disposables/MultipleAssignmentDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/RefCountDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/RefCountDisposable.cs">
       <Link>Reactive/Disposables/RefCountDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/ScheduledDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/ScheduledDisposable.cs">
       <Link>Reactive/Disposables/ScheduledDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/SerialDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/SerialDisposable.cs">
       <Link>Reactive/Disposables/SerialDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Disposables/SingleAssignmentDisposable.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Disposables/SingleAssignmentDisposable.cs">
       <Link>Reactive/Disposables/SingleAssignmentDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/AutoDetachObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/AutoDetachObserver.cs">
       <Link>Reactive/Internal/AutoDetachObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ExceptionServices.Default.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/ExceptionServices.Default.cs">
       <Link>Reactive/Internal/ExceptionServices.Default.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ExceptionServices.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/ExceptionServices.cs">
       <Link>Reactive/Internal/ExceptionServices.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/HostLifecycleService.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/HostLifecycleService.cs">
       <Link>Reactive/Internal/HostLifecycleService.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ImmutableList.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/ImmutableList.cs">
       <Link>Reactive/Internal/ImmutableList.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Lazy.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/Lazy.cs">
       <Link>Reactive/Internal/Lazy.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Observers.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/Observers.cs">
       <Link>Reactive/Internal/Observers.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/PlatformEnlightenmentProvider.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/PlatformEnlightenmentProvider.cs">
       <Link>Reactive/Internal/PlatformEnlightenmentProvider.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/PriorityQueue.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/PriorityQueue.cs">
       <Link>Reactive/Internal/PriorityQueue.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Producer.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/Producer.cs">
       <Link>Reactive/Internal/Producer.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/SafeObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/SafeObserver.cs">
       <Link>Reactive/Internal/SafeObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ScheduledObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/ScheduledObserver.cs">
       <Link>Reactive/Internal/ScheduledObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Semaphore.Silverlight.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/Semaphore.Silverlight.cs">
       <Link>Reactive/Internal/Semaphore.Silverlight.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Semaphore.Xna.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/Semaphore.Xna.cs">
       <Link>Reactive/Internal/Semaphore.Xna.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Sink.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/Sink.cs">
       <Link>Reactive/Internal/Sink.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Stubs.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/Stubs.cs">
       <Link>Reactive/Internal/Stubs.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/SynchronizationContextExtensions.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/SynchronizationContextExtensions.cs">
       <Link>Reactive/Internal/SynchronizationContextExtensions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/SynchronizedObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/SynchronizedObserver.cs">
       <Link>Reactive/Internal/SynchronizedObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/SystemClock.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/SystemClock.cs">
       <Link>Reactive/Internal/SystemClock.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/SystemClock.Default.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Internal/SystemClock.Default.cs">
       <Link>Reactive/Internal/SystemClock.Default.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Notification.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Notification.cs">
       <Link>Reactive/Notification.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/ObservableBase.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/ObservableBase.cs">
       <Link>Reactive/ObservableBase.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/ObserverBase.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/ObserverBase.cs">
       <Link>Reactive/ObserverBase.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Unit.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Reactive/Unit.cs">
       <Link>Reactive/Unit.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Strings_Core.Generated.cs'>
+    <Compile Include="../../../../System.Reactive.Core/Strings_Core.Generated.cs">
       <Link>Strings_Core.Generated.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Core/Strings_Core.resx'>
+      <Link>Strings_Core.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Debugger/ios_System.Reactive.Debugger.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Debugger/ios_System.Reactive.Debugger.csproj
index 2cc9b86..c4d8dd9 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Debugger/ios_System.Reactive.Debugger.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Debugger/ios_System.Reactive.Debugger.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{b41cb61a-dca0-4539-8f99-7b3499e18e6d}</ProjectGuid>
+    <ProjectGuid>{B41CB61A-DCA0-4539-8F99-7B3499E18E6D}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Debugger</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,19 +52,19 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Experimental\ios_System.Reactive.Experimental.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Experimental\ios_System.Reactive.Experimental.csproj">
   <Project>{41E65B96-733B-41C4-A1BB-7476359B89EB}</Project>
   <Name>ios_System.Reactive.Experimental</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj">
   <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
   <Name>ios_System.Reactive.Linq</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.PlatformServices\ios_System.Reactive.PlatformServices.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.PlatformServices\ios_System.Reactive.PlatformServices.csproj">
   <Project>{0CCCF009-763F-40D2-8655-7A94828023BF}</Project>
   <Name>ios_System.Reactive.PlatformServices</Name>
 </ProjectReference>
@@ -80,19 +76,19 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Debugger/Properties/AssemblyInfo.cs'>
+        <Compile Include="../../../../System.Reactive.Debugger/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Debugger/Reactive/Linq/QueryDebugger.cs'>
+    <Compile Include="../../../../System.Reactive.Debugger/Reactive/Linq/QueryDebugger.cs">
       <Link>Reactive/Linq/QueryDebugger.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Experimental/ios_System.Reactive.Experimental.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Experimental/ios_System.Reactive.Experimental.csproj
index 686350c..0326fab 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Experimental/ios_System.Reactive.Experimental.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Experimental/ios_System.Reactive.Experimental.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{24f995bd-7075-489c-b7a5-7fde08c304b6}</ProjectGuid>
+    <ProjectGuid>{24F995BD-7075-489C-B7A5-7FDE08C304B6}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Experimental</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,13 +52,13 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj">
   <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
   <Name>ios_System.Reactive.Linq</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
 </ProjectReference>
@@ -74,43 +70,43 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/ExperimentalAttribute.cs'>
+        <Compile Include="../../../../System.Reactive.Experimental/ExperimentalAttribute.cs">
       <Link>ExperimentalAttribute.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/InternalsVisibleTo.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/InternalsVisibleTo.cs">
       <Link>InternalsVisibleTo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Internal/BinaryObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/Reactive/Internal/BinaryObserver.cs">
       <Link>Reactive/Internal/BinaryObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/QbservableEx.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/Reactive/Linq/QbservableEx.cs">
       <Link>Reactive/Linq/QbservableEx.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/IQueryLanguageEx.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/Reactive/Linq/IQueryLanguageEx.cs">
       <Link>Reactive/Linq/IQueryLanguageEx.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/ObservableEx.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/Reactive/Linq/ObservableEx.cs">
       <Link>Reactive/Linq/ObservableEx.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/QbservableEx.Generated.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/Reactive/Linq/QbservableEx.Generated.cs">
       <Link>Reactive/Linq/QbservableEx.Generated.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/QueryLanguageEx.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/Reactive/Linq/QueryLanguageEx.cs">
       <Link>Reactive/Linq/QueryLanguageEx.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/ListObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Experimental/Reactive/ListObservable.cs">
       <Link>Reactive/ListObservable.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Interfaces/ios_System.Reactive.Interfaces.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Interfaces/ios_System.Reactive.Interfaces.csproj
index 905db4d..87f877d 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Interfaces/ios_System.Reactive.Interfaces.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Interfaces/ios_System.Reactive.Interfaces.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{6f2675f5-fcc7-4a28-9dc3-657b4613dcc5}</ProjectGuid>
+    <ProjectGuid>{6F2675F5-FCC7-4A28-9DC3-657B4613DCC5}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Interfaces</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -65,85 +61,85 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/AssemblyFileVersionAttribute.cs'>
+        <Compile Include="../../../../System.Reactive.Interfaces/AssemblyFileVersionAttribute.cs">
       <Link>AssemblyFileVersionAttribute.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/DateTimeOffset.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/DateTimeOffset.cs">
       <Link>DateTimeOffset.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/GlobalSuppressions.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/IObservable.cs">
       <Link>IObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/IObserver.cs">
       <Link>IObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/NamespaceDocs.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/NamespaceDocs.cs">
       <Link>NamespaceDocs.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Concurrency/ISchedulerPeriodic.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Concurrency/ISchedulerPeriodic.cs">
       <Link>Reactive/Concurrency/ISchedulerPeriodic.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Concurrency/IStopwatchProvider.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Concurrency/IStopwatchProvider.cs">
       <Link>Reactive/Concurrency/IStopwatchProvider.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Concurrency/IScheduledItem.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Concurrency/IScheduledItem.cs">
       <Link>Reactive/Concurrency/IScheduledItem.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Concurrency/IScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Concurrency/IScheduler.cs">
       <Link>Reactive/Concurrency/IScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Concurrency/ISchedulerLongRunning.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Concurrency/ISchedulerLongRunning.cs">
       <Link>Reactive/Concurrency/ISchedulerLongRunning.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Concurrency/IStopwatch.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Concurrency/IStopwatch.cs">
       <Link>Reactive/Concurrency/IStopwatch.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Disposables/ICancelable.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Disposables/ICancelable.cs">
       <Link>Reactive/Disposables/ICancelable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/IEventPattern.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/IEventPattern.cs">
       <Link>Reactive/IEventPattern.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/IEventPatternSource.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/IEventPatternSource.cs">
       <Link>Reactive/IEventPatternSource.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/IEventSource.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/IEventSource.cs">
       <Link>Reactive/IEventSource.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/IObserver.Result.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/IObserver.Result.cs">
       <Link>Reactive/IObserver.Result.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IGroupedObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Linq/IGroupedObservable.cs">
       <Link>Reactive/Linq/IGroupedObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservable.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Linq/IQbservable.cs">
       <Link>Reactive/Linq/IQbservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservableProvider.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Linq/IQbservableProvider.cs">
       <Link>Reactive/Linq/IQbservableProvider.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Subjects/IConnectableObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Subjects/IConnectableObservable.cs">
       <Link>Reactive/Subjects/IConnectableObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Subjects/ISubject.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Subjects/ISubject.cs">
       <Link>Reactive/Subjects/ISubject.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Subjects/ISubject.Multi.cs'>
+    <Compile Include="../../../../System.Reactive.Interfaces/Reactive/Subjects/ISubject.Multi.cs">
       <Link>Reactive/Subjects/ISubject.Multi.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Linq/ios_System.Reactive.Linq.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Linq/ios_System.Reactive.Linq.csproj
index 121fc9a..1673e4a 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Linq/ios_System.Reactive.Linq.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Linq/ios_System.Reactive.Linq.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{0a977063-0796-4cd4-84b8-aedb2d648b26}</ProjectGuid>
+    <ProjectGuid>{0A977063-0796-4CD4-84B8-AEDB2D648B26}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Linq</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,10 +52,10 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
 </ProjectReference>
@@ -71,529 +67,529 @@
     -->
   </ItemGroup>
   <ItemGroup>
-        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Strings_Linq.resx'>
-      <Link>Strings_Linq.resx</Link>
-    </EmbeddedResource>
-
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/GlobalSuppressions.cs'>
+        <Compile Include="../../../../System.Reactive.Linq/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/NamespaceDocs.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/NamespaceDocs.cs">
       <Link>NamespaceDocs.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Concurrency/VirtualTimeScheduler.Extensions.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Concurrency/VirtualTimeScheduler.Extensions.cs">
       <Link>Reactive/Concurrency/VirtualTimeScheduler.Extensions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/ConcatSink.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/ConcatSink.cs">
       <Link>Reactive/Internal/ConcatSink.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/Constants.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/Constants.cs">
       <Link>Reactive/Internal/Constants.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/Helpers.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/Helpers.cs">
       <Link>Reactive/Internal/Helpers.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/IConcatenatable.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/IConcatenatable.cs">
       <Link>Reactive/Internal/IConcatenatable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/IEvaluatableObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/IEvaluatableObservable.cs">
       <Link>Reactive/Internal/IEvaluatableObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/QueryServices.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/QueryServices.cs">
       <Link>Reactive/Internal/QueryServices.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/ReflectionUtils.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/ReflectionUtils.cs">
       <Link>Reactive/Internal/ReflectionUtils.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/HashSet.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/HashSet.cs">
       <Link>Reactive/Internal/HashSet.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/Lookup.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/Lookup.cs">
       <Link>Reactive/Internal/Lookup.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/LocalQueryMethodImplementationTypeAttribute.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/LocalQueryMethodImplementationTypeAttribute.cs">
       <Link>Reactive/Linq/LocalQueryMethodImplementationTypeAttribute.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Case.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Case.cs">
       <Link>Reactive/Linq/Observable/Case.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Collect.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Collect.cs">
       <Link>Reactive/Linq/Observable/Collect.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/If.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/If.cs">
       <Link>Reactive/Linq/Observable/If.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/For.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/For.cs">
       <Link>Reactive/Linq/Observable/For.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DoWhile.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/DoWhile.cs">
       <Link>Reactive/Linq/Observable/DoWhile.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/While.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/While.cs">
       <Link>Reactive/Linq/Observable/While.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLastBuffer.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/TakeLastBuffer.cs">
       <Link>Reactive/Linq/Observable/TakeLastBuffer.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Next.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Next.cs">
       <Link>Reactive/Linq/Observable/Next.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MostRecent.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/MostRecent.cs">
       <Link>Reactive/Linq/Observable/MostRecent.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Latest.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Latest.cs">
       <Link>Reactive/Linq/Observable/Latest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/PushToPullAdapter.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/PushToPullAdapter.cs">
       <Link>Reactive/Linq/Observable/PushToPullAdapter.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/RefCount.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/RefCount.cs">
       <Link>Reactive/Linq/Observable/RefCount.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Multicast.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Multicast.cs">
       <Link>Reactive/Linq/Observable/Multicast.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupBy.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/GroupBy.cs">
       <Link>Reactive/Linq/Observable/GroupBy.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable_.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable_.cs">
       <Link>Reactive/Linq/Observable_.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage_.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage_.cs">
       <Link>Reactive/Linq/QueryLanguage_.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Joins.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Joins.cs">
       <Link>Reactive/Linq/QueryLanguage.Joins.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Multiple.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Multiple.cs">
       <Link>Reactive/Linq/QueryLanguage.Multiple.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Single.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Single.cs">
       <Link>Reactive/Linq/QueryLanguage.Single.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs">
       <Link>Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Time.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Time.cs">
       <Link>Reactive/Linq/QueryLanguage.Time.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Async.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Async.cs">
       <Link>Reactive/Linq/QueryLanguage.Async.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Awaiter.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Awaiter.cs">
       <Link>Reactive/Linq/QueryLanguage.Awaiter.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Binding.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Binding.cs">
       <Link>Reactive/Linq/QueryLanguage.Binding.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Blocking.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Blocking.cs">
       <Link>Reactive/Linq/QueryLanguage.Blocking.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Concurrency.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Concurrency.cs">
       <Link>Reactive/Linq/QueryLanguage.Concurrency.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Conversions.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Conversions.cs">
       <Link>Reactive/Linq/QueryLanguage.Conversions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Creation.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Creation.cs">
       <Link>Reactive/Linq/QueryLanguage.Creation.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Events.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Events.cs">
       <Link>Reactive/Linq/QueryLanguage.Events.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Aggregates.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Aggregates.cs">
       <Link>Reactive/Linq/QueryLanguage.Aggregates.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Imperative.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/QueryLanguage.Imperative.cs">
       <Link>Reactive/Linq/QueryLanguage.Imperative.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/IQueryLanguage.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/IQueryLanguage.cs">
       <Link>Reactive/Linq/IQueryLanguage.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Imperative.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Imperative.cs">
       <Link>Reactive/Linq/Observable.Imperative.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/EventPatternSourceBase.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/EventPatternSourceBase.cs">
       <Link>Reactive/EventPatternSourceBase.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/EventPattern.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/EventPattern.cs">
       <Link>Reactive/EventPattern.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/EventPatternSource.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/EventPatternSource.cs">
       <Link>Reactive/EventPatternSource.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/EventSource.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/EventSource.cs">
       <Link>Reactive/EventSource.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/InternalsVisibleTo.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/InternalsVisibleTo.cs">
       <Link>InternalsVisibleTo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Async.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Async.cs">
       <Link>Reactive/Linq/Observable.Async.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Events.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Events.cs">
       <Link>Reactive/Linq/Observable.Events.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Concurrency/HistoricalScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Concurrency/HistoricalScheduler.cs">
       <Link>Reactive/Concurrency/HistoricalScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Concurrency/VirtualTimeScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Concurrency/VirtualTimeScheduler.cs">
       <Link>Reactive/Concurrency/VirtualTimeScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/AnonymousEnumerable.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/AnonymousEnumerable.cs">
       <Link>Reactive/Internal/AnonymousEnumerable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/BinaryObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/BinaryObserver.cs">
       <Link>Reactive/Internal/BinaryObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AddRef.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/AddRef.cs">
       <Link>Reactive/Linq/Observable/AddRef.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Aggregate.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Aggregate.cs">
       <Link>Reactive/Linq/Observable/Aggregate.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/All.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/All.cs">
       <Link>Reactive/Linq/Observable/All.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Amb.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Amb.cs">
       <Link>Reactive/Linq/Observable/Amb.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Any.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Any.cs">
       <Link>Reactive/Linq/Observable/Any.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AsObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/AsObservable.cs">
       <Link>Reactive/Linq/Observable/AsObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Average.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Average.cs">
       <Link>Reactive/Linq/Observable/Average.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Buffer.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Buffer.cs">
       <Link>Reactive/Linq/Observable/Buffer.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Catch.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Catch.cs">
       <Link>Reactive/Linq/Observable/Catch.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Concat.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Concat.cs">
       <Link>Reactive/Linq/Observable/Concat.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Contains.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Contains.cs">
       <Link>Reactive/Linq/Observable/Contains.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Cast.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Cast.cs">
       <Link>Reactive/Linq/Observable/Cast.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/CombineLatest.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/CombineLatest.cs">
       <Link>Reactive/Linq/Observable/CombineLatest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GetEnumerator.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/GetEnumerator.cs">
       <Link>Reactive/Linq/Observable/GetEnumerator.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupJoin.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/GroupJoin.cs">
       <Link>Reactive/Linq/Observable/GroupJoin.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Join.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Join.cs">
       <Link>Reactive/Linq/Observable/Join.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SelectMany.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/SelectMany.cs">
       <Link>Reactive/Linq/Observable/SelectMany.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Zip.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Zip.cs">
       <Link>Reactive/Linq/Observable/Zip.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OfType.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/OfType.cs">
       <Link>Reactive/Linq/Observable/OfType.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Count.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Count.cs">
       <Link>Reactive/Linq/Observable/Count.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DefaultIfEmpty.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/DefaultIfEmpty.cs">
       <Link>Reactive/Linq/Observable/DefaultIfEmpty.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Defer.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Defer.cs">
       <Link>Reactive/Linq/Observable/Defer.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Delay.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Delay.cs">
       <Link>Reactive/Linq/Observable/Delay.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DelaySubscription.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/DelaySubscription.cs">
       <Link>Reactive/Linq/Observable/DelaySubscription.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Dematerialize.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Dematerialize.cs">
       <Link>Reactive/Linq/Observable/Dematerialize.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Distinct.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Distinct.cs">
       <Link>Reactive/Linq/Observable/Distinct.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DistinctUntilChanged.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/DistinctUntilChanged.cs">
       <Link>Reactive/Linq/Observable/DistinctUntilChanged.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Do.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Do.cs">
       <Link>Reactive/Linq/Observable/Do.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ElementAt.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/ElementAt.cs">
       <Link>Reactive/Linq/Observable/ElementAt.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Empty.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Empty.cs">
       <Link>Reactive/Linq/Observable/Empty.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Finally.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Finally.cs">
       <Link>Reactive/Linq/Observable/Finally.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FirstAsync.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/FirstAsync.cs">
       <Link>Reactive/Linq/Observable/FirstAsync.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ForEach.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/ForEach.cs">
       <Link>Reactive/Linq/Observable/ForEach.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEvent.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/FromEvent.cs">
       <Link>Reactive/Linq/Observable/FromEvent.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEventPattern.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/FromEventPattern.cs">
       <Link>Reactive/Linq/Observable/FromEventPattern.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Generate.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Generate.cs">
       <Link>Reactive/Linq/Observable/Generate.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupByUntil.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/GroupByUntil.cs">
       <Link>Reactive/Linq/Observable/GroupByUntil.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IgnoreElements.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/IgnoreElements.cs">
       <Link>Reactive/Linq/Observable/IgnoreElements.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IsEmpty.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/IsEmpty.cs">
       <Link>Reactive/Linq/Observable/IsEmpty.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LastAsync.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/LastAsync.cs">
       <Link>Reactive/Linq/Observable/LastAsync.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LongCount.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/LongCount.cs">
       <Link>Reactive/Linq/Observable/LongCount.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Materialize.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Materialize.cs">
       <Link>Reactive/Linq/Observable/Materialize.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Max.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Max.cs">
       <Link>Reactive/Linq/Observable/Max.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MaxBy.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/MaxBy.cs">
       <Link>Reactive/Linq/Observable/MaxBy.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Merge.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Merge.cs">
       <Link>Reactive/Linq/Observable/Merge.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Min.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Min.cs">
       <Link>Reactive/Linq/Observable/Min.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MinBy.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/MinBy.cs">
       <Link>Reactive/Linq/Observable/MinBy.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Never.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Never.cs">
       <Link>Reactive/Linq/Observable/Never.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OnErrorResumeNext.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/OnErrorResumeNext.cs">
       <Link>Reactive/Linq/Observable/OnErrorResumeNext.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Range.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Range.cs">
       <Link>Reactive/Linq/Observable/Range.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Repeat.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Repeat.cs">
       <Link>Reactive/Linq/Observable/Repeat.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Return.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Return.cs">
       <Link>Reactive/Linq/Observable/Return.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sample.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Sample.cs">
       <Link>Reactive/Linq/Observable/Sample.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Scan.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Scan.cs">
       <Link>Reactive/Linq/Observable/Scan.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Select.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Select.cs">
       <Link>Reactive/Linq/Observable/Select.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SequenceEqual.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/SequenceEqual.cs">
       <Link>Reactive/Linq/Observable/SequenceEqual.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SingleAsync.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/SingleAsync.cs">
       <Link>Reactive/Linq/Observable/SingleAsync.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Skip.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Skip.cs">
       <Link>Reactive/Linq/Observable/Skip.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipLast.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/SkipLast.cs">
       <Link>Reactive/Linq/Observable/SkipLast.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipUntil.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/SkipUntil.cs">
       <Link>Reactive/Linq/Observable/SkipUntil.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipWhile.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/SkipWhile.cs">
       <Link>Reactive/Linq/Observable/SkipWhile.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sum.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Sum.cs">
       <Link>Reactive/Linq/Observable/Sum.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Switch.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Switch.cs">
       <Link>Reactive/Linq/Observable/Switch.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/TailRecursiveSink.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/TailRecursiveSink.cs">
       <Link>Reactive/Internal/TailRecursiveSink.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Take.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Take.cs">
       <Link>Reactive/Linq/Observable/Take.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLast.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/TakeLast.cs">
       <Link>Reactive/Linq/Observable/TakeLast.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeUntil.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/TakeUntil.cs">
       <Link>Reactive/Linq/Observable/TakeUntil.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeWhile.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/TakeWhile.cs">
       <Link>Reactive/Linq/Observable/TakeWhile.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throttle.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Throttle.cs">
       <Link>Reactive/Linq/Observable/Throttle.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throw.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Throw.cs">
       <Link>Reactive/Linq/Observable/Throw.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TimeInterval.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/TimeInterval.cs">
       <Link>Reactive/Linq/Observable/TimeInterval.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timeout.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Timeout.cs">
       <Link>Reactive/Linq/Observable/Timeout.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timer.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Timer.cs">
       <Link>Reactive/Linq/Observable/Timer.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timestamp.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Timestamp.cs">
       <Link>Reactive/Linq/Observable/Timestamp.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToArray.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/ToArray.cs">
       <Link>Reactive/Linq/Observable/ToArray.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToDictionary.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/ToDictionary.cs">
       <Link>Reactive/Linq/Observable/ToDictionary.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToList.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/ToList.cs">
       <Link>Reactive/Linq/Observable/ToList.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToLookup.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/ToLookup.cs">
       <Link>Reactive/Linq/Observable/ToLookup.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/ToObservable.cs">
       <Link>Reactive/Linq/Observable/ToObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Using.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Using.cs">
       <Link>Reactive/Linq/Observable/Using.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Where.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Where.cs">
       <Link>Reactive/Linq/Observable/Where.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Window.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/Window.cs">
       <Link>Reactive/Linq/Observable/Window.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/_.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable/_.cs">
       <Link>Reactive/Linq/Observable/_.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/ConnectableObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Subjects/ConnectableObservable.cs">
       <Link>Reactive/Subjects/ConnectableObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/Subject.Extensions.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Subjects/Subject.Extensions.cs">
       <Link>Reactive/Subjects/Subject.Extensions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/Either.Generic.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/Either.Generic.cs">
       <Link>Reactive/Internal/Either.Generic.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/AsyncSubject.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Subjects/AsyncSubject.cs">
       <Link>Reactive/Subjects/AsyncSubject.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/BehaviorSubject.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Subjects/BehaviorSubject.cs">
       <Link>Reactive/Subjects/BehaviorSubject.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/Subject.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Subjects/Subject.cs">
       <Link>Reactive/Subjects/Subject.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/GroupedObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/GroupedObservable.cs">
       <Link>Reactive/Linq/GroupedObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Joins/ActivePlan.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Joins/ActivePlan.cs">
       <Link>Reactive/Joins/ActivePlan.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Joins/JoinObserver.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Joins/JoinObserver.cs">
       <Link>Reactive/Joins/JoinObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Joins/Pattern.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Joins/Pattern.cs">
       <Link>Reactive/Joins/Pattern.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Joins/Plan.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Joins/Plan.cs">
       <Link>Reactive/Joins/Plan.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Aggregates.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Aggregates.cs">
       <Link>Reactive/Linq/Observable.Aggregates.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Awaiter.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Awaiter.cs">
       <Link>Reactive/Linq/Observable.Awaiter.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Binding.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Binding.cs">
       <Link>Reactive/Linq/Observable.Binding.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Blocking.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Blocking.cs">
       <Link>Reactive/Linq/Observable.Blocking.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Concurrency.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Concurrency.cs">
       <Link>Reactive/Linq/Observable.Concurrency.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Conversions.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Conversions.cs">
       <Link>Reactive/Linq/Observable.Conversions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Creation.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Creation.cs">
       <Link>Reactive/Linq/Observable.Creation.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Joins.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Joins.cs">
       <Link>Reactive/Linq/Observable.Joins.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Multiple.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Multiple.cs">
       <Link>Reactive/Linq/Observable.Multiple.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Single.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Single.cs">
       <Link>Reactive/Linq/Observable.Single.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.StandardSequenceOperators.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.StandardSequenceOperators.cs">
       <Link>Reactive/Linq/Observable.StandardSequenceOperators.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Time.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Linq/Observable.Time.cs">
       <Link>Reactive/Linq/Observable.Time.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/PushPullAdapter.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Internal/PushPullAdapter.cs">
       <Link>Reactive/Internal/PushPullAdapter.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/ReplaySubject.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Subjects/ReplaySubject.cs">
       <Link>Reactive/Subjects/ReplaySubject.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Threading/Tasks/NamespaceDoc.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Threading/Tasks/NamespaceDoc.cs">
       <Link>Reactive/Threading/Tasks/NamespaceDoc.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Threading/Tasks/TaskObservableExtensions.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Threading/Tasks/TaskObservableExtensions.cs">
       <Link>Reactive/Threading/Tasks/TaskObservableExtensions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/TimeInterval.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/TimeInterval.cs">
       <Link>Reactive/TimeInterval.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Timestamped.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Reactive/Timestamped.cs">
       <Link>Reactive/Timestamped.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Strings_Linq.Generated.cs'>
+    <Compile Include="../../../../System.Reactive.Linq/Strings_Linq.Generated.cs">
       <Link>Strings_Linq.Generated.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Linq/Strings_Linq.resx'>
+      <Link>Strings_Linq.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.PlatformServices/ios_System.Reactive.PlatformServices.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.PlatformServices/ios_System.Reactive.PlatformServices.csproj
index cbe3619..8502a7d 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.PlatformServices/ios_System.Reactive.PlatformServices.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.PlatformServices/ios_System.Reactive.PlatformServices.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{79a43ceb-1a18-49ea-aac4-b72b9c90bf5a}</ProjectGuid>
+    <ProjectGuid>{79A43CEB-1A18-49EA-AAC4-B72B9C90BF5A}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.PlatformServices</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,13 +52,13 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj">
   <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
   <Name>ios_System.Reactive.Linq</Name>
 </ProjectReference>
@@ -74,73 +70,73 @@
     -->
   </ItemGroup>
   <ItemGroup>
-        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Strings_PlatformServices.resx'>
-      <Link>Strings_PlatformServices.resx</Link>
-    </EmbeddedResource>
-
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/GlobalSuppressions.cs'>
+        <Compile Include="../../../../System.Reactive.PlatformServices/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.Windows.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.Windows.cs">
       <Link>Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.Windows.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/EventLoopScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Concurrency/EventLoopScheduler.cs">
       <Link>Reactive/Concurrency/EventLoopScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/NewThreadScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Concurrency/NewThreadScheduler.cs">
       <Link>Reactive/Concurrency/NewThreadScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.cs">
       <Link>Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/Thread.Stub.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Concurrency/Thread.Stub.cs">
       <Link>Reactive/Concurrency/Thread.Stub.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/ThreadPoolScheduler.Windows.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Concurrency/ThreadPoolScheduler.Windows.cs">
       <Link>Reactive/Concurrency/ThreadPoolScheduler.Windows.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/EnlightenmentProvider.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/EnlightenmentProvider.cs">
       <Link>Reactive/EnlightenmentProvider.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/HostLifecycleNotifications.WindowsPhone.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Internal/HostLifecycleNotifications.WindowsPhone.cs">
       <Link>Reactive/Internal/HostLifecycleNotifications.WindowsPhone.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/HostLifecycleNotifications.Windows.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Internal/HostLifecycleNotifications.Windows.cs">
       <Link>Reactive/Internal/HostLifecycleNotifications.Windows.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/PhoneShellThunks.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Internal/PhoneShellThunks.cs">
       <Link>Reactive/Internal/PhoneShellThunks.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/StopwatchImpl.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Internal/StopwatchImpl.cs">
       <Link>Reactive/Internal/StopwatchImpl.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/TaskPoolScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Concurrency/TaskPoolScheduler.cs">
       <Link>Reactive/Concurrency/TaskPoolScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/ThreadPoolScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Concurrency/ThreadPoolScheduler.cs">
       <Link>Reactive/Concurrency/ThreadPoolScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/ExceptionServicesImpl.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Internal/ExceptionServicesImpl.cs">
       <Link>Reactive/Internal/ExceptionServicesImpl.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/PlatformEnlightenmentProvider.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Internal/PlatformEnlightenmentProvider.cs">
       <Link>Reactive/Internal/PlatformEnlightenmentProvider.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/Stubs.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Reactive/Internal/Stubs.cs">
       <Link>Reactive/Internal/Stubs.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Strings_PlatformServices.Generated.cs'>
+    <Compile Include="../../../../System.Reactive.PlatformServices/Strings_PlatformServices.Generated.cs">
       <Link>Strings_PlatformServices.Generated.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Strings_PlatformServices.resx'>
+      <Link>Strings_PlatformServices.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Providers/ios_System.Reactive.Providers.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Providers/ios_System.Reactive.Providers.csproj
index 853f896..6cb0652 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Providers/ios_System.Reactive.Providers.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Providers/ios_System.Reactive.Providers.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{894021ec-14fb-430a-8572-bea9569ae435}</ProjectGuid>
+    <ProjectGuid>{894021EC-14FB-430A-8572-BEA9569AE435}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Providers</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,13 +52,13 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj">
   <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
   <Name>ios_System.Reactive.Linq</Name>
 </ProjectReference>
@@ -74,52 +70,52 @@
     -->
   </ItemGroup>
   <ItemGroup>
-        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Strings_Providers.resx'>
-      <Link>Strings_Providers.resx</Link>
-    </EmbeddedResource>
-
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/GlobalSuppressions.cs'>
+        <Compile Include="../../../../System.Reactive.Providers/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Internal/Constants.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/Internal/Constants.cs">
       <Link>Reactive/Internal/Constants.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePattern.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/Joins/QueryablePattern.cs">
       <Link>Reactive/Joins/QueryablePattern.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePlan.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/Joins/QueryablePlan.cs">
       <Link>Reactive/Joins/QueryablePlan.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/ExpressionVisitor.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/Linq/ExpressionVisitor.cs">
       <Link>Reactive/Linq/ExpressionVisitor.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/Observable.Queryable.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/Linq/Observable.Queryable.cs">
       <Link>Reactive/Linq/Observable.Queryable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/Qbservable.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/Linq/Qbservable.cs">
       <Link>Reactive/Linq/Qbservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/Qbservable.Generated.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/Linq/Qbservable.Generated.cs">
       <Link>Reactive/Linq/Qbservable.Generated.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/Qbservable.Joins.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/Linq/Qbservable.Joins.cs">
       <Link>Reactive/Linq/Qbservable.Joins.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/ObservableQuery.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Reactive/ObservableQuery.cs">
       <Link>Reactive/ObservableQuery.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Strings_Providers.Generated.cs'>
+    <Compile Include="../../../../System.Reactive.Providers/Strings_Providers.Generated.cs">
       <Link>Strings_Providers.Generated.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Providers/Strings_Providers.resx'>
+      <Link>Strings_Providers.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Runtime.Remoting/ios_System.Reactive.Runtime.Remoting.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Runtime.Remoting/ios_System.Reactive.Runtime.Remoting.csproj
index 88815c0..9007d07 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Runtime.Remoting/ios_System.Reactive.Runtime.Remoting.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Runtime.Remoting/ios_System.Reactive.Runtime.Remoting.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{92857c8e-0e83-4d02-a831-8af3fed43336}</ProjectGuid>
+    <ProjectGuid>{92857C8E-0E83-4D02-A831-8AF3FED43336}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Runtime.Remoting</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,10 +52,10 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
 </ProjectReference>
@@ -71,25 +67,25 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Runtime.Remoting/GlobalSuppressions.cs'>
+        <Compile Include="../../../../System.Reactive.Runtime.Remoting/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Runtime.Remoting/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.Runtime.Remoting/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Runtime.Remoting/Reactive/Linq/Observable.Remoting.cs'>
+    <Compile Include="../../../../System.Reactive.Runtime.Remoting/Reactive/Linq/Observable.Remoting.cs">
       <Link>Reactive/Linq/Observable.Remoting.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Runtime.Remoting/Reactive/Linq/QueryLanguage.Remoting.cs'>
+    <Compile Include="../../../../System.Reactive.Runtime.Remoting/Reactive/Linq/QueryLanguage.Remoting.cs">
       <Link>Reactive/Linq/QueryLanguage.Remoting.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Windows.Forms/ios_System.Reactive.Windows.Forms.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Windows.Forms/ios_System.Reactive.Windows.Forms.csproj
index d9c5295..50e6fdd 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Windows.Forms/ios_System.Reactive.Windows.Forms.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Windows.Forms/ios_System.Reactive.Windows.Forms.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{912e14a2-7bdf-4600-8d55-e8c4f33a2063}</ProjectGuid>
+    <ProjectGuid>{912E14A2-7BDF-4600-8D55-E8C4F33A2063}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Windows.Forms</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,10 +52,10 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
 </ProjectReference>
@@ -71,25 +67,25 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Forms/GlobalSuppressions.cs'>
+        <Compile Include="../../../../System.Reactive.Windows.Forms/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Forms/Reactive/Linq/ControlObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Forms/Reactive/Linq/ControlObservable.cs">
       <Link>Reactive/Linq/ControlObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Forms/Reactive/Concurrency/ControlScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Forms/Reactive/Concurrency/ControlScheduler.cs">
       <Link>Reactive/Concurrency/ControlScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Forms/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Forms/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Windows.Threading/ios_System.Reactive.Windows.Threading.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Windows.Threading/ios_System.Reactive.Windows.Threading.csproj
index 20c789b..476ecc4 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Windows.Threading/ios_System.Reactive.Windows.Threading.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/System.Reactive.Windows.Threading/ios_System.Reactive.Windows.Threading.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{0f6c2933-8d0c-41e6-9f77-e8714ab8c4ab}</ProjectGuid>
+    <ProjectGuid>{0F6C2933-8D0C-41E6-9F77-E8714AB8C4AB}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,11 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>System.Reactive.Windows.Threading</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    <SignAssembly>True</SignAssembly>
-    <DelaySign>True</DelaySign>
-    <AssemblyOriginatorKeyFile>../../../reactive.pub</AssemblyOriginatorKeyFile>
-
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -27,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -56,10 +52,10 @@
     
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
 </ProjectReference>
@@ -71,40 +67,40 @@
     -->
   </ItemGroup>
   <ItemGroup>
-        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Strings_WindowsThreading.resx'>
-      <Link>Strings_WindowsThreading.resx</Link>
-    </EmbeddedResource>
-
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/GlobalSuppressions.cs'>
+        <Compile Include="../../../../System.Reactive.Windows.Threading/GlobalSuppressions.cs">
       <Link>GlobalSuppressions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Reactive/Concurrency/CoreDispatcherScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Threading/Reactive/Concurrency/CoreDispatcherScheduler.cs">
       <Link>Reactive/Concurrency/CoreDispatcherScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Reactive/Internal/Constants.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Threading/Reactive/Internal/Constants.cs">
       <Link>Reactive/Internal/Constants.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Reactive/Linq/CoreDispatcherObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Threading/Reactive/Linq/CoreDispatcherObservable.cs">
       <Link>Reactive/Linq/CoreDispatcherObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Reactive/Linq/DispatcherObservable.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Threading/Reactive/Linq/DispatcherObservable.cs">
       <Link>Reactive/Linq/DispatcherObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Reactive/Concurrency/DispatcherScheduler.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Threading/Reactive/Concurrency/DispatcherScheduler.cs">
       <Link>Reactive/Concurrency/DispatcherScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Threading/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Strings_WindowsThreading.Generated.cs'>
+    <Compile Include="../../../../System.Reactive.Windows.Threading/Strings_WindowsThreading.Generated.cs">
       <Link>Strings_WindowsThreading.Generated.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+        <EmbeddedResource Include='../../../../../../../../../external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Strings_WindowsThreading.resx'>
+      <Link>Strings_WindowsThreading.resx</Link>
+    </EmbeddedResource>
+
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/Tests.System.Reactive/ios_Tests.System.Reactive.csproj b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/Tests.System.Reactive/ios_Tests.System.Reactive.csproj
index ad3418c..8af048e 100644
--- a/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/Tests.System.Reactive/ios_Tests.System.Reactive.csproj
+++ b/external/rx/Rx/NET/Source/Rx_Xamarin/iOS/rx/Tests.System.Reactive/ios_Tests.System.Reactive.csproj
@@ -5,7 +5,7 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProductVersion>10.0.0</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{45377009-1425-47fc-985e-05f98022f9e3}</ProjectGuid>
+    <ProjectGuid>{45377009-1425-47FC-985E-05F98022F9E3}</ProjectGuid>
     <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <OutputType>Library</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
@@ -13,8 +13,7 @@
     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
     <AssemblyName>Tests.System.Reactive</AssemblyName>
     <ProductSignAssembly>true</ProductSignAssembly>
-    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
-    
+    <DefineConstants>NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
     <additionalargs>-delaySign</additionalargs>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -24,7 +23,7 @@
     <OutputPath>bin\Debug</OutputPath>
     <ConsolePause>False</ConsolePause>
     <WarningLevel>4</WarningLevel>
-    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;NUNIT;SIGNED</DefineConstants>
+    <DefineConstants>DEBUG;NO_TASK_DELAY;NO_WINDOWS_THREADING;NO_REMOTING;NO_REFLECTION_EMIT;HAS_AWAIT;NUNIT;$(SignAssemblySpec)</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>none</DebugType>
@@ -53,34 +52,37 @@
     <Reference Include='MonoTouch.NUnitLite' />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\Mono.Reactive.Testing\ios_Mono.Reactive.Testing.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <ProjectReference Include="..\Mono.Reactive.Testing\ios_Mono.Reactive.Testing.csproj">
   <Project>{E7B7408B-B039-4F30-B6CF-CC06218CE4CA}</Project>
   <Name>ios_Mono.Reactive.Testing</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Core\ios_System.Reactive.Core.csproj">
   <Project>{4E516F10-DA7A-4D43-963E-A93865ABEA5B}</Project>
   <Name>ios_System.Reactive.Core</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Experimental\ios_System.Reactive.Experimental.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Experimental\ios_System.Reactive.Experimental.csproj">
   <Project>{41E65B96-733B-41C4-A1BB-7476359B89EB}</Project>
   <Name>ios_System.Reactive.Experimental</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Interfaces\ios_System.Reactive.Interfaces.csproj">
   <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
   <Name>ios_System.Reactive.Interfaces</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.PlatformServices\ios_System.Reactive.PlatformServices.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Observable.Aliases\ios_System.Reactive.Observable.Aliases.csproj">
+  <Project>{9ffac385-10a4-4ddd-b800-de67e8469cc0}</Project>
+  <Name>ios_System.Reactive.Observable.Aliases</Name>
+</ProjectReference><ProjectReference Include="..\System.Reactive.PlatformServices\ios_System.Reactive.PlatformServices.csproj">
   <Project>{0CCCF009-763F-40D2-8655-7A94828023BF}</Project>
   <Name>ios_System.Reactive.PlatformServices</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Providers\ios_System.Reactive.Providers.csproj" Condition=" '$(BuildFlavor)' != 'SILVERLIGHTM7' And '$(BuildPlatform)' != 'XNA' " xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Providers\ios_System.Reactive.Providers.csproj" Condition=" '$(BuildFlavor)' != 'SILVERLIGHTM7' And '$(BuildPlatform)' != 'XNA' ">
   <Project>{C7B9D7BE-F47F-466B-A6B0-E46F1069B171}</Project>
   <Name>ios_System.Reactive.Providers</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Linq\ios_System.Reactive.Linq.csproj">
   <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
   <Name>ios_System.Reactive.Linq</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Runtime.Remoting\ios_System.Reactive.Runtime.Remoting.csproj" Condition=" '$(BuildPlatform)' != 'WINDOWS_PHONE' And '$(BuildTarget)' != 'WP7' " xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Runtime.Remoting\ios_System.Reactive.Runtime.Remoting.csproj" Condition=" '$(BuildPlatform)' != 'WINDOWS_PHONE' And '$(BuildTarget)' != 'WP7' ">
   <Project>{7A6EF49E-7946-4101-9C89-407B9C53A173}</Project>
   <Name>ios_System.Reactive.Runtime.Remoting</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Windows.Forms\ios_System.Reactive.Windows.Forms.csproj" Condition=" '$(BuildPlatform)' == 'DESKTOPCLR' " xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Windows.Forms\ios_System.Reactive.Windows.Forms.csproj" Condition=" '$(BuildPlatform)' == 'DESKTOPCLR' ">
   <Project>{E32328A1-1F5B-45F9-B005-02EF5CC2CF0D}</Project>
   <Name>ios_System.Reactive.Windows.Forms</Name>
-</ProjectReference><ProjectReference Include="..\System.Reactive.Windows.Threading\ios_System.Reactive.Windows.Threading.csproj" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+</ProjectReference><ProjectReference Include="..\System.Reactive.Windows.Threading\ios_System.Reactive.Windows.Threading.csproj">
   <Project>{2F7D32BD-5BFC-45D4-9899-F1A76DB32FCB}</Project>
   <Name>ios_System.Reactive.Windows.Threading</Name>
 </ProjectReference>
@@ -92,262 +94,271 @@
     -->
   </ItemGroup>
   <ItemGroup>
-    
-    <!--
-    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
-      <Link>ColdObservable.cs</Link>
-    </Compile>
-    -->
-        <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/App.cs'>
+        <Compile Include="../../../../Tests.System.Reactive/App.cs">
       <Link>App.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/DispatcherHelpers.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/DispatcherHelpers.cs">
       <Link>DispatcherHelpers.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Semaphore.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Semaphore.cs">
       <Link>Semaphore.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Core/Disposables/Composite.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Core/Disposables/Composite.cs">
       <Link>Stress/Core/Disposables/Composite.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Core/Disposables/Serial.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Core/Disposables/Serial.cs">
       <Link>Stress/Core/Disposables/Serial.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Core/Disposables/SingleAssignment.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Core/Schedulers/EventLoop.cs">
+      <Link>Stress/Core/Schedulers/EventLoop.cs</Link>
+    </Compile>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Core/Disposables/SingleAssignment.cs">
       <Link>Stress/Core/Disposables/SingleAssignment.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Core/Disposables/RefCount.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Core/Disposables/RefCount.cs">
       <Link>Stress/Core/Disposables/RefCount.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Linq/Delay.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Linq/Delay.cs">
       <Link>Stress/Linq/Delay.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Linq/FromEvent.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Linq/FromEvent.cs">
       <Link>Stress/Linq/FromEvent.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Helpers.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Helpers.cs">
       <Link>Stress/Helpers.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Linq/Replay.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Stress/Linq/Replay.cs">
       <Link>Stress/Linq/Replay.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/TestBase.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/TestBase.cs">
       <Link>TestBase.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/TestLongRunningScheduler.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/TestLongRunningScheduler.cs">
       <Link>TestLongRunningScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/AnonymousTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Aliases.cs">
+      <Link>Tests/Aliases.cs</Link>
+    </Compile>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/AnonymousTest.cs">
       <Link>Tests/AnonymousTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/ConcurrencyTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/ConcurrencyTest.cs">
       <Link>Tests/Concurrency/ConcurrencyTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/ScheduledItemTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/ScheduledItemTest.cs">
       <Link>Tests/Concurrency/ScheduledItemTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/StopwatchTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/StopwatchTest.cs">
       <Link>Tests/Concurrency/StopwatchTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/SynchronizationTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/SynchronizationTest.cs">
       <Link>Tests/Concurrency/SynchronizationTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/ConnectableObservable.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/ConnectableObservable.cs">
       <Link>Tests/ConnectableObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/ConnectableObservableTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/ConnectableObservableTest.cs">
       <Link>Tests/ConnectableObservableTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/AsyncLockTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/AsyncLockTest.cs">
       <Link>Tests/Concurrency/AsyncLockTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/ControlSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/ControlSchedulerTest.cs">
       <Link>Tests/Concurrency/ControlSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/CurrentThreadSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/CurrentThreadSchedulerTest.cs">
       <Link>Tests/Concurrency/CurrentThreadSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/DefaultSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/DefaultSchedulerTest.cs">
       <Link>Tests/Concurrency/DefaultSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs">
       <Link>Tests/Concurrency/EventLoopSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/HistoricalSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/HistoricalSchedulerTest.cs">
       <Link>Tests/Concurrency/HistoricalSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/ImmediateSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/ImmediateSchedulerTest.cs">
       <Link>Tests/Concurrency/ImmediateSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/NewThreadSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/NewThreadSchedulerTest.cs">
       <Link>Tests/Concurrency/NewThreadSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/SchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/SchedulerTest.cs">
       <Link>Tests/Concurrency/SchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/SynchronizationContextSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/SynchronizationContextSchedulerTest.cs">
       <Link>Tests/Concurrency/SynchronizationContextSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/TaskPoolSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/TaskPoolSchedulerTest.cs">
       <Link>Tests/Concurrency/TaskPoolSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/ThreadPoolSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/ThreadPoolSchedulerTest.cs">
       <Link>Tests/Concurrency/ThreadPoolSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/VirtualSchedulerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Concurrency/VirtualSchedulerTest.cs">
       <Link>Tests/Concurrency/VirtualSchedulerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Disposables/DisposableTests.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Disposables/DisposableTests.cs">
       <Link>Tests/Disposables/DisposableTests.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableAggregateTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableAggregateTest.cs">
       <Link>Tests/Linq/ObservableAggregateTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableAsyncTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableAsyncTest.cs">
       <Link>Tests/Linq/ObservableAsyncTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableAwaiterTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableAwaiterTest.cs">
       <Link>Tests/Linq/ObservableAwaiterTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableBindingTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableBindingTest.cs">
       <Link>Tests/Linq/ObservableBindingTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableBlockingTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableBlockingTest.cs">
       <Link>Tests/Linq/ObservableBlockingTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableConversionTests.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableConversionTests.cs">
       <Link>Tests/Linq/ObservableConversionTests.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableCreationTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableCreationTest.cs">
       <Link>Tests/Linq/ObservableCreationTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableEventsTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableEventsTest.cs">
       <Link>Tests/Linq/ObservableEventsTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableExtensionsTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableExtensionsTest.cs">
       <Link>Tests/Linq/ObservableExtensionsTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableImperativeTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableExTest.cs">
+      <Link>Tests/Linq/ObservableExTest.cs</Link>
+    </Compile>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableImperativeTest.cs">
       <Link>Tests/Linq/ObservableImperativeTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableJoinsTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableJoinsTest.cs">
       <Link>Tests/Linq/ObservableJoinsTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableMultipleTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableMultipleTest.cs">
       <Link>Tests/Linq/ObservableMultipleTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableRemotingTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableRemotingTest.cs">
       <Link>Tests/Linq/ObservableRemotingTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableSafetyTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableSafetyTest.cs">
       <Link>Tests/Linq/ObservableSafetyTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableSingleTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableSingleTest.cs">
       <Link>Tests/Linq/ObservableSingleTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableStandardQueryOperatorTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableStandardQueryOperatorTest.cs">
       <Link>Tests/Linq/ObservableStandardQueryOperatorTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableTimeTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/ObservableTimeTest.cs">
       <Link>Tests/Linq/ObservableTimeTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/QbservableExTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/QbservableExTest.cs">
       <Link>Tests/Linq/QbservableExTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/QbservableTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/QbservableTest.cs">
       <Link>Tests/Linq/QbservableTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/AsyncSubjectTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/Subjects/AsyncSubjectTest.cs">
       <Link>Tests/Linq/Subjects/AsyncSubjectTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/BehaviorSubjectTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/Subjects/BehaviorSubjectTest.cs">
       <Link>Tests/Linq/Subjects/BehaviorSubjectTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/ReplaySubjectTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/Subjects/ReplaySubjectTest.cs">
       <Link>Tests/Linq/Subjects/ReplaySubjectTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/SubjectTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/Linq/Subjects/SubjectTest.cs">
       <Link>Tests/Linq/Subjects/SubjectTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/MySubject.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/MySubject.cs">
       <Link>Tests/MySubject.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/RogueEnumerable.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/RogueEnumerable.cs">
       <Link>Tests/RogueEnumerable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/SystemClockTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/SystemClockTest.cs">
       <Link>Tests/SystemClockTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs">
       <Link>Tests/DefaultConcurrencyAbstractionLayerTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/EventPatternSourceBaseTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/EventPatternSourceBaseTest.cs">
       <Link>Tests/EventPatternSourceBaseTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/NotificationTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/NotificationTest.cs">
       <Link>Tests/NotificationTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/TaskObservableExtensionsTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/TaskObservableExtensionsTest.cs">
       <Link>Tests/TaskObservableExtensionsTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/TimeTests.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/TimeTests.cs">
       <Link>Tests/TimeTests.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/UnitTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/UnitTest.cs">
       <Link>Tests/UnitTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyDisposable.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Dummies/DummyDisposable.cs">
       <Link>Dummies/DummyDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyEnumerable.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Dummies/DummyEnumerable.cs">
       <Link>Dummies/DummyEnumerable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyFunc.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Dummies/DummyFunc.cs">
       <Link>Dummies/DummyFunc.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyObservable.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Dummies/DummyObservable.cs">
       <Link>Dummies/DummyObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyObserver.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Dummies/DummyObserver.cs">
       <Link>Dummies/DummyObserver.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyScheduler.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Dummies/DummyScheduler.cs">
       <Link>Dummies/DummyScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Extensions.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Extensions.cs">
       <Link>Extensions.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/MockDisposable.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/MockDisposable.cs">
       <Link>MockDisposable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/MockEnumerable.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/MockEnumerable.cs">
       <Link>MockEnumerable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/NullErrorObservable.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/NullErrorObservable.cs">
       <Link>NullErrorObservable.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Properties/AssemblyInfo.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Properties/AssemblyInfo.cs">
       <Link>Properties/AssemblyInfo.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/ListObservableTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/ListObservableTest.cs">
       <Link>Tests/ListObservableTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/ObserverTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/ObserverTest.cs">
       <Link>Tests/ObserverTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/PrivateTypesTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/PrivateTypesTest.cs">
       <Link>Tests/PrivateTypesTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/RegressionTest.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Tests/RegressionTest.cs">
       <Link>Tests/RegressionTest.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/TestTaskScheduler.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/TestTaskScheduler.cs">
       <Link>TestTaskScheduler.cs</Link>
     </Compile>
-    <Compile Include='../../../../../../../../../external/rx/Rx/NET/Source/Tests.System.Reactive/Utils.cs'>
+    <Compile Include="../../../../Tests.System.Reactive/Utils.cs">
       <Link>Utils.cs</Link>
     </Compile>
 
+    <!--
+    <Compile Include="..\..\..\Microsoft.Reactive.Testing\ColdObservable.cs">
+      <Link>ColdObservable.cs</Link>
+    </Compile>
+    -->
+    
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/InternalsVisibleTo.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/InternalsVisibleTo.cs
index 52759ec..7c47a9d 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/InternalsVisibleTo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/InternalsVisibleTo.cs
@@ -4,7 +4,12 @@ using System;
 
 #if SIGNED
 
-#if SIGNENHANCED // Key 272 for .NET 4.5 and beyond
+#if MONODROID || MONOTOUCH
+[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
+[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Experimental, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
+[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Linq, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
+[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.PlatformServices, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
+#elif SIGNENHANCED // Key 272 for .NET 4.5 and beyond
 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, PublicKey=002400000c80000014010000060200000024000052534131000800000100010085aad0bef0688d1b994a0d78e1fd29fc24ac34ed3d3ac3fb9b3d0c48386ba834aa880035060a8848b2d8adf58e670ed20914be3681a891c9c8c01eef2ab22872547c39be00af0e6c72485d7cfd1a51df8947d36ceba9989106b58abe79e6a3e71a01ed6bdc867012883e0b1a4d35b1b5eeed6df21e401bb0c22f2246ccb69979dc9e61eef262832ed0f2064853725a75485fa8a3efb7e027319c86dec03dc3b1bca2b5081 [...]
 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Experimental, PublicKey=002400000c80000014010000060200000024000052534131000800000100010085aad0bef0688d1b994a0d78e1fd29fc24ac34ed3d3ac3fb9b3d0c48386ba834aa880035060a8848b2d8adf58e670ed20914be3681a891c9c8c01eef2ab22872547c39be00af0e6c72485d7cfd1a51df8947d36ceba9989106b58abe79e6a3e71a01ed6bdc867012883e0b1a4d35b1b5eeed6df21e401bb0c22f2246ccb69979dc9e61eef262832ed0f2064853725a75485fa8a3efb7e027319c86dec03dc3b1bca2b [...]
 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Linq, PublicKey=002400000c80000014010000060200000024000052534131000800000100010085aad0bef0688d1b994a0d78e1fd29fc24ac34ed3d3ac3fb9b3d0c48386ba834aa880035060a8848b2d8adf58e670ed20914be3681a891c9c8c01eef2ab22872547c39be00af0e6c72485d7cfd1a51df8947d36ceba9989106b58abe79e6a3e71a01ed6bdc867012883e0b1a4d35b1b5eeed6df21e401bb0c22f2246ccb69979dc9e61eef262832ed0f2064853725a75485fa8a3efb7e027319c86dec03dc3b1bca2b5081bab5 [...]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/Properties/AssemblyInfo.cs
index 85d1da3..b37d0e0f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/Properties/AssemblyInfo.cs
@@ -27,11 +27,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-#if XBOX_LAKEVIEW
-[assembly: SecurityTransparent]
-#endif
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/ConcurrencyAbstractionLayer.Default.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/ConcurrencyAbstractionLayer.Default.cs
index cc9cd57..b3ec5be 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/ConcurrencyAbstractionLayer.Default.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/ConcurrencyAbstractionLayer.Default.cs
@@ -22,16 +22,21 @@ namespace System.Reactive.Concurrency
 
         public IDisposable StartPeriodicTimer(Action action, TimeSpan period)
         {
-            //
-            // MSDN documentation states the following:
-            //
-            //    "If period is zero (0) or negative one (-1) milliseconds and dueTime is positive, callback is invoked once;
-            //     the periodic behavior of the timer is disabled, but can be re-enabled using the Change method."
-            //
-            if (period <= TimeSpan.Zero)
+            if (period < TimeSpan.Zero)
                 throw new ArgumentOutOfRangeException("period");
 
-            return new PeriodicTimer(action, period);
+            //
+            // The contract for periodic scheduling in Rx is that specifying TimeSpan.Zero as the period causes the scheduler to 
+            // call back periodically as fast as possible, sequentially.
+            //
+            if (period == TimeSpan.Zero)
+            {
+                return new FastPeriodicTimer(action);
+            }
+            else
+            {
+                return new PeriodicTimer(action, period);
+            }
         }
 
         public IDisposable QueueUserWorkItem(Action<object> action, object state)
@@ -362,6 +367,37 @@ namespace System.Reactive.Concurrency
             }
         }
 #endif
+
+        class FastPeriodicTimer : IDisposable
+        {
+            private readonly Action _action;
+            private bool disposed;
+
+            public FastPeriodicTimer(Action action)
+            {
+                _action = action;
+
+                new System.Threading.Thread(Loop)
+                {
+                    Name = "Rx-FastPeriodicTimer",
+                    IsBackground = true
+                }
+                .Start();
+            }
+
+            private void Loop()
+            {
+                while (!disposed)
+                {
+                    _action();
+                }
+            }
+
+            public void Dispose()
+            {
+                disposed = true;
+            }
+        }
     }
 }
 #else
@@ -375,8 +411,12 @@ namespace System.Reactive.Concurrency
     {
         public IDisposable StartTimer(Action<object> action, object state, TimeSpan dueTime)
         {
-            var cancel = new CancellationDisposable();
+            var cancel = new CancellationDisposable();            
+#if USE_TASKEX
+            TaskEx.Delay(dueTime, cancel.Token).ContinueWith(
+#else
             Task.Delay(dueTime, cancel.Token).ContinueWith(
+#endif
                 _ => action(state),
                 TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion
             );
@@ -385,24 +425,35 @@ namespace System.Reactive.Concurrency
 
         public IDisposable StartPeriodicTimer(Action action, TimeSpan period)
         {
-            var cancel = new CancellationDisposable();
-
-            var moveNext = default(Action);
-            moveNext = () =>
+            if (period <= TimeSpan.Zero)
             {
-                Task.Delay(period, cancel.Token).ContinueWith(
-                    _ =>
-                    {
-                        moveNext();
-                        action();
-                    },
-                    TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion
-                );
-            };
-
-            moveNext();
+                return new FastPeriodicTimer(action);
+            }
+            else
+            {
+                var cancel = new CancellationDisposable();
 
-            return cancel;
+                var moveNext = default(Action);
+                moveNext = () =>
+                {
+#if USE_TASKEX
+                TaskEx.Delay(period, cancel.Token).ContinueWith(
+#else
+                    Task.Delay(period, cancel.Token).ContinueWith(
+#endif
+                        _ =>
+                        {
+                            moveNext();
+                            action();
+                        },
+                        TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion
+                    );
+                };
+
+                moveNext();
+
+                return cancel;
+            }
         }
 
         public IDisposable QueueUserWorkItem(Action<object> action, object state)
@@ -414,7 +465,12 @@ namespace System.Reactive.Concurrency
         
         public void Sleep(TimeSpan timeout)
         {
+#if USE_TASKEX
+            TaskEx.Delay(timeout).Wait();
+#else
             Task.Delay(timeout).Wait();
+#endif
+
         }
 
         public IStopwatch StartStopwatch()
@@ -434,6 +490,32 @@ namespace System.Reactive.Concurrency
                 action(state);
             }, TaskCreationOptions.LongRunning);
         }
+
+        class FastPeriodicTimer : IDisposable
+        {
+            private readonly Action _action;
+            private bool disposed;
+
+            public FastPeriodicTimer(Action action)
+            {
+                _action = action;
+                
+                Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning);
+            }
+
+            private void Loop()
+            {
+                while (!disposed)
+                {
+                    _action();
+                }
+            }
+
+            public void Dispose()
+            {
+                disposed = true;
+            }
+        }
     }
 }
 #endif
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/LocalScheduler.TimerQueue.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/LocalScheduler.TimerQueue.cs
index ded2b28..7518037 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/LocalScheduler.TimerQueue.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/LocalScheduler.TimerQueue.cs
@@ -93,6 +93,11 @@ namespace System.Reactive.Concurrency
         /// </summary>
         private static readonly TimeSpan RETRYSHORT = TimeSpan.FromMilliseconds(50);
 
+        /// <summary>
+        /// Longest interval supported by <see cref="System.Threading.Timer"/>.
+        /// </summary>
+        private static readonly TimeSpan MAXSUPPORTEDTIMER = TimeSpan.FromMilliseconds((1L << 32) - 2);
+
         [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Justification = "We can't really lift this into a field initializer, and would end up checking for an initialization flag in every static method anyway (which is roughly what the JIT does in a thread-safe manner).")]
         static LocalScheduler()
         {
@@ -317,8 +322,13 @@ namespace System.Reactive.Concurrency
                 var remainder = TimeSpan.FromTicks(Math.Max(due.Ticks / MAXERRORRATIO, LONGTOSHORT.Ticks));
                 var dueEarly = due - remainder;
 
+                //
+                // Limit the interval to maximum supported by underlying Timer.
+                //
+                var dueCapped = TimeSpan.FromTicks(Math.Min(dueEarly.Ticks, MAXSUPPORTEDTIMER.Ticks));
+
                 s_nextLongTermWorkItem = next;
-                s_nextLongTermTimer.Disposable = ConcurrencyAbstractionLayer.Current.StartTimer(EvaluateLongTermQueue, null, dueEarly);
+                s_nextLongTermTimer.Disposable = ConcurrencyAbstractionLayer.Current.StartTimer(EvaluateLongTermQueue, null, dueCapped);
             }
         }
 
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Synchronization.ObserveOn.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Synchronization.ObserveOn.cs
index 7fd80d0..20a8a40 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Synchronization.ObserveOn.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Concurrency/Synchronization.ObserveOn.cs
@@ -35,7 +35,7 @@ namespace System.Reactive.Concurrency
 #if !NO_SYNCCTX
             if (_context != null)
             {
-                var sink = new ς(this, observer, cancel);
+                var sink = new ObserveOnSink(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -49,11 +49,11 @@ namespace System.Reactive.Concurrency
         }
 
 #if !NO_SYNCCTX
-        class ς : Sink<TSource>, IObserver<TSource>
+        class ObserveOnSink : Sink<TSource>, IObserver<TSource>
         {
             private readonly ObserveOn<TSource> _parent;
 
-            public ς(ObserveOn<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public ObserveOnSink(ObserveOn<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ConcurrentDictionary.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ConcurrentDictionary.cs
index 8b7ec81..25e3957 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ConcurrentDictionary.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/ConcurrentDictionary.cs
@@ -99,6 +99,8 @@ namespace System.Collections.Concurrent
 
         public ConcurrentDictionary(IEqualityComparer<TKey> comparer) : this(DefaultConcurrencyLevel, DEFAULT_CAPACITY, true, comparer) { }
 
+        public ConcurrentDictionary(int capacity, IEqualityComparer<TKey> comparer) : this(DefaultConcurrencyLevel, capacity, true, comparer) { }
+
         internal ConcurrentDictionary(int concurrencyLevel, int capacity, bool growLockArray, IEqualityComparer<TKey> comparer)
         {
             if (concurrencyLevel < 1)
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/PlatformEnlightenmentProvider.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/PlatformEnlightenmentProvider.cs
index f2483e8..26d29d8 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/PlatformEnlightenmentProvider.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/PlatformEnlightenmentProvider.cs
@@ -60,7 +60,7 @@ namespace System.Reactive.PlatformServices
 #if NETCF35
                             var name = "System.Reactive.PlatformServices.CurrentPlatformEnlightenmentProvider, System.Reactive.PlatformServices";
 #else
-#if CRIPPLED_REFLECTION
+#if CRIPPLED_REFLECTION && HAS_WINRT
                             var ifType = typeof(IPlatformEnlightenmentProvider).GetTypeInfo();
 #else
                             var ifType = typeof(IPlatformEnlightenmentProvider);
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Semaphore.Silverlight.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Semaphore.Silverlight.cs
index 4f5eeee..d73a81f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Semaphore.Silverlight.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/Reactive/Internal/Semaphore.Silverlight.cs
@@ -1,6 +1,6 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
-#if NO_SEMAPHORE && SILVERLIGHT
+#if NO_SEMAPHORE && (SILVERLIGHT || PLIB_LITE)
 using System;
 using System.Threading;
 
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/Strings_Core.Generated.cs b/external/rx/Rx/NET/Source/System.Reactive.Core/Strings_Core.Generated.cs
index 3e9a82e..409a50d 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/Strings_Core.Generated.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/Strings_Core.Generated.cs
@@ -53,7 +53,7 @@ namespace System.Reactive
             {
                 if (object.ReferenceEquals(resourceMan, null))
                 {
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Reactive.Strings_Core", typeof(Strings_Core).GetTypeInfo().Assembly);
 #else
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Reactive.Strings_Core", typeof(Strings_Core).Assembly);
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/System.Reactive.Core.csproj b/external/rx/Rx/NET/Source/System.Reactive.Core/System.Reactive.Core.csproj
index a6938ff..ebf057a 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Core/System.Reactive.Core.csproj
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/System.Reactive.Core.csproj
@@ -12,6 +12,8 @@
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
     <CodeAnalysisRuleSet>..\Rx.ruleset</CodeAnalysisRuleSet>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
+    <RestorePackages>true</RestorePackages>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU'">
     <OutputPath>bin\ReleaseXBLV\</OutputPath>
@@ -119,5 +121,14 @@
   <ItemGroup>
     <EmbeddedResource Include="Strings_Core.resx" />
   </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
   <Import Project="..\Import.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" />
+  <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
+    <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
+    <Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
+  </Target>
 </Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Core/packages.config b/external/rx/Rx/NET/Source/System.Reactive.Core/packages.config
new file mode 100644
index 0000000..82d2e60
--- /dev/null
+++ b/external/rx/Rx/NET/Source/System.Reactive.Core/packages.config
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.Bcl.Build" version="1.0.10" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Debugger/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Debugger/Properties/AssemblyInfo.cs
index e1a4c79..2932d06 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Debugger/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Debugger/Properties/AssemblyInfo.cs
@@ -27,11 +27,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-#if XBOX_LAKEVIEW
-[assembly: SecurityTransparent]
-#endif
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Debugger/System.Reactive.Debugger.csproj b/external/rx/Rx/NET/Source/System.Reactive.Debugger/System.Reactive.Debugger.csproj
index 87ca262..87e97db 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Debugger/System.Reactive.Debugger.csproj
+++ b/external/rx/Rx/NET/Source/System.Reactive.Debugger/System.Reactive.Debugger.csproj
@@ -12,6 +12,7 @@
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
     <CodeAnalysisRuleSet>..\Rx.ruleset</CodeAnalysisRuleSet>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU'">
     <OutputPath>bin\ReleaseXBLV\</OutputPath>
@@ -56,4 +57,5 @@
     </ProjectReference>
   </ItemGroup>
   <Import Project="..\Import.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
 </Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Experimental/InternalsVisibleTo.cs b/external/rx/Rx/NET/Source/System.Reactive.Experimental/InternalsVisibleTo.cs
index 85f6f9a..2c27e31 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Experimental/InternalsVisibleTo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Experimental/InternalsVisibleTo.cs
@@ -4,7 +4,9 @@ using System;
 
 #if SIGNED
 
-#if SIGNENHANCED // Key 272 for .NET 4.5 and beyond
+#if MONODROID || MONOTOUCH
+[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
+#elif SIGNENHANCED // Key 272 for .NET 4.5 and beyond
 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, PublicKey=002400000c80000014010000060200000024000052534131000800000100010085aad0bef0688d1b994a0d78e1fd29fc24ac34ed3d3ac3fb9b3d0c48386ba834aa880035060a8848b2d8adf58e670ed20914be3681a891c9c8c01eef2ab22872547c39be00af0e6c72485d7cfd1a51df8947d36ceba9989106b58abe79e6a3e71a01ed6bdc867012883e0b1a4d35b1b5eeed6df21e401bb0c22f2246ccb69979dc9e61eef262832ed0f2064853725a75485fa8a3efb7e027319c86dec03dc3b1bca2b5081 [...]
 #else            // Key 35 for older platforms
 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Experimental/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Experimental/Properties/AssemblyInfo.cs
index 1cd8857..c391996 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Experimental/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Experimental/Properties/AssemblyInfo.cs
@@ -28,11 +28,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-#if XBOX_LAKEVIEW
-[assembly: SecurityTransparent]
-#endif
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/QbservableEx.Generated.cs b/external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/QbservableEx.Generated.cs
index 4903e30..2bda167 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/QbservableEx.Generated.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Experimental/Reactive/Linq/QbservableEx.Generated.cs
@@ -1,5 +1,6 @@
-/*
- * WARNING: Auto-generated file (8/5/2012 1:55:31 PM)
+/*
+ * WARNING: Auto-generated file (11/21/2013 11:07:25 AM)
+ * Run Rx's auto-homoiconizer tool to generate this file (in the HomoIcon directory).
  */
 
 #pragma warning disable 1591
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Experimental/System.Reactive.Experimental.csproj b/external/rx/Rx/NET/Source/System.Reactive.Experimental/System.Reactive.Experimental.csproj
index b860492..2c80a0d 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Experimental/System.Reactive.Experimental.csproj
+++ b/external/rx/Rx/NET/Source/System.Reactive.Experimental/System.Reactive.Experimental.csproj
@@ -12,6 +12,7 @@
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
     <CodeAnalysisRuleSet>..\Rx.ruleset</CodeAnalysisRuleSet>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU'">
     <OutputPath>bin\ReleaseXBLV\</OutputPath>
@@ -56,4 +57,5 @@
     </ProjectReference>
   </ItemGroup>
   <Import Project="..\Import.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
 </Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObservable.cs b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObservable.cs
index f1b62d2..ae67bc7 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObservable.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObservable.cs
@@ -18,4 +18,7 @@ namespace System
         IDisposable Subscribe(IObserver<T> observer);
     }
 }
-#endif
\ No newline at end of file
+#elif !WINDOWSPHONE7 // TypeForwardedTo is not presen on windows phone 7 so we can't really target
+[assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.IObservable<>))]
+#endif
+
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObserver.cs b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObserver.cs
index 6ed6c58..e157410 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObserver.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/IObserver.cs
@@ -30,4 +30,6 @@ namespace System
         void OnCompleted();
     }
 }
+#elif !WINDOWSPHONE7 // TypeForwardedTo is not presen on windows phone 7 so we can't really target
+[assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.IObserver<>))]
 #endif
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Properties/AssemblyInfo.cs
index fd916fa..0cbc40b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Properties/AssemblyInfo.cs
@@ -27,13 +27,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-#if XBOX_LAKEVIEW
-[assembly: SecurityTransparent]
-#endif
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
 
-//
-// Starting with v2.0 RC, we're bumping this file's version number,
-// because MSI wouldn't pick it up as an update otherwise...
-//
-//[assembly: AssemblyVersion("2.0.0.0")]
-//[assembly: AssemblyFileVersion("2.0.0.0")]
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservable.cs b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservable.cs
index 3d0b610..1244b9f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservable.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservable.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
 #if !NO_EXPRESSIONS
 using System.Linq.Expressions;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservableProvider.cs b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservableProvider.cs
index 767a6a4..2b7d39f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservableProvider.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/Reactive/Linq/IQbservableProvider.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
 #if !NO_EXPRESSIONS
 using System.Linq.Expressions;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/System.Reactive.Interfaces.csproj b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/System.Reactive.Interfaces.csproj
index 02851a7..86efc2f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Interfaces/System.Reactive.Interfaces.csproj
+++ b/external/rx/Rx/NET/Source/System.Reactive.Interfaces/System.Reactive.Interfaces.csproj
@@ -12,6 +12,7 @@
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
     <CodeAnalysisRuleSet>..\Rx.ruleset</CodeAnalysisRuleSet>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU'">
     <OutputPath>bin\ReleaseXBLV\</OutputPath>
@@ -57,4 +58,5 @@
   </ItemGroup>
   <ItemGroup />
   <Import Project="..\Import.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
 </Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/GlobalSuppressions.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/GlobalSuppressions.cs
index e0088a2..d05b514 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/GlobalSuppressions.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/GlobalSuppressions.cs
@@ -15,169 +15,169 @@
 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "System.Reactive.Threading.Tasks", Justification = "By design.")]
 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA2210:AssembliesShouldHaveValidStrongNames", Justification = "Taken care of by lab build.")]
 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1016:MarkAssembliesWithAssemblyVersion", Justification = "Taken care of by lab build.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AddRef`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Aggregate`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Aggregate`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.All`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Amb`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Any`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AsObservable`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageDecimal.#Run(System.IObserver`1<System.Decimal>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageDecimalNullable.#Run(System.IObserver`1<System.Nullable`1<System.Decimal>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageDouble.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageDoubleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageInt32.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageInt32Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageInt64.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageInt64Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageSingle.#Run(System.IObserver`1<System.Single>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.AverageSingleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Single>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Buffer`2.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Buffer`1.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Cast`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Catch`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Catch`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`17.#Run(System.IObserver`1<!16>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`16.#Run(System.IObserver`1<!15>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`15.#Run(System.IObserver`1<!14>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`14.#Run(System.IObserver`1<!13>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`13.#Run(System.IObserver`1<!12>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`12.#Run(System.IObserver`1<!11>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`11.#Run(System.IObserver`1<!10>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`10.#Run(System.IObserver`1<!9>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`9.#Run(System.IObserver`1<!8>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`8.#Run(System.IObserver`1<!7>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`7.#Run(System.IObserver`1<!6>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`6.#Run(System.IObserver`1<!5>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`5.#Run(System.IObserver`1<!4>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`4.#Run(System.IObserver`1<!3>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`3.#Run(System.IObserver`1<!2>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CombineLatest`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Concat`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Contains`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.CountObservαble`1.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.DefaultIfEmpty`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Defer`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Delay`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Delay`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.DelaySubscription`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Scope = "member", Target = "System.Reactive.Linq.Observαble.Dematerialize`1+_.#OnNext(System.Reactive.Notification`1<!0>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Dematerialize`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Distinct`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.DistinctUntilChanged`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Do`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AddRef`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Aggregate`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Aggregate`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.All`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Amb`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Any`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AsObservable`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageDecimal.#Run(System.IObserver`1<System.Decimal>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageDecimalNullable.#Run(System.IObserver`1<System.Nullable`1<System.Decimal>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageDouble.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageDoubleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageInt32.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageInt32Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageInt64.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageInt64Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageSingle.#Run(System.IObserver`1<System.Single>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.AverageSingleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Single>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Buffer`2.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Buffer`1.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Cast`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Catch`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Catch`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`17.#Run(System.IObserver`1<!16>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`16.#Run(System.IObserver`1<!15>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`15.#Run(System.IObserver`1<!14>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`14.#Run(System.IObserver`1<!13>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`13.#Run(System.IObserver`1<!12>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`12.#Run(System.IObserver`1<!11>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`11.#Run(System.IObserver`1<!10>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`10.#Run(System.IObserver`1<!9>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`9.#Run(System.IObserver`1<!8>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`8.#Run(System.IObserver`1<!7>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`7.#Run(System.IObserver`1<!6>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`6.#Run(System.IObserver`1<!5>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`5.#Run(System.IObserver`1<!4>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`4.#Run(System.IObserver`1<!3>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`3.#Run(System.IObserver`1<!2>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.CombineLatest`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Concat`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Contains`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Count`1.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.DefaultIfEmpty`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Defer`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Delay`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Delay`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.DelaySubscription`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Dematerialize`1+_.#OnNext(System.Reactive.Notification`1<!0>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Dematerialize`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Distinct`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Do`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Scope = "member", Target = "System.Reactive.Either`2+Left.#Switch(System.Action`1<!0>,System.Action`1<!1>)", Justification = "Producer cannot pass null to setSink parameter.")]
 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Scope = "member", Target = "System.Reactive.Either`2+Left.#Switch`1(System.Func`2<!0,!!0>,System.Func`2<!1,!!0>)", Justification = "Producer cannot pass null to setSink parameter.")]
 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "1", Scope = "member", Target = "System.Reactive.Either`2+Right.#Switch(System.Action`1<!0>,System.Action`1<!1>)", Justification = "Producer cannot pass null to setSink parameter.")]
 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "1", Scope = "member", Target = "System.Reactive.Either`2+Right.#Switch`1(System.Func`2<!0,!!0>,System.Func`2<!1,!!0>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.ElementAt`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Empty`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Finally`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.FirstAsync`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Generate`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.GroupBy`3.#Run(System.IObserver`1<System.Reactive.Linq.IGroupedObservable`2<!1,!2>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.GroupByUntil`4.#Run(System.IObserver`1<System.Reactive.Linq.IGroupedObservable`2<!1,!2>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.GroupJoin`5.#Run(System.IObserver`1<!4>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.IgnoreElements`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.IsEmpty`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Join`5.#Run(System.IObserver`1<!4>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.ElementAt`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Empty`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Finally`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.FirstAsync`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Generate`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.GroupBy`3.#Run(System.IObserver`1<System.Reactive.Linq.IGroupedObservable`2<!1,!2>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.GroupByUntil`4.#Run(System.IObserver`1<System.Reactive.Linq.IGroupedObservable`2<!1,!2>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.GroupJoin`5.#Run(System.IObserver`1<!4>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.IgnoreElements`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.IsEmpty`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Join`5.#Run(System.IObserver`1<!4>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
 [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Scope = "member", Target = "System.Reactive.Joins.JoinObserver`1.#OnNextCore(System.Reactive.Notification`1<!0>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.LastAsync`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.LongCountObservαble`1.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Materialize`1.#Run(System.IObserver`1<System.Reactive.Notification`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Max`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxBy`2.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxDecimal.#Run(System.IObserver`1<System.Decimal>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxDecimalNullable.#Run(System.IObserver`1<System.Nullable`1<System.Decimal>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxDouble.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxDoubleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxInt32.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxInt32Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int32>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxInt64.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxInt64Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int64>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxSingle.#Run(System.IObserver`1<System.Single>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MaxSingleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Single>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Merge`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Min`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinBy`2.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinDecimal.#Run(System.IObserver`1<System.Decimal>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinDecimalNullable.#Run(System.IObserver`1<System.Nullable`1<System.Decimal>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinDouble.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinDoubleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinInt32.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinInt32Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int32>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinInt64.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinInt64Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int64>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinSingle.#Run(System.IObserver`1<System.Single>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.MinSingleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Single>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Multicast`3.#Run(System.IObserver`1<!2>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.OfType`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.OnErrorResumeNext`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Range.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.RefCount`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Repeat`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Return`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Sample`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Sample`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Scan`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Scan`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Select`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SelectMany`3.#Run(System.IObserver`1<!2>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SelectMany`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SequenceEqual`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SingleAsync`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Skip`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SkipLast`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SkipUntil`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SkipUntil`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SkipWhile`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumDecimal.#Run(System.IObserver`1<System.Decimal>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumDecimalNullable.#Run(System.IObserver`1<System.Nullable`1<System.Decimal>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumDouble.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumDoubleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumInt32.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumInt32Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int32>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumInt64.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumInt64Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int64>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumSingle.#Run(System.IObserver`1<System.Single>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.SumSingleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Single>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Switch`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Take`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.TakeLast`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.TakeUntil`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.TakeUntil`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.TakeWhile`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Throttle`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Throttle`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Throw`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.TimeInterval`1.#Run(System.IObserver`1<System.Reactive.TimeInterval`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Timeout`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Timeout`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Timer.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Timestamp`1.#Run(System.IObserver`1<System.Reactive.Timestamped`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.ToArray`1.#Run(System.IObserver`1<!0[]>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.ToDictionary`3.#Run(System.IObserver`1<System.Collections.Generic.IDictionary`2<!1,!2>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.ToList`1.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.ToLookup`3.#Run(System.IObserver`1<System.Linq.ILookup`2<!1,!2>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.ToObservable`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Using`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Where`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Window`2.#Run(System.IObserver`1<System.IObservable`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Window`1.#Run(System.IObserver`1<System.IObservable`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`17.#Run(System.IObserver`1<!16>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`16.#Run(System.IObserver`1<!15>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`15.#Run(System.IObserver`1<!14>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`14.#Run(System.IObserver`1<!13>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`13.#Run(System.IObserver`1<!12>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`12.#Run(System.IObserver`1<!11>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`11.#Run(System.IObserver`1<!10>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`10.#Run(System.IObserver`1<!9>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`9.#Run(System.IObserver`1<!8>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`8.#Run(System.IObserver`1<!7>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`7.#Run(System.IObserver`1<!6>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`6.#Run(System.IObserver`1<!5>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`4.#Run(System.IObserver`1<!3>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`3.#Run(System.IObserver`1<!2>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`1.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.Observαble.Zip`5.#Run(System.IObserver`1<!4>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
-[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2208:InstantiateArgumentExceptionsCorrectly", Scope = "member", Target = "System.Reactive.Linq.Observαble.ElementAt`1+_.#OnCompleted()", Justification = "Asynchronous behavior; no more index parameter in scope.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.LastAsync`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.LongCount`1.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Materialize`1.#Run(System.IObserver`1<System.Reactive.Notification`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Max`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxBy`2.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxDecimal.#Run(System.IObserver`1<System.Decimal>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxDecimalNullable.#Run(System.IObserver`1<System.Nullable`1<System.Decimal>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxDouble.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxDoubleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxInt32.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxInt32Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int32>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxInt64.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxInt64Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int64>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxSingle.#Run(System.IObserver`1<System.Single>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MaxSingleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Single>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Merge`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Min`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinBy`2.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinDecimal.#Run(System.IObserver`1<System.Decimal>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinDecimalNullable.#Run(System.IObserver`1<System.Nullable`1<System.Decimal>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinDouble.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinDoubleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinInt32.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinInt32Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int32>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinInt64.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinInt64Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int64>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinSingle.#Run(System.IObserver`1<System.Single>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.MinSingleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Single>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Multicast`3.#Run(System.IObserver`1<!2>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.OfType`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.OnErrorResumeNext`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Range.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.RefCount`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Repeat`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Return`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Sample`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Sample`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Scan`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Scan`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Select`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SelectMany`3.#Run(System.IObserver`1<!2>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SelectMany`2.#Run(System.IObserver`1<!1>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SequenceEqual`1.#Run(System.IObserver`1<System.Boolean>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SingleAsync`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Skip`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SkipLast`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SkipUntil`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SkipUntil`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SkipWhile`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumDecimal.#Run(System.IObserver`1<System.Decimal>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumDecimalNullable.#Run(System.IObserver`1<System.Nullable`1<System.Decimal>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumDouble.#Run(System.IObserver`1<System.Double>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumDoubleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Double>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumInt32.#Run(System.IObserver`1<System.Int32>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumInt32Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int32>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumInt64.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumInt64Nullable.#Run(System.IObserver`1<System.Nullable`1<System.Int64>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumSingle.#Run(System.IObserver`1<System.Single>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.SumSingleNullable.#Run(System.IObserver`1<System.Nullable`1<System.Single>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Switch`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Take`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.TakeLast`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.TakeUntil`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.TakeUntil`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.TakeWhile`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Throttle`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Throttle`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Throw`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.TimeInterval`1.#Run(System.IObserver`1<System.Reactive.TimeInterval`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Timeout`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Timeout`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Timer.#Run(System.IObserver`1<System.Int64>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Timestamp`1.#Run(System.IObserver`1<System.Reactive.Timestamped`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.ToArray`1.#Run(System.IObserver`1<!0[]>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.ToDictionary`3.#Run(System.IObserver`1<System.Collections.Generic.IDictionary`2<!1,!2>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.ToList`1.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.ToLookup`3.#Run(System.IObserver`1<System.Linq.ILookup`2<!1,!2>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.ToObservable`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Using`2.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Where`1.#Run(System.IObserver`1<!0>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Window`2.#Run(System.IObserver`1<System.IObservable`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Window`1.#Run(System.IObserver`1<System.IObservable`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`17.#Run(System.IObserver`1<!16>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`16.#Run(System.IObserver`1<!15>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`15.#Run(System.IObserver`1<!14>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`14.#Run(System.IObserver`1<!13>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`13.#Run(System.IObserver`1<!12>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`12.#Run(System.IObserver`1<!11>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`11.#Run(System.IObserver`1<!10>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`10.#Run(System.IObserver`1<!9>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`9.#Run(System.IObserver`1<!8>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`8.#Run(System.IObserver`1<!7>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`7.#Run(System.IObserver`1<!6>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`6.#Run(System.IObserver`1<!5>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`4.#Run(System.IObserver`1<!3>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`3.#Run(System.IObserver`1<!2>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`1.#Run(System.IObserver`1<System.Collections.Generic.IList`1<!0>>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "2", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.Zip`5.#Run(System.IObserver`1<!4>,System.IDisposable,System.Action`1<System.IDisposable>)", Justification = "Producer cannot pass null to setSink parameter.")]
+[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2208:InstantiateArgumentExceptionsCorrectly", Scope = "member", Target = "System.Reactive.Linq.ObservableImpl.ElementAt`1+_.#OnCompleted()", Justification = "Asynchronous behavior; no more index parameter in scope.")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/InternalsVisibleTo.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/InternalsVisibleTo.cs
index 6aafa69..7d20cec 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/InternalsVisibleTo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/InternalsVisibleTo.cs
@@ -4,7 +4,11 @@ using System;
 
 #if SIGNED
 
-#if SIGNENHANCED // Key 272 for .NET 4.5 and beyond
+#if MONODROID || MONOTOUCH
+[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
+[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Experimental, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
+[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.PlatformServices, PublicKey=0024000004800000940000000602000000240000525341310004000011000000438ac2a5acfbf16cbd2b2b47a62762f273df9cb2795ceccdf77d10bf508e69e7a362ea7a45455bbf3ac955e1f2e2814f144e5d817efc4c6502cc012df310783348304e3ae38573c6d658c234025821fda87a0be8a0d504df564e2c93b2b878925f42503e9d54dfef9f9586d9e6f38a305769587b1de01f6c0410328b2c9733db")]
+#elif SIGNENHANCED // Key 272 for .NET 4.5 and beyond
 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, PublicKey=002400000c80000014010000060200000024000052534131000800000100010085aad0bef0688d1b994a0d78e1fd29fc24ac34ed3d3ac3fb9b3d0c48386ba834aa880035060a8848b2d8adf58e670ed20914be3681a891c9c8c01eef2ab22872547c39be00af0e6c72485d7cfd1a51df8947d36ceba9989106b58abe79e6a3e71a01ed6bdc867012883e0b1a4d35b1b5eeed6df21e401bb0c22f2246ccb69979dc9e61eef262832ed0f2064853725a75485fa8a3efb7e027319c86dec03dc3b1bca2b5081 [...]
 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Experimental, PublicKey=002400000c80000014010000060200000024000052534131000800000100010085aad0bef0688d1b994a0d78e1fd29fc24ac34ed3d3ac3fb9b3d0c48386ba834aa880035060a8848b2d8adf58e670ed20914be3681a891c9c8c01eef2ab22872547c39be00af0e6c72485d7cfd1a51df8947d36ceba9989106b58abe79e6a3e71a01ed6bdc867012883e0b1a4d35b1b5eeed6df21e401bb0c22f2246ccb69979dc9e61eef262832ed0f2064853725a75485fa8a3efb7e027319c86dec03dc3b1bca2b [...]
 [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.PlatformServices, PublicKey=002400000c80000014010000060200000024000052534131000800000100010085aad0bef0688d1b994a0d78e1fd29fc24ac34ed3d3ac3fb9b3d0c48386ba834aa880035060a8848b2d8adf58e670ed20914be3681a891c9c8c01eef2ab22872547c39be00af0e6c72485d7cfd1a51df8947d36ceba9989106b58abe79e6a3e71a01ed6bdc867012883e0b1a4d35b1b5eeed6df21e401bb0c22f2246ccb69979dc9e61eef262832ed0f2064853725a75485fa8a3efb7e027319c86dec03dc3b1b [...]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Properties/AssemblyInfo.cs
index a4b081a..9b1065e 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Properties/AssemblyInfo.cs
@@ -27,11 +27,12 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-#if XBOX_LAKEVIEW
-[assembly: SecurityTransparent]
-#endif
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/Helpers.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/Helpers.cs
index dee33fb..5a6e1e2 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/Helpers.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/Helpers.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 using System.Collections.Generic;
-using System.Reactive.Linq.Observαble;
+using System.Reactive.Linq.ObservableImpl;
 
 namespace System.Reactive
 {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/ReflectionUtils.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/ReflectionUtils.cs
index effdd08..34dec93 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/ReflectionUtils.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Internal/ReflectionUtils.cs
@@ -15,7 +15,7 @@ namespace System.Reactive
     {
         public static TDelegate CreateDelegate<TDelegate>(object o, MethodInfo method)
         {
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
             return (TDelegate)(object)method.CreateDelegate(typeof(TDelegate), o);
 #else
             return (TDelegate)(object)Delegate.CreateDelegate(typeof(TDelegate), o, method);
@@ -24,7 +24,7 @@ namespace System.Reactive
 
         public static Delegate CreateDelegate(Type delegateType, object o, MethodInfo method)
         {
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
             return method.CreateDelegate(delegateType, o);
 #else
             return Delegate.CreateDelegate(delegateType, o, method);
@@ -101,7 +101,7 @@ namespace System.Reactive
 
         public static EventInfo GetEventEx(this Type type, string name, bool isStatic)
         {
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
             // TODO: replace in the future by System.Reflection.RuntimeExtensions extension methods
             var q = new Queue<TypeInfo>();
             q.Enqueue(type.GetTypeInfo());
@@ -127,7 +127,7 @@ namespace System.Reactive
 #endif
         }
 
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
         public static MethodInfo GetMethod(this Type type, string name)
         {
             return type.GetTypeInfo().GetDeclaredMethod(name);
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/IQueryLanguage.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/IQueryLanguage.cs
index 4b35af6..2abdae0 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/IQueryLanguage.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/IQueryLanguage.cs
@@ -1,6 +1,5 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
-using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Reactive.Concurrency;
@@ -9,7 +8,7 @@ using System.Reactive.Subjects;
 using System.Threading;
 
 #if !NO_REMOTING
-using System.Runtime.Remoting.Lifetime;
+
 #endif
 
 #if !NO_TPL
@@ -386,7 +385,7 @@ namespace System.Reactive.Linq
         #endregion
 
         #region * Conversions *
-        
+
         IDisposable Subscribe<TSource>(IEnumerable<TSource> source, IObserver<TSource> observer);
         IDisposable Subscribe<TSource>(IEnumerable<TSource> source, IObserver<TSource> observer, IScheduler scheduler);
         IEnumerable<TSource> ToEnumerable<TSource>(IObservable<TSource> source);
@@ -503,7 +502,7 @@ namespace System.Reactive.Linq
         IObservable<TEventArgs> FromEvent<TEventArgs>(Action<Action<TEventArgs>> addHandler, Action<Action<TEventArgs>> removeHandler, IScheduler scheduler);
         IObservable<Unit> FromEvent(Action<Action> addHandler, Action<Action> removeHandler);
         IObservable<Unit> FromEvent(Action<Action> addHandler, Action<Action> removeHandler, IScheduler scheduler);
-        
+
         #endregion
 
         #region * Imperative *
@@ -683,10 +682,18 @@ namespace System.Reactive.Linq
         IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);
         IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector);
         IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer);
+        IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, int capacity);
+        IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, int capacity, IEqualityComparer<TKey> comparer);
+        IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, int capacity);
+        IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, int capacity, IEqualityComparer<TKey> comparer);
         IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer);
         IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector);
-        IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector,Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer);
+        IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer);
         IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector);
+        IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, int capacity, IEqualityComparer<TKey> comparer);
+        IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, int capacity);
+        IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, int capacity, IEqualityComparer<TKey> comparer);
+        IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, int capacity);
         IObservable<TResult> GroupJoin<TLeft, TRight, TLeftDuration, TRightDuration, TResult>(IObservable<TLeft> left, IObservable<TRight> right, Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector, Func<TRight, IObservable<TRightDuration>> rightDurationSelector, Func<TLeft, IObservable<TRight>, TResult> resultSelector);
         IObservable<TResult> Join<TLeft, TRight, TLeftDuration, TRightDuration, TResult>(IObservable<TLeft> left, IObservable<TRight> right, Func<TLeft, IObservable<TLeftDuration>> leftDurationSelector, Func<TRight, IObservable<TRightDuration>> rightDurationSelector, Func<TLeft, TRight, TResult> resultSelector);
         IObservable<TResult> OfType<TResult>(IObservable<object> source);
@@ -698,7 +705,7 @@ namespace System.Reactive.Linq
         IObservable<TResult> SelectMany<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, IObservable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
         IObservable<TResult> SelectMany<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector);
         IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, IObservable<TResult>> onNext, Func<Exception, IObservable<TResult>> onError, Func<IObservable<TResult>> onCompleted);
-        IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> onNext, Func<Exception, int, IObservable<TResult>> onError, Func<int, IObservable<TResult>> onCompleted);
+        IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> onNext, Func<Exception, IObservable<TResult>> onError, Func<IObservable<TResult>> onCompleted);
         IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, IEnumerable<TResult>> selector);
         IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector);
         IObservable<TResult> SelectMany<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
@@ -715,9 +722,13 @@ namespace System.Reactive.Linq
 
 #if !NO_TPL
         IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, Task<TResult>> selector);
+        IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, Task<TResult>> selector);
         IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, CancellationToken, Task<TResult>> selector);
+        IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TResult>> selector);
         IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(IObservable<TSource> source, Func<TSource, Task<TTaskResult>> taskSelector, Func<TSource, TTaskResult, TResult> resultSelector);
+        IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(IObservable<TSource> source, Func<TSource, int, Task<TTaskResult>> taskSelector, Func<TSource, int, TTaskResult, TResult> resultSelector);
         IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(IObservable<TSource> source, Func<TSource, CancellationToken, Task<TTaskResult>> taskSelector, Func<TSource, TTaskResult, TResult> resultSelector);
+        IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TTaskResult>> taskSelector, Func<TSource, int, TTaskResult, TResult> resultSelector);
 #endif
 
         #endregion
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Blocking.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Blocking.cs
index 1575b3d..db2a1d1 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Blocking.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Blocking.cs
@@ -76,7 +76,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region First
+        #region + First +
 
         /// <summary>
         /// Returns the first element of an observable sequence.
@@ -123,7 +123,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region FirstOrDefault
+        #region + FirstOrDefault +
 
         /// <summary>
         /// Returns the first element of an observable sequence, or a default value if no such element exists.
@@ -233,7 +233,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region Last
+        #region + Last +
 
         /// <summary>
         /// Returns the last element of an observable sequence.
@@ -280,7 +280,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region LastOrDefault
+        #region + LastOrDefault +
 
         /// <summary>
         /// Returns the last element of an observable sequence, or a default value if no such element exists.
@@ -385,7 +385,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region Single
+        #region + Single +
 
         /// <summary>
         /// Returns the only element of an observable sequence, and throws an exception if there is not exactly one element in the observable sequence.
@@ -432,7 +432,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region SingleOrDefault
+        #region + SingleOrDefault +
 
         /// <summary>
         /// Returns the only element of an observable sequence, or a default value if the observable sequence is empty; this method throws an exception if there is more than one element in the observable sequence.
@@ -479,7 +479,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region Wait
+        #region + Wait +
 
         /// <summary>
         /// Waits for the observable sequence to complete and returns the last element of the sequence.
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Concurrency.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Concurrency.cs
index e14df19..7f29bfd 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Concurrency.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Concurrency.cs
@@ -5,7 +5,7 @@ using System.Threading;
 
 namespace System.Reactive.Linq
 {
-	public static partial class Observable
+    public static partial class Observable
     {
         #region + ObserveOn +
 
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Creation.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Creation.cs
index 3de4a43..9b39888 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Creation.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Creation.cs
@@ -12,7 +12,7 @@ namespace System.Reactive.Linq
 {
     public static partial class Observable
     {
-        #region - Create -
+        #region + Create +
 
         /// <summary>
         /// Creates an observable sequence from a specified Subscribe method implementation.
@@ -56,7 +56,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region - CreateAsync -
+        #region + CreateAsync +
 
 #if !NO_TPL
         /// <summary>
@@ -591,7 +591,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region - UsingAsync -
+        #region + UsingAsync +
 
 #if !NO_TPL
 
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Imperative.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Imperative.cs
index 0c8089e..2124e62 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Imperative.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Imperative.cs
@@ -12,7 +12,7 @@ namespace System.Reactive.Linq
 {
     public static partial class Observable
     {
-        #region ForEachAsync
+        #region + ForEachAsync +
 
 #if !NO_TPL
         /// <summary>
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Multiple.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Multiple.cs
index 9cb62de..db0d61b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Multiple.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Multiple.cs
@@ -67,7 +67,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region Buffer
+        #region + Buffer +
 
         /// <summary>
         /// Projects each element of an observable sequence into consecutive non-overlapping buffers.
@@ -1403,8 +1403,10 @@ namespace System.Reactive.Linq
         #region + Switch +
 
         /// <summary>
-        /// Switches between the inner observable sequences such that the resulting sequence always produces elements from the most recently received inner observable sequence.
-        /// Each time a new inner observable sequence is received, the previous inner observable sequence is unsubscribed from.
+        /// Transforms an observable sequence of observable sequences into an observable sequence 
+        /// producing values only from the most recent observable sequence.
+        /// Each time a new inner observable sequence is received, unsubscribe from the 
+        /// previous inner observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequences.</typeparam>
         /// <param name="sources">Observable sequence of inner observable sequences.</param>
@@ -1421,7 +1423,8 @@ namespace System.Reactive.Linq
 #if !NO_TPL
 
         /// <summary>
-        /// Switches between the tasks such that the resulting sequence always produces results from the most recently received task.
+        /// Transforms an observable sequence of tasks into an observable sequence 
+        /// producing values only from the most recent observable sequence.
         /// Each time a new task is received, the previous task's result is ignored.
         /// </summary>
         /// <typeparam name="TSource">The type of the results produced by the source tasks.</typeparam>
@@ -1464,7 +1467,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region Window
+        #region + Window +
 
         /// <summary>
         /// Projects each element of an observable sequence into consecutive non-overlapping windows.
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Single.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Single.cs
index 5d8e3ef..8782702 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Single.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.Single.cs
@@ -339,7 +339,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region - Repeat -
+        #region + Repeat +
 
         /// <summary>
         /// Repeats the observable sequence indefinitely.
@@ -377,7 +377,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region - Retry -
+        #region + Retry +
 
         /// <summary>
         /// Repeats the source observable sequence until it successfully terminates.
@@ -486,7 +486,7 @@ namespace System.Reactive.Linq
 
         #endregion
 
-        #region - StartWith -
+        #region + StartWith +
 
         /// <summary>
         /// Prepends a sequence of values to an observable sequence.
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.StandardSequenceOperators.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.StandardSequenceOperators.cs
index 8eb9289..803ba26 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.StandardSequenceOperators.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable.StandardSequenceOperators.cs
@@ -241,6 +241,112 @@ namespace System.Reactive.Linq
             return s_impl.GroupBy<TSource, TKey, TElement>(source, keySelector, elementSelector, comparer);
         }
 
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <returns>A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is less than 0.</exception>
+        public static IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, int capacity)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (capacity < 0)
+                throw new ArgumentOutOfRangeException("capacity");
+
+            return s_impl.GroupBy<TSource, TKey>(source, keySelector, capacity);
+        }
+
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and comparer.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <returns>A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> or <paramref name="comparer"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is less than 0.</exception>
+        public static IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (capacity < 0)
+                throw new ArgumentOutOfRangeException("capacity");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
+
+            return s_impl.GroupBy<TSource, TKey>(source, keySelector, capacity, comparer);
+        }
+
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity and selects the resulting elements by using a specified function.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TElement">The type of the elements within the groups computed for each element in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <returns>A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> or <paramref name="elementSelector"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is less than 0.</exception>
+        public static IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, int capacity)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (elementSelector == null)
+                throw new ArgumentNullException("elementSelector");
+            if (capacity < 0)
+                throw new ArgumentOutOfRangeException("capacity");
+
+            return s_impl.GroupBy<TSource, TKey, TElement>(source, keySelector, elementSelector, capacity);
+        }
+
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and comparer and selects the resulting elements by using a specified function.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TElement">The type of the elements within the groups computed for each element in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <returns>A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> or <paramref name="elementSelector"/> or <paramref name="comparer"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is less than 0.</exception>
+        public static IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (elementSelector == null)
+                throw new ArgumentNullException("elementSelector");
+            if (capacity < 0)
+                throw new ArgumentOutOfRangeException("capacity");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
+
+            return s_impl.GroupBy<TSource, TKey, TElement>(source, keySelector, elementSelector, capacity, comparer);
+        }
+
         #endregion
 
         #region + GroupByUntil +
@@ -329,7 +435,7 @@ namespace System.Reactive.Linq
         /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
         /// </returns>
         /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> or <paramref name="durationSelector"/> or <paramref name="comparer"/> is null.</exception>
-        public static IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IObservable<TSource> source, Func<TSource, TKey> keySelector,Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer)
+        public static IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -371,6 +477,148 @@ namespace System.Reactive.Linq
             return s_impl.GroupByUntil<TSource, TKey, TDuration>(source, keySelector, durationSelector);
         }
 
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and comparer and selects the resulting elements by using a specified function.
+        /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
+        /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TElement">The type of the elements within the groups computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
+        /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <returns>
+        /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encountered.
+        /// </returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> or <paramref name="elementSelector"/> or <paramref name="durationSelector"/> or <paramref name="comparer"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is less than 0.</exception>
+        public static IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (elementSelector == null)
+                throw new ArgumentNullException("elementSelector");
+            if (durationSelector == null)
+                throw new ArgumentNullException("durationSelector");
+            if (capacity < 0)
+                throw new ArgumentOutOfRangeException("capacity");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
+
+            return s_impl.GroupByUntil<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, capacity, comparer);
+        }
+
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and selects the resulting elements by using a specified function.
+        /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
+        /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TElement">The type of the elements within the groups computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
+        /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <returns>
+        /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
+        /// </returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> or <paramref name="elementSelector"/> or <paramref name="durationSelector"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is less than 0.</exception>
+        public static IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, int capacity)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (elementSelector == null)
+                throw new ArgumentNullException("elementSelector");
+            if (durationSelector == null)
+                throw new ArgumentNullException("durationSelector");
+            if (capacity < 0)
+                throw new ArgumentOutOfRangeException("capacity");
+
+            return s_impl.GroupByUntil<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, capacity);
+        }
+
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and comparer.
+        /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
+        /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <returns>
+        /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
+        /// </returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> or <paramref name="durationSelector"/> or <paramref name="comparer"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is less than 0.</exception>
+        public static IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (durationSelector == null)
+                throw new ArgumentNullException("durationSelector");
+            if (capacity < 0)
+                throw new ArgumentOutOfRangeException("capacity");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
+
+            return s_impl.GroupByUntil<TSource, TKey, TDuration>(source, keySelector, durationSelector, capacity, comparer);
+        }
+
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function.
+        /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
+        /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <returns>
+        /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
+        /// </returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="keySelector"/> or <paramref name="durationSelector"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="capacity"/> is less than 0.</exception>
+        public static IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, int capacity)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (durationSelector == null)
+                throw new ArgumentNullException("durationSelector");
+            if (capacity < 0)
+                throw new ArgumentOutOfRangeException("capacity");
+
+            return s_impl.GroupByUntil<TSource, TKey, TDuration>(source, keySelector, durationSelector, capacity);
+        }
+
         #endregion
 
         #region + GroupJoin +
@@ -545,12 +793,12 @@ namespace System.Reactive.Linq
         }
 
         /// <summary>
-        /// Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+        /// Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
-        /// <param name="selector">A transform function to apply to each source element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
         /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
         public static IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> selector)
@@ -585,6 +833,26 @@ namespace System.Reactive.Linq
         }
 
         /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index and merges all of the task results into one observable sequence.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, Task<TResult>> selector)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (selector == null)
+                throw new ArgumentNullException("selector");
+
+            return s_impl.SelectMany<TSource, TResult>(source, selector);
+        }
+
+        /// <summary>
         /// Projects each element of an observable sequence to a task with cancellation support and merges all of the task results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
@@ -603,6 +871,26 @@ namespace System.Reactive.Linq
 
             return s_impl.SelectMany<TSource, TResult>(source, selector);
         }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index with cancellation support and merges all of the task results into one observable sequence.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TResult>> selector)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (selector == null)
+                throw new ArgumentNullException("selector");
+
+            return s_impl.SelectMany<TSource, TResult>(source, selector);
+        }
 #endif
 
         /// <summary>
@@ -629,14 +917,14 @@ namespace System.Reactive.Linq
         }
 
         /// <summary>
-        /// Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Projects each element of an observable sequence to an observable sequence by incorporating the element's index, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
-        /// <param name="collectionSelector">A transform function to apply to each source element; the second parameter of the function represents the index of the source element.</param>
-        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element and the fourth parameter represents the index of the intermediate element.</param>
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
         /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="collectionSelector"/> or <paramref name="resultSelector"/> is null.</exception>
         public static IObservable<TResult> SelectMany<TSource, TCollection, TResult>(this IObservable<TSource> source, Func<TSource, int, IObservable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector)
@@ -677,6 +965,30 @@ namespace System.Reactive.Linq
         }
 
         /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="taskSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        public static IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(this IObservable<TSource> source, Func<TSource, int, Task<TTaskResult>> taskSelector, Func<TSource, int, TTaskResult, TResult> resultSelector)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (taskSelector == null)
+                throw new ArgumentNullException("taskSelector");
+            if (resultSelector == null)
+                throw new ArgumentNullException("resultSelector");
+
+            return s_impl.SelectMany<TSource, TTaskResult, TResult>(source, taskSelector, resultSelector);
+        }
+
+        /// <summary>
         /// Projects each element of an observable sequence to a task with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
@@ -699,6 +1011,30 @@ namespace System.Reactive.Linq
 
             return s_impl.SelectMany<TSource, TTaskResult, TResult>(source, taskSelector, resultSelector);
         }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="taskSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        public static IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(this IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TTaskResult>> taskSelector, Func<TSource, int, TTaskResult, TResult> resultSelector)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (taskSelector == null)
+                throw new ArgumentNullException("taskSelector");
+            if (resultSelector == null)
+                throw new ArgumentNullException("resultSelector");
+
+            return s_impl.SelectMany<TSource, TTaskResult, TResult>(source, taskSelector, resultSelector);
+        }
 #endif
 
         /// <summary>
@@ -727,17 +1063,17 @@ namespace System.Reactive.Linq
         }
 
         /// <summary>
-        /// Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+        /// Projects each notification of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
         /// <param name="source">An observable sequence of notifications to project.</param>
-        /// <param name="onNext">A transform function to apply to each element; the second parameter represents the index of the source element.</param>
-        /// <param name="onError">A transform function to apply when an error occurs in the source sequence; the second parameter represents the index of the source element.</param>
-        /// <param name="onCompleted">A transform function to apply when the end of the source sequence is reached; the second parameter represents the number of elements observed.</param>
+        /// <param name="onNext">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="onError">A transform function to apply when an error occurs in the source sequence.</param>
+        /// <param name="onCompleted">A transform function to apply when the end of the source sequence is reached.</param>
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.</returns>
         /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="onNext"/> or <paramref name="onError"/> or <paramref name="onCompleted"/> is null.</exception>
-        public static IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> onNext, Func<Exception, int, IObservable<TResult>> onError, Func<int, IObservable<TResult>> onCompleted)
+        public static IObservable<TResult> SelectMany<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> onNext, Func<Exception, IObservable<TResult>> onError, Func<IObservable<TResult>> onCompleted)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -772,13 +1108,12 @@ namespace System.Reactive.Linq
         }
 
         /// <summary>
-        /// Projects each element of an observable sequence to an enumerable sequence and concatenates the resulting enumerable sequences into one observable sequence.
-        /// The index of each source element is used in the projected form of that element. 
+        /// Projects each element of an observable sequence to an enumerable sequence by incorporating the element's index and concatenates the resulting enumerable sequences into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
-        /// <param name="selector">A transform function to apply to each source element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
         /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
         /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="Observable.ToObservable<TSource>(IEnumerable<TSource>)"/> conversion.</remarks>
@@ -817,14 +1152,14 @@ namespace System.Reactive.Linq
         }
 
         /// <summary>
-        /// Projects each element of an observable sequence to an enumerable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Projects each element of an observable sequence to an enumerable sequence by incorporating the element's index, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
         /// <param name="collectionSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
-        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element and the fourth parameter represents the index of the intermediate element.</param>
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
         /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="collectionSelector"/> or <paramref name="resultSelector"/> is null.</exception>
         /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="Observable.ToObservable<TSource>(IEnumerable<TSource>)"/> conversion.</remarks>
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AddRef.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AddRef.cs
index 3fc6962..46e66c6 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AddRef.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AddRef.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class AddRef<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Aggregate.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Aggregate.cs
index d1b6ef8..6ae63c0 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Aggregate.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Aggregate.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Aggregate<TSource, TAccumulate, TResult> : Producer<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/All.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/All.cs
index 09c825d..49a0933 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/All.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/All.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class All<TSource> : Producer<bool>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Amb.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Amb.cs
index 7272cee..ea110c5 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Amb.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Amb.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Amb<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Any.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Any.cs
index 1414bdd..c8eb37a 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Any.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Any.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Any<TSource> : Producer<bool>
     {
@@ -25,7 +25,7 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_predicate != null)
             {
-                var sink = new π(this, observer, cancel);
+                var sink = new AnyImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -65,11 +65,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<bool>, IObserver<TSource>
+        class AnyImpl : Sink<bool>, IObserver<TSource>
         {
             private readonly Any<TSource> _parent;
 
-            public π(Any<TSource> parent, IObserver<bool> observer, IDisposable cancel)
+            public AnyImpl(Any<TSource> parent, IObserver<bool> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AsObservable.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AsObservable.cs
index 09d5f14..c4e9d2f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AsObservable.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/AsObservable.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class AsObservable<TSource> : Producer<TSource>, IEvaluatableObservable<TSource>
     {
@@ -14,7 +14,7 @@ namespace System.Reactive.Linq.Observαble
             _source = source;
         }
 
-        public IObservable<TSource> Ω()
+        public IObservable<TSource> Omega()
         {
             return this;
         }
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Average.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Average.cs
index fb2d6b7..897da02 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Average.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Average.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class AverageDouble : Producer<double>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Buffer.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Buffer.cs
index a82b550..ce6ced8 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Buffer.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Buffer.cs
@@ -8,7 +8,7 @@ using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Buffer<TSource> : Producer<IList<TSource>>
     {
@@ -53,7 +53,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else if (_count > 0)
             {
-                var sink = new μ(this, observer, cancel);
+                var sink = new Impl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -61,13 +61,13 @@ namespace System.Reactive.Linq.Observαble
             {
                 if (_timeSpan == _timeShift)
                 {
-                    var sink = new π(this, observer, cancel);
+                    var sink = new BufferTimeShift(this, observer, cancel);
                     setSink(sink);
                     return sink.Run();
                 }
                 else
                 {
-                    var sink = new τ(this, observer, cancel);
+                    var sink = new BufferImpl(this, observer, cancel);
                     setSink(sink);
                     return sink.Run();
                 }
@@ -143,11 +143,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<IList<TSource>>, IObserver<TSource>
+        class BufferImpl : Sink<IList<TSource>>, IObserver<TSource>
         {
             private readonly Buffer<TSource> _parent;
 
-            public τ(Buffer<TSource> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
+            public BufferImpl(Buffer<TSource> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -283,11 +283,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<IList<TSource>>, IObserver<TSource>
+        class BufferTimeShift : Sink<IList<TSource>>, IObserver<TSource>
         {
             private readonly Buffer<TSource> _parent;
 
-            public π(Buffer<TSource> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
+            public BufferTimeShift(Buffer<TSource> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -346,11 +346,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class μ : Sink<IList<TSource>>, IObserver<TSource>
+        class Impl : Sink<IList<TSource>>, IObserver<TSource>
         {
             private readonly Buffer<TSource> _parent;
 
-            public μ(Buffer<TSource> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
+            public Impl(Buffer<TSource> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -487,7 +487,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new β(this, observer, cancel);
+                var sink = new Beta(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -544,7 +544,7 @@ namespace System.Reactive.Linq.Observαble
 
                 var closingSubscription = new SingleAssignmentDisposable();
                 _m.Disposable = closingSubscription;
-                closingSubscription.Disposable = bufferClose.SubscribeSafe(new ω(this, closingSubscription));
+                closingSubscription.Disposable = bufferClose.SubscribeSafe(new Omega(this, closingSubscription));
             }
 
             private void CloseBuffer(IDisposable closingSubscription)
@@ -561,12 +561,12 @@ namespace System.Reactive.Linq.Observαble
                 _bufferGate.Wait(CreateBufferClose);
             }
 
-            class ω : IObserver<TBufferClosing>
+            class Omega : IObserver<TBufferClosing>
             {
                 private readonly _ _parent;
                 private readonly IDisposable _self;
 
-                public ω(_ parent, IDisposable self)
+                public Omega(_ parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -617,11 +617,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class β : Sink<IList<TSource>>, IObserver<TSource>
+        class Beta : Sink<IList<TSource>>, IObserver<TSource>
         {
             private readonly Buffer<TSource, TBufferClosing> _parent;
 
-            public β(Buffer<TSource, TBufferClosing> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
+            public Beta(Buffer<TSource, TBufferClosing> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -641,16 +641,16 @@ namespace System.Reactive.Linq.Observαble
                 _refCountDisposable = new RefCountDisposable(d);
 
                 d.Add(_parent._source.SubscribeSafe(this));
-                d.Add(_parent._bufferBoundaries.SubscribeSafe(new ω(this)));
+                d.Add(_parent._bufferBoundaries.SubscribeSafe(new Omega(this)));
 
                 return _refCountDisposable;
             }
 
-            class ω : IObserver<TBufferClosing>
+            class Omega : IObserver<TBufferClosing>
             {
-                private readonly β _parent;
+                private readonly Beta _parent;
 
-                public ω(β parent)
+                public Omega(Beta parent)
                 {
                     _parent = parent;
                 }
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Case.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Case.cs
index b104050..b3ba37c 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Case.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Case.cs
@@ -5,7 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Case<TValue, TResult> : Producer<TResult>, IEvaluatableObservable<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Cast.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Cast.cs
index 48820b3..b123357 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Cast.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Cast.cs
@@ -3,9 +3,9 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
-    class Cast<TSource, TResult> : Producer<TResult> /* Could optimize further by deriving from Select<TResult> and providing Ω<TResult2>. We're not doing this (yet) for debuggability. */
+    class Cast<TSource, TResult> : Producer<TResult> /* Could optimize further by deriving from Select<TResult> and providing Omega<TResult2>. We're not doing this (yet) for debuggability. */
     {
         private readonly IObservable<TSource> _source;
 
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Catch.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Catch.cs
index 71e0037..06bf911 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Catch.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Catch.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Catch<TSource> : Producer<TSource>
     {
@@ -136,7 +136,7 @@ namespace System.Reactive.Linq.Observαble
 
                     var d = new SingleAssignmentDisposable();
                     _subscription.Disposable = d;
-                    d.Disposable = result.SubscribeSafe(new ε(this));
+                    d.Disposable = result.SubscribeSafe(new Impl(this));
                 }
                 else
                 {
@@ -151,11 +151,11 @@ namespace System.Reactive.Linq.Observαble
                 base.Dispose();
             }
 
-            class ε : IObserver<TSource>
+            class Impl : IObserver<TSource>
             {
                 private readonly _ _parent;
 
-                public ε(_ parent)
+                public Impl(_ parent)
                 {
                     _parent = parent;
                 }
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Collect.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Collect.cs
index 2cfd240..8f0bf24 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Collect.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Collect.cs
@@ -7,7 +7,7 @@ using System.Reactive;
 using System.Reactive.Threading;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Collect<TSource, TResult> : PushToPullAdapter<TSource, TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/CombineLatest.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/CombineLatest.cs
index 2188307..9748e24 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/CombineLatest.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/CombineLatest.cs
@@ -7,7 +7,7 @@ using System.Collections.ObjectModel;
 using System.Linq;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     #region Binary
 
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Concat.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Concat.cs
index 5a9b2e4..cd8c78a 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Concat.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Concat.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Concat<TSource> : Producer<TSource>, IConcatenatable<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Contains.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Contains.cs
index b26e2d4..69e30dc 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Contains.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Contains.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Contains<TSource> : Producer<bool>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Count.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Count.cs
index 7432816..0c2f389 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Count.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Count.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Count<TSource> : Producer<int>
     {
@@ -31,7 +31,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new π(this, observer, cancel);
+                var sink = new CountImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -77,12 +77,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<int>, IObserver<TSource>
+        class CountImpl : Sink<int>, IObserver<TSource>
         {
             private readonly Count<TSource> _parent;
             private int _count;
 
-            public π(Count<TSource> parent, IObserver<int> observer, IDisposable cancel)
+            public CountImpl(Count<TSource> parent, IObserver<int> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DefaultIfEmpty.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DefaultIfEmpty.cs
index ed4bb89..551e536 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DefaultIfEmpty.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DefaultIfEmpty.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class DefaultIfEmpty<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Defer.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Defer.cs
index ba3dcc4..aa49c12 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Defer.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Defer.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Defer<TValue> : Producer<TValue>, IEvaluatableObservable<TValue>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Delay.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Delay.cs
index 3e2cbba..5ea3d25 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Delay.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Delay.cs
@@ -10,7 +10,7 @@ using System.Threading;
 using System.Reactive.Threading;
 #endif
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Delay<TSource> : Producer<TSource>
     {
@@ -37,7 +37,7 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_scheduler.AsLongRunning() != null)
             {
-                var sink = new λ(this, observer, cancel);
+                var sink = new LongRunningImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -227,9 +227,9 @@ namespace System.Reactive.Linq.Observαble
                 // implementation, the loop below kept running while there was work for immediate dispatch,
                 // potentially causing a long running work item on the target scheduler. With the addition
                 // of long-running scheduling in Rx v2.0, we can check whether the scheduler supports this
-                // interface and perform different processing (see λ). To reduce the code churn in the old
-                // loop code here, we set the shouldYield flag to true after the first dispatch iteration,
-                // in order to break from the loop and enter the recursive scheduling path.
+                // interface and perform different processing (see LongRunningImpl). To reduce the code 
+                // churn in the old loop code here, we set the shouldYield flag to true after the first 
+                // dispatch iteration, in order to break from the loop and enter the recursive scheduling path.
                 //
                 var shouldYield = false;
 
@@ -322,11 +322,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class λ : Sink<TSource>, IObserver<TSource>
+        class LongRunningImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly Delay<TSource> _parent;
 
-            public λ(Delay<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public LongRunningImpl(Delay<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -629,7 +629,7 @@ namespace System.Reactive.Linq.Observαble
                 }
                 else
                 {
-                    _subscription.Disposable = _parent._subscriptionDelay.SubscribeSafe(new σ(this));
+                    _subscription.Disposable = _parent._subscriptionDelay.SubscribeSafe(new SubscriptionDelay(this));
                 }
 
                 return new CompositeDisposable(_subscription, _delays);
@@ -660,7 +660,7 @@ namespace System.Reactive.Linq.Observαble
 
                 var d = new SingleAssignmentDisposable();
                 _delays.Add(d);
-                d.Disposable = delay.SubscribeSafe(new δ(this, value, d));
+                d.Disposable = delay.SubscribeSafe(new Delta(this, value, d));
             }
 
             public void OnError(Exception error)
@@ -692,11 +692,11 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class σ : IObserver<TDelay>
+            class SubscriptionDelay : IObserver<TDelay>
             {
                 private readonly _ _parent;
 
-                public σ(_ parent)
+                public SubscriptionDelay(_ parent)
                 {
                     _parent = parent;
                 }
@@ -718,13 +718,13 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class δ : IObserver<TDelay>
+            class Delta : IObserver<TDelay>
             {
                 private readonly _ _parent;
                 private readonly TSource _value;
                 private readonly IDisposable _self;
 
-                public δ(_ parent, TSource value, IDisposable self)
+                public Delta(_ parent, TSource value, IDisposable self)
                 {
                     _parent = parent;
                     _value = value;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DelaySubscription.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DelaySubscription.cs
index c6a05cc..f5a742a 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DelaySubscription.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DelaySubscription.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Concurrency;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class DelaySubscription<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Dematerialize.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Dematerialize.cs
index 112b156..590ef3b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Dematerialize.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Dematerialize.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Dematerialize<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Distinct.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Distinct.cs
index af20277..bd4b0ca 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Distinct.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Distinct.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Distinct<TSource, TKey> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DistinctUntilChanged.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DistinctUntilChanged.cs
index 10c7923..1ba8f5f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DistinctUntilChanged.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DistinctUntilChanged.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class DistinctUntilChanged<TSource, TKey> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Do.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Do.cs
index 2f73cfa..a4b3747 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Do.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Do.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Do<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DoWhile.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DoWhile.cs
index 3ef40eb..5dc0bc6 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DoWhile.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/DoWhile.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class DoWhile<TSource> : Producer<TSource>, IConcatenatable<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ElementAt.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ElementAt.cs
index b2b1212..0798d3b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ElementAt.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ElementAt.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class ElementAt<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Empty.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Empty.cs
index 42c7241..30a2b65 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Empty.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Empty.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Concurrency;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Empty<TResult> : Producer<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Finally.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Finally.cs
index ca9a5d8..a70ac94 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Finally.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Finally.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Finally<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FirstAsync.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FirstAsync.cs
index 8d8bba7..62da120 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FirstAsync.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FirstAsync.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class FirstAsync<TSource> : Producer<TSource>
     {
@@ -22,7 +22,7 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_predicate != null)
             {
-                var sink = new π(this, observer, cancel);
+                var sink = new FirstAsyncImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -73,11 +73,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<TSource>, IObserver<TSource>
+        class FirstAsyncImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly FirstAsync<TSource> _parent;
 
-            public π(FirstAsync<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public FirstAsyncImpl(FirstAsync<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/For.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/For.cs
index 85b9e03..948f319 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/For.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/For.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class For<TSource, TResult> : Producer<TResult>, IConcatenatable<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ForEach.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ForEach.cs
index 38e112d..9b5c024 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ForEach.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ForEach.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class ForEach<TSource>
     {
@@ -62,7 +62,7 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        public class τ : IObserver<TSource>
+        public class ForEachImpl : IObserver<TSource>
         {
             private readonly Action<TSource, int> _onNext;
             private readonly Action _done;
@@ -71,7 +71,7 @@ namespace System.Reactive.Linq.Observαble
             private Exception _exception;
             private int _stopped;
 
-            public τ(Action<TSource, int> onNext, Action done)
+            public ForEachImpl(Action<TSource, int> onNext, Action done)
             {
                 _onNext = onNext;
                 _done = done;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEvent.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEvent.cs
index 82c4348..90aa779 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEvent.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEvent.cs
@@ -156,7 +156,7 @@ using System.Reactive.Subjects;
 // subject (which is opaque to the event producer). Not to mention that the subject would always be
 // rooted by the target event (even when the FromEvent[Pattern] observable wrapper is unreachable).
 //
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class FromEvent<TDelegate, TEventArgs> : ClassicEventProducer<TDelegate, TEventArgs>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEventPattern.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEventPattern.cs
index 76da050..ca98290 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEventPattern.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/FromEventPattern.cs
@@ -12,23 +12,23 @@ using System.Threading;
 //
 // See FromEvent.cs for more information.
 //
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class FromEventPattern
     {
-        public class τ<TDelegate, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TEventArgs>>
+        public class Impl<TDelegate, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TEventArgs>>
 #if !NO_EVENTARGS_CONSTRAINT
             where TEventArgs : EventArgs
 #endif
         {
             private readonly Func<EventHandler<TEventArgs>, TDelegate> _conversion;
 
-            public τ(Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
+            public Impl(Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
                 : base(addHandler, removeHandler, scheduler)
             {
             }
 
-            public τ(Func<EventHandler<TEventArgs>, TDelegate> conversion, Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
+            public Impl(Func<EventHandler<TEventArgs>, TDelegate> conversion, Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
                 : base(addHandler, removeHandler, scheduler)
             {
                 _conversion = conversion;
@@ -52,12 +52,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        public class τ<TDelegate, TSender, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TSender, TEventArgs>>
+        public class Impl<TDelegate, TSender, TEventArgs> : ClassicEventProducer<TDelegate, EventPattern<TSender, TEventArgs>>
 #if !NO_EVENTARGS_CONSTRAINT
             where TEventArgs : EventArgs
 #endif
         {
-            public τ(Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
+            public Impl(Action<TDelegate> addHandler, Action<TDelegate> removeHandler, IScheduler scheduler)
                 : base(addHandler, removeHandler, scheduler)
             {
             }
@@ -69,7 +69,7 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        public class ρ<TSender, TEventArgs, TResult> : EventProducer<Delegate, TResult>
+        public class Handler<TSender, TEventArgs, TResult> : EventProducer<Delegate, TResult>
         {
             private readonly object _target;
             private readonly Type _delegateType;
@@ -80,7 +80,7 @@ namespace System.Reactive.Linq.Observαble
             private readonly bool _isWinRT;
 #endif
 
-            public ρ(object target, Type delegateType, MethodInfo addMethod, MethodInfo removeMethod, Func<TSender, TEventArgs, TResult> getResult, bool isWinRT, IScheduler scheduler)
+            public Handler(object target, Type delegateType, MethodInfo addMethod, MethodInfo removeMethod, Func<TSender, TEventArgs, TResult> getResult, bool isWinRT, IScheduler scheduler)
                 : base(scheduler)
             {
 #if HAS_WINRT
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Generate.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Generate.cs
index 89ef862..7e46655 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Generate.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Generate.cs
@@ -7,7 +7,7 @@ using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Generate<TState, TResult> : Producer<TResult>
     {
@@ -52,13 +52,13 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_timeSelectorA != null)
             {
-                var sink = new α(this, observer, cancel);
+                var sink = new SelectorA(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
             else if (_timeSelectorR != null)
             {
-                var sink = new δ(this, observer, cancel);
+                var sink = new Delta(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -70,11 +70,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class α : Sink<TResult>
+        class SelectorA : Sink<TResult>
         {
             private readonly Generate<TState, TResult> _parent;
 
-            public α(Generate<TState, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public SelectorA(Generate<TState, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -130,11 +130,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class δ : Sink<TResult>
+        class Delta : Sink<TResult>
         {
             private readonly Generate<TState, TResult> _parent;
 
-            public δ(Generate<TState, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public Delta(Generate<TState, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GetEnumerator.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GetEnumerator.cs
index 05bf20b..a25efa8 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GetEnumerator.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GetEnumerator.cs
@@ -8,7 +8,7 @@ using System.Diagnostics;
 using System.Reactive.Disposables;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class GetEnumerator<TSource> : IEnumerator<TSource>, IObserver<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupBy.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupBy.cs
index 1e64100..4f91030 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupBy.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupBy.cs
@@ -7,20 +7,22 @@ using System.Linq;
 using System.Reactive.Disposables;
 using System.Reactive.Subjects;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class GroupBy<TSource, TKey, TElement> : Producer<IGroupedObservable<TKey, TElement>>
     {
         private readonly IObservable<TSource> _source;
         private readonly Func<TSource, TKey> _keySelector;
         private readonly Func<TSource, TElement> _elementSelector;
+        private readonly int? _capacity;
         private readonly IEqualityComparer<TKey> _comparer;
 
-        public GroupBy(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
+        public GroupBy(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, int? capacity, IEqualityComparer<TKey> comparer)
         {
             _source = source;
             _keySelector = keySelector;
             _elementSelector = elementSelector;
+            _capacity = capacity;
             _comparer = comparer;
         }
 
@@ -49,7 +51,15 @@ namespace System.Reactive.Linq.Observαble
                 : base(observer, cancel)
             {
                 _parent = parent;
-                _map = new Dictionary<TKey, ISubject<TElement>>(_parent._comparer);
+
+                if (_parent._capacity.HasValue)
+                {
+                    _map = new Dictionary<TKey, ISubject<TElement>>(_parent._capacity.Value, _parent._comparer);
+                }
+                else
+                {
+                    _map = new Dictionary<TKey, ISubject<TElement>>(_parent._comparer);
+                }
             }
 
             public void OnNext(TSource value)
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupByUntil.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupByUntil.cs
index 7d91f73..9baf146 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupByUntil.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupByUntil.cs
@@ -1,13 +1,13 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
- #if !NO_PERF
+#if !NO_PERF
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Reactive.Disposables;
 using System.Reactive.Subjects;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class GroupByUntil<TSource, TKey, TElement, TDuration> : Producer<IGroupedObservable<TKey, TElement>>
     {
@@ -15,14 +15,16 @@ namespace System.Reactive.Linq.Observαble
         private readonly Func<TSource, TKey> _keySelector;
         private readonly Func<TSource, TElement> _elementSelector;
         private readonly Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> _durationSelector;
+        private readonly int? _capacity;
         private readonly IEqualityComparer<TKey> _comparer;
 
-        public GroupByUntil(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer)
+        public GroupByUntil(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, int? capacity, IEqualityComparer<TKey> comparer)
         {
             _source = source;
             _keySelector = keySelector;
             _elementSelector = elementSelector;
             _durationSelector = durationSelector;
+            _capacity = capacity;
             _comparer = comparer;
         }
 
@@ -52,7 +54,7 @@ namespace System.Reactive.Linq.Observαble
                 : base(observer, cancel)
             {
                 _parent = parent;
-                _map = new Map<TKey, ISubject<TElement>>(_parent._comparer);
+                _map = new Map<TKey, ISubject<TElement>>(_parent._capacity, _parent._comparer);
                 _nullGate = new object();
             }
 
@@ -127,7 +129,7 @@ namespace System.Reactive.Linq.Observαble
 
                     var md = new SingleAssignmentDisposable();
                     _parent._groupDisposable.Add(md);
-                    md.Disposable = duration.SubscribeSafe(new δ(this, key, writer, md));
+                    md.Disposable = duration.SubscribeSafe(new Delta(this, key, writer, md));
                 }
 
                 var element = default(TElement);
@@ -163,14 +165,14 @@ namespace System.Reactive.Linq.Observαble
                     writer.OnNext(element);
             }
 
-            class δ : IObserver<TDuration>
+            class Delta : IObserver<TDuration>
             {
                 private readonly _ _parent;
                 private readonly TKey _key;
                 private readonly ISubject<TElement> _writer;
                 private readonly IDisposable _self;
 
-                public δ(_ parent, TKey key, ISubject<TElement> writer, IDisposable self)
+                public Delta(_ parent, TKey key, ISubject<TElement> writer, IDisposable self)
                 {
                     _parent = parent;
                     _key = key;
@@ -272,11 +274,38 @@ namespace System.Reactive.Linq.Observαble
 #if !NO_CDS
     class Map<TKey, TValue>
     {
+#if !NO_CDS_COLLECTIONS
+        // Taken from Rx\NET\Source\System.Reactive.Core\Reactive\Internal\ConcurrentDictionary.cs
+
+        // The default concurrency level is DEFAULT_CONCURRENCY_MULTIPLIER * #CPUs. The higher the
+        // DEFAULT_CONCURRENCY_MULTIPLIER, the more concurrent writes can take place without interference
+        // and blocking, but also the more expensive operations that require all locks become (e.g. table
+        // resizing, ToArray, Count, etc). According to brief benchmarks that we ran, 4 seems like a good
+        // compromise.
+        private const int DEFAULT_CONCURRENCY_MULTIPLIER = 4;
+
+        private static int DefaultConcurrencyLevel
+        {
+            get { return DEFAULT_CONCURRENCY_MULTIPLIER * Environment.ProcessorCount; }
+        }
+#endif
+
         private readonly System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue> _map;
 
-        public Map(IEqualityComparer<TKey> comparer)
+        public Map(int? capacity, IEqualityComparer<TKey> comparer)
         {
-            _map = new System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>(comparer);
+            if (capacity.HasValue)
+            {
+#if NO_CDS_COLLECTIONS
+                _map = new System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>(capacity.Value, comparer);
+#else
+                _map = new System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>(DefaultConcurrencyLevel, capacity.Value, comparer);
+#endif
+            }
+            else
+            {
+                _map = new System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>(comparer);
+            }
         }
 
         public TValue GetOrAdd(TKey key, Func<TValue> valueFactory, out bool added)
@@ -327,9 +356,16 @@ namespace System.Reactive.Linq.Observαble
     {
         private readonly Dictionary<TKey, TValue> _map;
 
-        public Map(IEqualityComparer<TKey> comparer)
+        public Map(int? capacity, IEqualityComparer<TKey> comparer)
         {
-            _map = new Dictionary<TKey, TValue>(comparer);
+            if (capacity.HasValue)
+            {
+                _map = new Dictionary<TKey, TValue>(capacity.Value, comparer);
+            }
+            else
+            {
+                _map = new Dictionary<TKey, TValue>(comparer);
+            }
         }
 
         public TValue GetOrAdd(TKey key, Func<TValue> valueFactory, out bool added)
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupJoin.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupJoin.cs
index 66e49be..19c8c45 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupJoin.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/GroupJoin.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
 using System.Reactive.Disposables;
 using System.Reactive.Subjects;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class GroupJoin<TLeft, TRight, TLeftDuration, TRightDuration, TResult> : Producer<TResult>
     {
@@ -68,18 +68,18 @@ namespace System.Reactive.Linq.Observαble
                 _rightID = 0;
                 _rightMap = new Dictionary<int, TRight>();
 
-                leftSubscription.Disposable = _parent._left.SubscribeSafe(new λ(this, leftSubscription));
-                rightSubscription.Disposable = _parent._right.SubscribeSafe(new ρ(this, rightSubscription));
+                leftSubscription.Disposable = _parent._left.SubscribeSafe(new LeftObserver(this, leftSubscription));
+                rightSubscription.Disposable = _parent._right.SubscribeSafe(new RightObserver(this, rightSubscription));
 
                 return _refCount;
             }
 
-            class λ : IObserver<TLeft>
+            class LeftObserver : IObserver<TLeft>
             {
                 private readonly _ _parent;
                 private readonly IDisposable _self;
 
-                public λ(_ parent, IDisposable self)
+                public LeftObserver(_ parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -122,7 +122,7 @@ namespace System.Reactive.Linq.Observαble
                     }
 
                     // BREAKING CHANGE v2 > v1.x - The duration sequence is subscribed to before the result sequence is evaluated.
-                    md.Disposable = duration.SubscribeSafe(new δ(this, id, s, md));
+                    md.Disposable = duration.SubscribeSafe(new Delta(this, id, s, md));
 
                     var result = default(TResult);
                     try
@@ -146,14 +146,14 @@ namespace System.Reactive.Linq.Observαble
                     }
                 }
 
-                class δ : IObserver<TLeftDuration>
+                class Delta : IObserver<TLeftDuration>
                 {
-                    private readonly λ _parent;
+                    private readonly LeftObserver _parent;
                     private readonly int _id;
                     private readonly IObserver<TRight> _group;
                     private readonly IDisposable _self;
 
-                    public δ(λ parent, int id, IObserver<TRight> group, IDisposable self)
+                    public Delta(LeftObserver parent, int id, IObserver<TRight> group, IDisposable self)
                     {
                         _parent = parent;
                         _id = id;
@@ -201,12 +201,12 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class ρ : IObserver<TRight>
+            class RightObserver : IObserver<TRight>
             {
                 private readonly _ _parent;
                 private readonly IDisposable _self;
 
-                public ρ(_ parent, IDisposable self)
+                public RightObserver(_ parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -242,7 +242,7 @@ namespace System.Reactive.Linq.Observαble
                         OnError(exception);
                         return;
                     }
-                    md.Disposable = duration.SubscribeSafe(new δ(this, id, md));
+                    md.Disposable = duration.SubscribeSafe(new Delta(this, id, md));
 
                     lock (_parent._gate)
                     {
@@ -251,13 +251,13 @@ namespace System.Reactive.Linq.Observαble
                     }
                 }
 
-                class δ : IObserver<TRightDuration>
+                class Delta : IObserver<TRightDuration>
                 {
-                    private readonly ρ _parent;
+                    private readonly RightObserver _parent;
                     private readonly int _id;
                     private readonly IDisposable _self;
 
-                    public δ(ρ parent, int id, IDisposable self)
+                    public Delta(RightObserver parent, int id, IDisposable self)
                     {
                         _parent = parent;
                         _id = id;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/If.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/If.cs
index 8b1804a..8740c32 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/If.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/If.cs
@@ -5,7 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class If<TResult> : Producer<TResult>, IEvaluatableObservable<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IgnoreElements.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IgnoreElements.cs
index 65441bd..1f932ac 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IgnoreElements.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IgnoreElements.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class IgnoreElements<TSource> : Producer<TSource>
     {
@@ -14,7 +14,7 @@ namespace System.Reactive.Linq.Observαble
             _source = source;
         }
 
-        public IObservable<TSource> Ω()
+        public IObservable<TSource> Omega()
         {
             return this;
         }
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IsEmpty.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IsEmpty.cs
index 674c6f8..722750e 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IsEmpty.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/IsEmpty.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class IsEmpty<TSource> : Producer<bool>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Join.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Join.cs
index 13e6ad2..4d22d34 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Join.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Join.cs
@@ -5,7 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Join<TLeft, TRight, TLeftDuration, TRightDuration, TResult> : Producer<TResult>
     {
@@ -69,18 +69,18 @@ namespace System.Reactive.Linq.Observαble
                 _rightID = 0;
                 _rightMap = new Dictionary<int, TRight>();
 
-                leftSubscription.Disposable = _parent._left.SubscribeSafe(new λ(this, leftSubscription));
-                rightSubscription.Disposable = _parent._right.SubscribeSafe(new ρ(this, rightSubscription));
+                leftSubscription.Disposable = _parent._left.SubscribeSafe(new LeftObserver(this, leftSubscription));
+                rightSubscription.Disposable = _parent._right.SubscribeSafe(new RightObserver(this, rightSubscription));
 
                 return _group;
             }
 
-            class λ : IObserver<TLeft>
+            class LeftObserver : IObserver<TLeft>
             {
                 private readonly _ _parent;
                 private readonly IDisposable _self;
 
-                public λ(_ parent, IDisposable self)
+                public LeftObserver(_ parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -124,7 +124,7 @@ namespace System.Reactive.Linq.Observαble
                         return;
                     }
 
-                    md.Disposable = duration.SubscribeSafe(new δ(this, id, md));
+                    md.Disposable = duration.SubscribeSafe(new Delta(this, id, md));
 
                     lock (_parent._gate)
                     {
@@ -147,13 +147,13 @@ namespace System.Reactive.Linq.Observαble
                     }
                 }
 
-                class δ : IObserver<TLeftDuration>
+                class Delta : IObserver<TLeftDuration>
                 {
-                    private readonly λ _parent;
+                    private readonly LeftObserver _parent;
                     private readonly int _id;
                     private readonly IDisposable _self;
 
-                    public δ(λ parent, int id, IDisposable self)
+                    public Delta(LeftObserver parent, int id, IDisposable self)
                     {
                         _parent = parent;
                         _id = id;
@@ -203,12 +203,12 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class ρ : IObserver<TRight>
+            class RightObserver : IObserver<TRight>
             {
                 private readonly _ _parent;
                 private readonly IDisposable _self;
 
-                public ρ(_ parent, IDisposable self)
+                public RightObserver(_ parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -252,7 +252,7 @@ namespace System.Reactive.Linq.Observαble
                         return;
                     }
 
-                    md.Disposable = duration.SubscribeSafe(new δ(this, id, md));
+                    md.Disposable = duration.SubscribeSafe(new Delta(this, id, md));
 
                     lock (_parent._gate)
                     {
@@ -275,13 +275,13 @@ namespace System.Reactive.Linq.Observαble
                     }
                 }
 
-                class δ : IObserver<TRightDuration>
+                class Delta : IObserver<TRightDuration>
                 {
-                    private readonly ρ _parent;
+                    private readonly RightObserver _parent;
                     private readonly int _id;
                     private readonly IDisposable _self;
 
-                    public δ(ρ parent, int id, IDisposable self)
+                    public Delta(RightObserver parent, int id, IDisposable self)
                     {
                         _parent = parent;
                         _id = id;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LastAsync.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LastAsync.cs
index 1ecd930..0a77d32 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LastAsync.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LastAsync.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class LastAsync<TSource> : Producer<TSource>
     {
@@ -22,7 +22,7 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_predicate != null)
             {
-                var sink = new π(this, observer, cancel);
+                var sink = new LastAsyncImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -77,13 +77,13 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<TSource>, IObserver<TSource>
+        class LastAsyncImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly LastAsync<TSource> _parent;
             private TSource _value;
             private bool _seenValue;
 
-            public π(LastAsync<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public LastAsyncImpl(LastAsync<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Latest.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Latest.cs
index 2699797..bc92e6d 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Latest.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Latest.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
 using System.Reactive.Threading;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Latest<TSource> : PushToPullAdapter<TSource, TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LongCount.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LongCount.cs
index 0108e18..63c9f24 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LongCount.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/LongCount.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class LongCount<TSource> : Producer<long>
     {
@@ -31,7 +31,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new π(this, observer, cancel);
+                var sink = new LongCountImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -77,12 +77,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<long>, IObserver<TSource>
+        class LongCountImpl : Sink<long>, IObserver<TSource>
         {
             private readonly LongCount<TSource> _parent;
             private long _count;
 
-            public π(LongCount<TSource> parent, IObserver<long> observer, IDisposable cancel)
+            public LongCountImpl(LongCount<TSource> parent, IObserver<long> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Materialize.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Materialize.cs
index 102267d..fa8e1ee 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Materialize.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Materialize.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Materialize<TSource> : Producer<Notification<TSource>>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Max.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Max.cs
index da339da..8e86e75 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Max.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Max.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Max<TSource> : Producer<TSource>
     {
@@ -28,19 +28,19 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new δ(this, observer, cancel);
+                var sink = new Delta(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
         }
 
-        class δ : Sink<TSource>, IObserver<TSource>
+        class Delta : Sink<TSource>, IObserver<TSource>
         {
             private readonly Max<TSource> _parent;
             private bool _hasValue;
             private TSource _lastValue;
 
-            public δ(Max<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public Delta(Max<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MaxBy.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MaxBy.cs
index 52a9a42..4bf97f5 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MaxBy.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MaxBy.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class MaxBy<TSource, TKey> : Producer<IList<TSource>>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Merge.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Merge.cs
index a27c3c3..dd710cb 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Merge.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Merge.cs
@@ -10,7 +10,7 @@ using System.Threading;
 using System.Threading.Tasks;
 #endif
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Merge<TSource> : Producer<TSource>
     {
@@ -41,14 +41,14 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_maxConcurrent > 0)
             {
-                var sink = new μ(this, observer, cancel);
+                var sink = new MergeConcurrent(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
 #if !NO_TPL
             else if (_sourcesT != null)
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new MergeImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -93,7 +93,7 @@ namespace System.Reactive.Linq.Observαble
             {
                 var innerSubscription = new SingleAssignmentDisposable();
                 _group.Add(innerSubscription);
-                innerSubscription.Disposable = value.SubscribeSafe(new ι(this, innerSubscription));
+                innerSubscription.Disposable = value.SubscribeSafe(new Iter(this, innerSubscription));
             }
 
             public void OnError(Exception error)
@@ -129,12 +129,12 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class ι : IObserver<TSource>
+            class Iter : IObserver<TSource>
             {
                 private readonly _ _parent;
                 private readonly IDisposable _self;
 
-                public ι(_ parent, IDisposable self)
+                public Iter(_ parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -177,11 +177,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class μ : Sink<TSource>, IObserver<IObservable<TSource>>
+        class MergeConcurrent : Sink<TSource>, IObserver<IObservable<TSource>>
         {
             private readonly Merge<TSource> _parent;
 
-            public μ(Merge<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public MergeConcurrent(Merge<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -253,15 +253,15 @@ namespace System.Reactive.Linq.Observαble
             {
                 var subscription = new SingleAssignmentDisposable();
                 _group.Add(subscription);
-                subscription.Disposable = innerSource.SubscribeSafe(new ι(this, subscription));
+                subscription.Disposable = innerSource.SubscribeSafe(new Iter(this, subscription));
             }
 
-            class ι : IObserver<TSource>
+            class Iter : IObserver<TSource>
             {
-                private readonly μ _parent;
+                private readonly MergeConcurrent _parent;
                 private readonly IDisposable _self;
 
-                public ι(μ parent, IDisposable self)
+                public Iter(MergeConcurrent parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -308,11 +308,11 @@ namespace System.Reactive.Linq.Observαble
 
 #if !NO_TPL
 #pragma warning disable 0420
-        class τ : Sink<TSource>, IObserver<Task<TSource>>
+        class MergeImpl : Sink<TSource>, IObserver<Task<TSource>>
         {
             private readonly Merge<TSource> _parent;
 
-            public τ(Merge<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public MergeImpl(Merge<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Min.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Min.cs
index f7b6197..fc08002 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Min.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Min.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Min<TSource> : Producer<TSource>
     {
@@ -28,19 +28,19 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new δ(this, observer, cancel);
+                var sink = new Delta(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
         }
 
-        class δ : Sink<TSource>, IObserver<TSource>
+        class Delta : Sink<TSource>, IObserver<TSource>
         {
             private readonly Min<TSource> _parent;
             private bool _hasValue;
             private TSource _lastValue;
 
-            public δ(Min<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public Delta(Min<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MinBy.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MinBy.cs
index a32bf92..d9c93f6 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MinBy.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MinBy.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class MinBy<TSource, TKey> : Producer<IList<TSource>>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MostRecent.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MostRecent.cs
index 937d811..7311a33 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MostRecent.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/MostRecent.cs
@@ -5,7 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class MostRecent<TSource> : PushToPullAdapter<TSource, TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Multicast.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Multicast.cs
index 4a77300..ee163a5 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Multicast.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Multicast.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Disposables;
 using System.Reactive.Subjects;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Multicast<TSource, TIntermediate, TResult> : Producer<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Never.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Never.cs
index a9adc52..eae632f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Never.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Never.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Never<TResult> : IObservable<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Next.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Next.cs
index 2d4ec45..4b20276 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Next.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Next.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
 using System.Reactive.Threading;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Next<TSource> : PushToPullAdapter<TSource, TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ObserveOn.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ObserveOn.cs
index d5d7428..eaf7613 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ObserveOn.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ObserveOn.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class ObserveOn<TSource> : Producer<TSource>
     {
@@ -33,7 +33,7 @@ namespace System.Reactive.Linq.Observαble
 #if !NO_SYNCCTX
             if (_context != null)
             {
-                var sink = new ς(this, observer, cancel);
+                var sink = new ObserveOnImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.Subscribe(sink);
             }
@@ -47,11 +47,11 @@ namespace System.Reactive.Linq.Observαble
         }
 
 #if !NO_SYNCCTX
-        class ς : Sink<TSource>, IObserver<TSource>
+        class ObserveOnImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly ObserveOn<TSource> _parent;
 
-            public ς(ObserveOn<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public ObserveOnImpl(ObserveOn<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OfType.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OfType.cs
index 07e4515..27a0ca3 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OfType.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OfType.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class OfType<TSource, TResult> : Producer<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OnErrorResumeNext.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OnErrorResumeNext.cs
index 26dfd34..077a23f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OnErrorResumeNext.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/OnErrorResumeNext.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class OnErrorResumeNext<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/PushToPullAdapter.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/PushToPullAdapter.cs
index 916d12b..6351365b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/PushToPullAdapter.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/PushToPullAdapter.cs
@@ -5,7 +5,7 @@ using System.Collections;
 using System.Collections.Generic;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     abstract class PushToPullAdapter<TSource, TResult> : IEnumerable<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Range.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Range.cs
index c58d94c..414ae72 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Range.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Range.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Range : Producer<int>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/RefCount.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/RefCount.cs
index 1762807..4efb917 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/RefCount.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/RefCount.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Disposables;
 using System.Reactive.Subjects;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class RefCount<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Repeat.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Repeat.cs
index fab0607..4f418cb 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Repeat.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Repeat.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Repeat<TResult> : Producer<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Return.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Return.cs
index cd9ad02..db98f88 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Return.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Return.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Concurrency;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Return<TResult> : Producer<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sample.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sample.cs
index 0d46c62..6d0e68b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sample.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sample.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Sample<TSource, TSample> : Producer<TSource>
     {
@@ -51,7 +51,7 @@ namespace System.Reactive.Linq.Observαble
                 _sourceSubscription = sourceSubscription;
                 sourceSubscription.Disposable = _parent._source.SubscribeSafe(this);
 
-                var samplerSubscription = _parent._sampler.SubscribeSafe(new σ(this));
+                var samplerSubscription = _parent._sampler.SubscribeSafe(new SampleImpl(this));
 
                 return new CompositeDisposable(_sourceSubscription, samplerSubscription);
             }
@@ -83,11 +83,11 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class σ : IObserver<TSample>
+            class SampleImpl : IObserver<TSample>
             {
                 private readonly _ _parent;
 
-                public σ(_ parent)
+                public SampleImpl(_ parent)
                 {
                     _parent = parent;
                 }
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Scan.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Scan.cs
index 6c8f2fe..421177f 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Scan.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Scan.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Scan<TSource, TAccumulate> : Producer<TAccumulate>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Select.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Select.cs
index e853210..330fe3a 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Select.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Select.cs
@@ -3,11 +3,11 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     abstract class Select<TResult> : Producer<TResult>
     {
-        public abstract IObservable<TResult2> Ω<TResult2>(Func<TResult, TResult2> selector);
+        public abstract IObservable<TResult2> Omega<TResult2>(Func<TResult, TResult2> selector);
     }
 
     class Select<TSource, TResult> : Select<TResult>
@@ -28,7 +28,7 @@ namespace System.Reactive.Linq.Observαble
             _selectorI = selector;
         }
 
-        public override IObservable<TResult2> Ω<TResult2>(Func<TResult, TResult2> selector)
+        public override IObservable<TResult2> Omega<TResult2>(Func<TResult, TResult2> selector)
         {
             if (_selector != null)
                 return new Select<TSource, TResult2>(_source, x => selector(_selector(x)));
@@ -46,7 +46,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new SelectImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -92,12 +92,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<TResult>, IObserver<TSource>
+        class SelectImpl : Sink<TResult>, IObserver<TSource>
         {
             private readonly Select<TSource, TResult> _parent;
             private int _index;
 
-            public τ(Select<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public SelectImpl(Select<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SelectMany.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SelectMany.cs
index 054f974..49d7cf9 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SelectMany.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SelectMany.cs
@@ -1,9 +1,7 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
 #if !NO_PERF
-using System;
 using System.Collections.Generic;
-using System.Reactive;
 using System.Reactive.Disposables;
 
 #if !NO_TPL
@@ -11,17 +9,17 @@ using System.Threading;
 using System.Threading.Tasks;
 #endif
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class SelectMany<TSource, TCollection, TResult> : Producer<TResult>
     {
         private readonly IObservable<TSource> _source;
         private readonly Func<TSource, IObservable<TCollection>> _collectionSelector;
-        private readonly Func<TSource, int, IObservable<TCollection>> _collectionSelectorWithIndex;
+        private readonly Func<TSource, int, IObservable<TCollection>> _collectionSelectorI;
         private readonly Func<TSource, IEnumerable<TCollection>> _collectionSelectorE;
-        private readonly Func<TSource, int, IEnumerable<TCollection>> _collectionSelectorEWithIndex;
+        private readonly Func<TSource, int, IEnumerable<TCollection>> _collectionSelectorEI;
         private readonly Func<TSource, TCollection, TResult> _resultSelector;
-        private readonly Func<TSource, int, TCollection, int, TResult> _resultSelectorWithIndex;
+        private readonly Func<TSource, int, TCollection, int, TResult> _resultSelectorI;
 
         public SelectMany(IObservable<TSource> source, Func<TSource, IObservable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
         {
@@ -33,8 +31,8 @@ namespace System.Reactive.Linq.Observαble
         public SelectMany(IObservable<TSource> source, Func<TSource, int, IObservable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector)
         {
             _source = source;
-            _collectionSelectorWithIndex = collectionSelector;
-            _resultSelectorWithIndex = resultSelector;
+            _collectionSelectorI = collectionSelector;
+            _resultSelectorI = resultSelector;
         }
 
         public SelectMany(IObservable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
@@ -47,12 +45,14 @@ namespace System.Reactive.Linq.Observαble
         public SelectMany(IObservable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector)
         {
             _source = source;
-            _collectionSelectorEWithIndex = collectionSelector;
-            _resultSelectorWithIndex = resultSelector;
+            _collectionSelectorEI = collectionSelector;
+            _resultSelectorI = resultSelector;
         }
 
 #if !NO_TPL
         private readonly Func<TSource, CancellationToken, Task<TCollection>> _collectionSelectorT;
+        private readonly Func<TSource, int, CancellationToken, Task<TCollection>> _collectionSelectorTI;
+        private readonly Func<TSource, int, TCollection, TResult> _resultSelectorTI;
 
         public SelectMany(IObservable<TSource> source, Func<TSource, CancellationToken, Task<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
         {
@@ -60,27 +60,52 @@ namespace System.Reactive.Linq.Observαble
             _collectionSelectorT = collectionSelector;
             _resultSelector = resultSelector;
         }
+
+        public SelectMany(IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TCollection>> collectionSelector, Func<TSource, int, TCollection, TResult> resultSelector)
+        {
+            _source = source;
+            _collectionSelectorTI = collectionSelector;
+            _resultSelectorTI = resultSelector;
+        }
 #endif
 
         protected override IDisposable Run(IObserver<TResult> observer, IDisposable cancel, Action<IDisposable> setSink)
         {
-            if (_collectionSelector != null || _collectionSelectorWithIndex != null)
+            if (_collectionSelector != null)
             {
                 var sink = new _(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
+            else if (_collectionSelectorI != null)
+            {
+                var sink = new IndexSelectorImpl(this, observer, cancel);
+                setSink(sink);
+                return sink.Run();
+            }
 #if !NO_TPL
             else if (_collectionSelectorT != null)
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new SelectManyImpl(this, observer, cancel);
+                setSink(sink);
+                return sink.Run();
+            }
+            else if (_collectionSelectorTI != null)
+            {
+                var sink = new Sigma(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
 #endif
+            else if (_collectionSelectorE != null)
+            {
+                var sink = new NoSelectorImpl(this, observer, cancel);
+                setSink(sink);
+                return _source.SubscribeSafe(sink);
+            }
             else
             {
-                var sink = new ε(this, observer, cancel);
+                var sink = new Omega(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -94,14 +119,12 @@ namespace System.Reactive.Linq.Observαble
                 : base(observer, cancel)
             {
                 _parent = parent;
-                _indexInSource = -1;
             }
 
             private object _gate;
             private bool _isStopped;
             private CompositeDisposable _group;
             private SingleAssignmentDisposable _sourceSubscription;
-            private int _indexInSource;
 
             public IDisposable Run()
             {
@@ -122,13 +145,7 @@ namespace System.Reactive.Linq.Observαble
 
                 try
                 {
-                    if (_parent._collectionSelector != null)
-                        collection = _parent._collectionSelector(value);
-                    else
-                    {
-                        checked { _indexInSource++; }
-                        collection = _parent._collectionSelectorWithIndex(value, _indexInSource);
-                    }
+                    collection = _parent._collectionSelector(value);
                 }
                 catch (Exception ex)
                 {
@@ -142,7 +159,7 @@ namespace System.Reactive.Linq.Observαble
 
                 var innerSubscription = new SingleAssignmentDisposable();
                 _group.Add(innerSubscription);
-                innerSubscription.Disposable = collection.SubscribeSafe(new ι(this, value, innerSubscription, _indexInSource));
+                innerSubscription.Disposable = collection.SubscribeSafe(new Iter(this, value, innerSubscription));
             }
 
             public void OnError(Exception error)
@@ -178,21 +195,17 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class ι : IObserver<TCollection>
+            class Iter : IObserver<TCollection>
             {
                 private readonly _ _parent;
                 private readonly TSource _value;
                 private readonly IDisposable _self;
-                private int _indexInSource;
-				private int _indexInIntermediate = -1;
 
-                public ι(_ parent, TSource value, IDisposable self, int indexInSource)
+                public Iter(_ parent, TSource value, IDisposable self)
                 {
                     _parent = parent;
                     _value = value;
                     _self = self;
-                    _indexInSource = indexInSource;
-					_indexInIntermediate = -1;
                 }
 
                 public void OnNext(TCollection value)
@@ -201,14 +214,164 @@ namespace System.Reactive.Linq.Observαble
 
                     try
                     {
-                        if (_parent._parent._resultSelector != null)
-                            res = _parent._parent._resultSelector(_value, value);
-                        else
+                        res = _parent._parent._resultSelector(_value, value);
+                    }
+                    catch (Exception ex)
+                    {
+                        lock (_parent._gate)
+                        {
+                            _parent._observer.OnError(ex);
+                            _parent.Dispose();
+                        }
+                        return;
+                    }
+
+                    lock (_parent._gate)
+                        _parent._observer.OnNext(res);
+                }
+
+                public void OnError(Exception error)
+                {
+                    lock (_parent._gate)
+                    {
+                        _parent._observer.OnError(error);
+                        _parent.Dispose();
+                    }
+                }
+
+                public void OnCompleted()
+                {
+                    _parent._group.Remove(_self);
+                    if (_parent._isStopped && _parent._group.Count == 1)
+                    {
+                        //
+                        // Notice there can be a race between OnCompleted of the source and any
+                        // of the inner sequences, where both see _group.Count == 1, and one is
+                        // waiting for the lock. There won't be a double OnCompleted observation
+                        // though, because the call to Dispose silences the observer by swapping
+                        // in a NopObserver<T>.
+                        //
+                        lock (_parent._gate)
                         {
-                            checked { _indexInIntermediate++; }
-                            res = _parent._parent._resultSelectorWithIndex(_value, _indexInSource, value, _indexInIntermediate);
+                            _parent._observer.OnCompleted();
+                            _parent.Dispose();
                         }
                     }
+                }
+            }
+        }
+
+        class IndexSelectorImpl : Sink<TResult>, IObserver<TSource>
+        {
+            private readonly SelectMany<TSource, TCollection, TResult> _parent;
+
+            public IndexSelectorImpl(SelectMany<TSource, TCollection, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+                : base(observer, cancel)
+            {
+                _parent = parent;
+            }
+
+            private object _gate;
+            private bool _isStopped;
+            private CompositeDisposable _group;
+            private SingleAssignmentDisposable _sourceSubscription;
+            private int _index;
+
+            public IDisposable Run()
+            {
+                _gate = new object();
+                _isStopped = false;
+                _group = new CompositeDisposable();
+
+                _sourceSubscription = new SingleAssignmentDisposable();
+                _group.Add(_sourceSubscription);
+                _sourceSubscription.Disposable = _parent._source.SubscribeSafe(this);
+
+                return _group;
+            }
+
+            public void OnNext(TSource value)
+            {
+                var index = checked(_index++);
+                var collection = default(IObservable<TCollection>);
+
+                try
+                {
+                    collection = _parent._collectionSelectorI(value, index);
+                }
+                catch (Exception ex)
+                {
+                    lock (_gate)
+                    {
+                        base._observer.OnError(ex);
+                        base.Dispose();
+                    }
+                    return;
+                }
+
+                var innerSubscription = new SingleAssignmentDisposable();
+                _group.Add(innerSubscription);
+                innerSubscription.Disposable = collection.SubscribeSafe(new Iter(this, value, index, innerSubscription));
+            }
+
+            public void OnError(Exception error)
+            {
+                lock (_gate)
+                {
+                    base._observer.OnError(error);
+                    base.Dispose();
+                }
+            }
+
+            public void OnCompleted()
+            {
+                _isStopped = true;
+                if (_group.Count == 1)
+                {
+                    //
+                    // Notice there can be a race between OnCompleted of the source and any
+                    // of the inner sequences, where both see _group.Count == 1, and one is
+                    // waiting for the lock. There won't be a double OnCompleted observation
+                    // though, because the call to Dispose silences the observer by swapping
+                    // in a NopObserver<T>.
+                    //
+                    lock (_gate)
+                    {
+                        base._observer.OnCompleted();
+                        base.Dispose();
+                    }
+                }
+                else
+                {
+                    _sourceSubscription.Dispose();
+                }
+            }
+
+            class Iter : IObserver<TCollection>
+            {
+                private readonly IndexSelectorImpl _parent;
+                private readonly TSource _value;
+                private readonly int _valueIndex;
+                private readonly IDisposable _self;
+
+                public Iter(IndexSelectorImpl parent, TSource value, int index, IDisposable self)
+                {
+                    _parent = parent;
+                    _value = value;
+                    _valueIndex = index;
+                    _self = self;
+                }
+
+                private int _index;
+
+                public void OnNext(TCollection value)
+                {
+                    var res = default(TResult);
+
+                    try
+                    {
+                        res = _parent._parent._resultSelectorI(_value, _valueIndex, value, checked(_index++));
+                    }
                     catch (Exception ex)
                     {
                         lock (_parent._gate)
@@ -254,16 +417,14 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class ε : Sink<TResult>, IObserver<TSource>
+        class NoSelectorImpl : Sink<TResult>, IObserver<TSource>
         {
             private readonly SelectMany<TSource, TCollection, TResult> _parent;
-            private int _indexInSource;   // The "Weird SelectMany" requires indices in the original collection as well as an intermediate collection
 
-            public ε(SelectMany<TSource, TCollection, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public NoSelectorImpl(SelectMany<TSource, TCollection, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
-                _indexInSource = -1;
             }
 
             public void OnNext(TSource value)
@@ -271,14 +432,93 @@ namespace System.Reactive.Linq.Observαble
                 var xs = default(IEnumerable<TCollection>);
                 try
                 {
-                    if (_parent._collectionSelectorE != null)
-                        xs = _parent._collectionSelectorE(value);
-                    else
+                    xs = _parent._collectionSelectorE(value);
+                }
+                catch (Exception exception)
+                {
+                    base._observer.OnError(exception);
+                    base.Dispose();
+                    return;
+                }
+
+                var e = default(IEnumerator<TCollection>);
+                try
+                {
+                    e = xs.GetEnumerator();
+                }
+                catch (Exception exception)
+                {
+                    base._observer.OnError(exception);
+                    base.Dispose();
+                    return;
+                }
+
+                try
+                {
+                    var hasNext = true;
+                    while (hasNext)
                     {
-                        checked { _indexInSource++; }
-                        xs = _parent._collectionSelectorEWithIndex(value, _indexInSource);
+                        hasNext = false;
+                        var current = default(TResult);
+
+                        try
+                        {
+                            hasNext = e.MoveNext();
+                            if (hasNext)
+                                current = _parent._resultSelector(value, e.Current);
+                        }
+                        catch (Exception exception)
+                        {
+                            base._observer.OnError(exception);
+                            base.Dispose();
+                            return;
+                        }
+
+                        if (hasNext)
+                            base._observer.OnNext(current);
                     }
                 }
+                finally
+                {
+                    if (e != null)
+                        e.Dispose();
+                }
+            }
+
+            public void OnError(Exception error)
+            {
+                base._observer.OnError(error);
+                base.Dispose();
+            }
+
+            public void OnCompleted()
+            {
+                base._observer.OnCompleted();
+                base.Dispose();
+            }
+        }
+
+        class Omega : Sink<TResult>, IObserver<TSource>
+        {
+            private readonly SelectMany<TSource, TCollection, TResult> _parent;
+
+            public Omega(SelectMany<TSource, TCollection, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+                : base(observer, cancel)
+            {
+                _parent = parent;
+            }
+
+            private int _index;
+
+            public void OnNext(TSource value)
+            {
+                var index = checked(_index++);
+
+                var xs = default(IEnumerable<TCollection>);
+                try
+                {
+                    xs = _parent._collectionSelectorEI(value, index);
+                }
                 catch (Exception exception)
                 {
                     base._observer.OnError(exception);
@@ -300,7 +540,7 @@ namespace System.Reactive.Linq.Observαble
 
                 try
                 {
-                    int indexInIntermediate = -1;
+                    var eIndex = 0;
                     var hasNext = true;
                     while (hasNext)
                     {
@@ -311,15 +551,7 @@ namespace System.Reactive.Linq.Observαble
                         {
                             hasNext = e.MoveNext();
                             if (hasNext)
-                            {
-                                if (_parent._resultSelector != null)
-                                    current = _parent._resultSelector(value, e.Current);
-                                else
-                                {
-                                    checked { indexInIntermediate++; }
-                                    current = _parent._resultSelectorWithIndex(value, _indexInSource, e.Current, indexInIntermediate);
-                                }
-                            }
+                                current = _parent._resultSelectorI(value, index, e.Current, checked(eIndex++));
                         }
                         catch (Exception exception)
                         {
@@ -354,11 +586,11 @@ namespace System.Reactive.Linq.Observαble
 
 #if !NO_TPL
 #pragma warning disable 0420
-        class τ : Sink<TResult>, IObserver<TSource>
+        class SelectManyImpl : Sink<TResult>, IObserver<TSource>
         {
             private readonly SelectMany<TSource, TCollection, TResult> _parent;
 
-            public τ(SelectMany<TSource, TCollection, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public SelectManyImpl(SelectMany<TSource, TCollection, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -487,48 +719,183 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
         }
-#pragma warning restore 0420
-#endif
-    }
-
-    class SelectMany<TSource, TResult> : Producer<TResult>
-    {
-        private readonly IObservable<TSource> _source;
-        private readonly Func<TSource, IObservable<TResult>> _selector;
-        private readonly Func<Exception, IObservable<TResult>> _selectorOnError;
-        private readonly Func<IObservable<TResult>> _selectorOnCompleted;
-        private readonly Func<TSource, int, IObservable<TResult>> _selectorWithIndex;
-        private readonly Func<Exception, int, IObservable<TResult>> _selectorWithIndexOnError;
-        private readonly Func<int, IObservable<TResult>> _selectorWithIndexOnCompleted;
-        private readonly Func<TSource, IEnumerable<TResult>> _selectorE;
-        private readonly Func<TSource, int, IEnumerable<TResult>> _selectorEWithIndex;
 
-        public SelectMany(IObservable<TSource> source, Func<TSource, IObservable<TResult>> selector)
+        class Sigma : Sink<TResult>, IObserver<TSource>
         {
-            _source = source;
-            _selector = selector;
+            private readonly SelectMany<TSource, TCollection, TResult> _parent;
+
+            public Sigma(SelectMany<TSource, TCollection, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+                : base(observer, cancel)
+            {
+                _parent = parent;
+            }
+
+            private object _gate;
+            private CancellationDisposable _cancel;
+            private volatile int _count;
+            private int _index;
+
+            public IDisposable Run()
+            {
+                _gate = new object();
+                _cancel = new CancellationDisposable();
+                _count = 1;
+
+                return new CompositeDisposable(_parent._source.SubscribeSafe(this), _cancel);
+            }
+
+            public void OnNext(TSource value)
+            {
+                var index = checked(_index++);
+
+                var task = default(Task<TCollection>);
+                try
+                {
+                    Interlocked.Increment(ref _count);
+                    task = _parent._collectionSelectorTI(value, index, _cancel.Token);
+                }
+                catch (Exception ex)
+                {
+                    lock (_gate)
+                    {
+                        base._observer.OnError(ex);
+                        base.Dispose();
+                    }
+
+                    return;
+                }
+
+                if (task.IsCompleted)
+                {
+                    OnCompletedTask(value, index, task);
+                }
+                else
+                {
+                    AttachContinuation(value, index, task);
+                }
+            }
+
+            private void AttachContinuation(TSource value, int index, Task<TCollection> task)
+            {
+                //
+                // Separate method to avoid closure in synchronous completion case.
+                //
+                task.ContinueWith(t => OnCompletedTask(value, index, t));
+            }
+
+            private void OnCompletedTask(TSource value, int index, Task<TCollection> task)
+            {
+                switch (task.Status)
+                {
+                    case TaskStatus.RanToCompletion:
+                        {
+                            var res = default(TResult);
+                            try
+                            {
+                                res = _parent._resultSelectorTI(value, index, task.Result);
+                            }
+                            catch (Exception ex)
+                            {
+                                lock (_gate)
+                                {
+                                    base._observer.OnError(ex);
+                                    base.Dispose();
+                                }
+
+                                return;
+                            }
+
+                            lock (_gate)
+                                base._observer.OnNext(res);
+
+                            OnCompleted();
+                        }
+                        break;
+                    case TaskStatus.Faulted:
+                        {
+                            lock (_gate)
+                            {
+                                base._observer.OnError(task.Exception.InnerException);
+                                base.Dispose();
+                            }
+                        }
+                        break;
+                    case TaskStatus.Canceled:
+                        {
+                            if (!_cancel.IsDisposed)
+                            {
+                                lock (_gate)
+                                {
+                                    base._observer.OnError(new TaskCanceledException(task));
+                                    base.Dispose();
+                                }
+                            }
+                        }
+                        break;
+                }
+            }
+
+            public void OnError(Exception error)
+            {
+                lock (_gate)
+                {
+                    base._observer.OnError(error);
+                    base.Dispose();
+                }
+            }
+
+            public void OnCompleted()
+            {
+                if (Interlocked.Decrement(ref _count) == 0)
+                {
+                    lock (_gate)
+                    {
+                        base._observer.OnCompleted();
+                        base.Dispose();
+                    }
+                }
+            }
         }
+#pragma warning restore 0420
+#endif
+    }
 
-        public SelectMany(IObservable<TSource> source, Func<TSource, IObservable<TResult>> selector, Func<Exception, IObservable<TResult>> selectorOnError, Func<IObservable<TResult>> selectorOnCompleted)
+    class SelectMany<TSource, TResult> : Producer<TResult>
+    {
+        private readonly IObservable<TSource> _source;
+        private readonly Func<TSource, IObservable<TResult>> _selector;
+        private readonly Func<TSource, int, IObservable<TResult>> _selectorI;
+        private readonly Func<Exception, IObservable<TResult>> _selectorOnError;
+        private readonly Func<IObservable<TResult>> _selectorOnCompleted;
+        private readonly Func<TSource, IEnumerable<TResult>> _selectorE;
+        private readonly Func<TSource, int, IEnumerable<TResult>> _selectorEI;
+
+        public SelectMany(IObservable<TSource> source, Func<TSource, IObservable<TResult>> selector)
         {
             _source = source;
             _selector = selector;
-            _selectorOnError = selectorOnError;
-            _selectorOnCompleted = selectorOnCompleted;
         }
 
         public SelectMany(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> selector)
         {
             _source = source;
-            _selectorWithIndex = selector;
+            _selectorI = selector;
+        }
+
+        public SelectMany(IObservable<TSource> source, Func<TSource, IObservable<TResult>> selector, Func<Exception, IObservable<TResult>> selectorOnError, Func<IObservable<TResult>> selectorOnCompleted)
+        {
+            _source = source;
+            _selector = selector;
+            _selectorOnError = selectorOnError;
+            _selectorOnCompleted = selectorOnCompleted;
         }
 
-        public SelectMany(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> selector, Func<Exception, int, IObservable<TResult>> selectorOnError, Func<int, IObservable<TResult>> selectorOnCompleted)
+        public SelectMany(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> selector, Func<Exception, IObservable<TResult>> selectorOnError, Func<IObservable<TResult>> selectorOnCompleted)
         {
             _source = source;
-            _selectorWithIndex = selector;
-            _selectorWithIndexOnError = selectorOnError;
-            _selectorWithIndexOnCompleted = selectorOnCompleted;
+            _selectorI = selector;
+            _selectorOnError = selectorOnError;
+            _selectorOnCompleted = selectorOnCompleted;
         }
 
         public SelectMany(IObservable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)
@@ -540,52 +907,264 @@ namespace System.Reactive.Linq.Observαble
         public SelectMany(IObservable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector)
         {
             _source = source;
-            _selectorEWithIndex = selector;
+            _selectorEI = selector;
         }
 
 #if !NO_TPL
         private readonly Func<TSource, CancellationToken, Task<TResult>> _selectorT;
+        private readonly Func<TSource, int, CancellationToken, Task<TResult>> _selectorTI;
 
         public SelectMany(IObservable<TSource> source, Func<TSource, CancellationToken, Task<TResult>> selector)
         {
             _source = source;
             _selectorT = selector;
         }
+        
+        public SelectMany(IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TResult>> selector)
+        {
+            _source = source;
+            _selectorTI = selector;
+        }
 #endif
 
         protected override IDisposable Run(IObserver<TResult> observer, IDisposable cancel, Action<IDisposable> setSink)
         {
-            if (_selector != null || _selectorWithIndex != null)
+            if (_selector != null)
             {
                 var sink = new _(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
-#if !NO_TPL
-            else if (_selectorT != null)
+            else if (_selectorI != null)
+            {
+                var sink = new IndexSelectorImpl(this, observer, cancel);
+                setSink(sink);
+                return sink.Run();
+            }
+#if !NO_TPL
+            else if (_selectorT != null)
+            {
+                var sink = new SelectManyImpl(this, observer, cancel);
+                setSink(sink);
+                return sink.Run();
+            }
+            else if (_selectorTI != null)
+            {
+                var sink = new Sigma(this, observer, cancel);
+                setSink(sink);
+                return sink.Run();
+            }
+#endif
+            else if (_selectorE != null)
+            {
+                var sink = new NoSelectorImpl(this, observer, cancel);
+                setSink(sink);
+                return _source.SubscribeSafe(sink);
+            }
+            else
+            {
+                var sink = new Omega(this, observer, cancel);
+                setSink(sink);
+                return _source.SubscribeSafe(sink);
+            }
+        }
+
+        class _ : Sink<TResult>, IObserver<TSource>
+        {
+            private readonly SelectMany<TSource, TResult> _parent;
+
+            public _(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+                : base(observer, cancel)
+            {
+                _parent = parent;
+            }
+
+            private object _gate;
+            private bool _isStopped;
+            private CompositeDisposable _group;
+            private SingleAssignmentDisposable _sourceSubscription;
+
+            public IDisposable Run()
+            {
+                _gate = new object();
+                _isStopped = false;
+                _group = new CompositeDisposable();
+
+                _sourceSubscription = new SingleAssignmentDisposable();
+                _group.Add(_sourceSubscription);
+                _sourceSubscription.Disposable = _parent._source.SubscribeSafe(this);
+
+                return _group;
+            }
+
+            public void OnNext(TSource value)
+            {
+                var inner = default(IObservable<TResult>);
+
+                try
+                {
+                    inner = _parent._selector(value);
+                }
+                catch (Exception ex)
+                {
+                    lock (_gate)
+                    {
+                        base._observer.OnError(ex);
+                        base.Dispose();
+                    }
+                    return;
+                }
+
+                SubscribeInner(inner);
+            }
+
+            public void OnError(Exception error)
+            {
+                if (_parent._selectorOnError != null)
+                {
+                    var inner = default(IObservable<TResult>);
+
+                    try
+                    {
+                        inner = _parent._selectorOnError(error);
+                    }
+                    catch (Exception ex)
+                    {
+                        lock (_gate)
+                        {
+                            base._observer.OnError(ex);
+                            base.Dispose();
+                        }
+                        return;
+                    }
+
+                    SubscribeInner(inner);
+
+                    Final();
+                }
+                else
+                {
+                    lock (_gate)
+                    {
+                        base._observer.OnError(error);
+                        base.Dispose();
+                    }
+                }
+            }
+
+            public void OnCompleted()
+            {
+                if (_parent._selectorOnCompleted != null)
+                {
+                    var inner = default(IObservable<TResult>);
+
+                    try
+                    {
+                        inner = _parent._selectorOnCompleted();
+                    }
+                    catch (Exception ex)
+                    {
+                        lock (_gate)
+                        {
+                            base._observer.OnError(ex);
+                            base.Dispose();
+                        }
+                        return;
+                    }
+
+                    SubscribeInner(inner);
+                }
+
+                Final();
+            }
+
+            private void Final()
+            {
+                _isStopped = true;
+                if (_group.Count == 1)
+                {
+                    //
+                    // Notice there can be a race between OnCompleted of the source and any
+                    // of the inner sequences, where both see _group.Count == 1, and one is
+                    // waiting for the lock. There won't be a double OnCompleted observation
+                    // though, because the call to Dispose silences the observer by swapping
+                    // in a NopObserver<T>.
+                    //
+                    lock (_gate)
+                    {
+                        base._observer.OnCompleted();
+                        base.Dispose();
+                    }
+                }
+                else
+                {
+                    _sourceSubscription.Dispose();
+                }
+            }
+
+            private void SubscribeInner(IObservable<TResult> inner)
             {
-                var sink = new τ(this, observer, cancel);
-                setSink(sink);
-                return sink.Run();
+                var innerSubscription = new SingleAssignmentDisposable();
+                _group.Add(innerSubscription);
+                innerSubscription.Disposable = inner.SubscribeSafe(new Iter(this, innerSubscription));
             }
-#endif
-            else
+
+            class Iter : IObserver<TResult>
             {
-                var sink = new ε(this, observer, cancel);
-                setSink(sink);
-                return _source.SubscribeSafe(sink);
+                private readonly _ _parent;
+                private readonly IDisposable _self;
+
+                public Iter(_ parent, IDisposable self)
+                {
+                    _parent = parent;
+                    _self = self;
+                }
+
+                public void OnNext(TResult value)
+                {
+                    lock (_parent._gate)
+                        _parent._observer.OnNext(value);
+                }
+
+                public void OnError(Exception error)
+                {
+                    lock (_parent._gate)
+                    {
+                        _parent._observer.OnError(error);
+                        _parent.Dispose();
+                    }
+                }
+
+                public void OnCompleted()
+                {
+                    _parent._group.Remove(_self);
+                    if (_parent._isStopped && _parent._group.Count == 1)
+                    {
+                        //
+                        // Notice there can be a race between OnCompleted of the source and any
+                        // of the inner sequences, where both see _group.Count == 1, and one is
+                        // waiting for the lock. There won't be a double OnCompleted observation
+                        // though, because the call to Dispose silences the observer by swapping
+                        // in a NopObserver<T>.
+                        //
+                        lock (_parent._gate)
+                        {
+                            _parent._observer.OnCompleted();
+                            _parent.Dispose();
+                        }
+                    }
+                }
             }
         }
 
-        class _ : Sink<TResult>, IObserver<TSource>
+        class IndexSelectorImpl : Sink<TResult>, IObserver<TSource>
         {
             private readonly SelectMany<TSource, TResult> _parent;
 
-            public _(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public IndexSelectorImpl(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
-                _index = -1;
             }
 
             private object _gate;
@@ -613,13 +1192,7 @@ namespace System.Reactive.Linq.Observαble
 
                 try
                 {
-                    if (_parent._selector != null)
-                        inner = _parent._selector(value);
-                    else
-                    {
-                        checked { _index++; }
-                        inner = _parent._selectorWithIndex(value, _index);
-                    }
+                    inner = _parent._selectorI(value, checked(_index++));
                 }
                 catch (Exception ex)
                 {
@@ -642,13 +1215,7 @@ namespace System.Reactive.Linq.Observαble
 
                     try
                     {
-                        if (_parent._selectorOnError != null)
-                            inner = _parent._selectorOnError(error);
-                        else
-                        {
-                            checked { _index++; }
-                            inner = _parent._selectorWithIndexOnError(error, _index);
-                        }
+                        inner = _parent._selectorOnError(error);
                     }
                     catch (Exception ex)
                     {
@@ -682,10 +1249,7 @@ namespace System.Reactive.Linq.Observαble
 
                     try
                     {
-                        if (_parent._selectorOnCompleted != null)
-                            inner = _parent._selectorOnCompleted();
-                        else
-                            inner = _parent._selectorWithIndexOnCompleted(_index);
+                        inner = _parent._selectorOnCompleted();
                     }
                     catch (Exception ex)
                     {
@@ -731,15 +1295,15 @@ namespace System.Reactive.Linq.Observαble
             {
                 var innerSubscription = new SingleAssignmentDisposable();
                 _group.Add(innerSubscription);
-                innerSubscription.Disposable = inner.SubscribeSafe(new ι(this, innerSubscription));
+                innerSubscription.Disposable = inner.SubscribeSafe(new Iter(this, innerSubscription));
             }
 
-            class ι : IObserver<TResult>
+            class Iter : IObserver<TResult>
             {
-                private readonly _ _parent;
+                private readonly IndexSelectorImpl _parent;
                 private readonly IDisposable _self;
 
-                public ι(_ parent, IDisposable self)
+                public Iter(IndexSelectorImpl parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -782,16 +1346,14 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class ε : Sink<TResult>, IObserver<TSource>
+        class NoSelectorImpl : Sink<TResult>, IObserver<TSource>
         {
             private readonly SelectMany<TSource, TResult> _parent;
-            private int _index;
 
-            public ε(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public NoSelectorImpl(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
-                _index = -1;
             }
 
             public void OnNext(TSource value)
@@ -799,14 +1361,91 @@ namespace System.Reactive.Linq.Observαble
                 var xs = default(IEnumerable<TResult>);
                 try
                 {
-                    if (_parent._selectorE != null)
-                        xs = _parent._selectorE(value);
-                    else
+                    xs = _parent._selectorE(value);
+                }
+                catch (Exception exception)
+                {
+                    base._observer.OnError(exception);
+                    base.Dispose();
+                    return;
+                }
+
+                var e = default(IEnumerator<TResult>);
+                try
+                {
+                    e = xs.GetEnumerator();
+                }
+                catch (Exception exception)
+                {
+                    base._observer.OnError(exception);
+                    base.Dispose();
+                    return;
+                }
+
+                try
+                {
+                    var hasNext = true;
+                    while (hasNext)
                     {
-                        checked { _index++; }
-                        xs = _parent._selectorEWithIndex(value, _index);
+                        hasNext = false;
+                        var current = default(TResult);
+
+                        try
+                        {
+                            hasNext = e.MoveNext();
+                            if (hasNext)
+                                current = e.Current;
+                        }
+                        catch (Exception exception)
+                        {
+                            base._observer.OnError(exception);
+                            base.Dispose();
+                            return;
+                        }
+
+                        if (hasNext)
+                            base._observer.OnNext(current);
                     }
                 }
+                finally
+                {
+                    if (e != null)
+                        e.Dispose();
+                }
+            }
+
+            public void OnError(Exception error)
+            {
+                base._observer.OnError(error);
+                base.Dispose();
+            }
+
+            public void OnCompleted()
+            {
+                base._observer.OnCompleted();
+                base.Dispose();
+            }
+        }
+
+        class Omega : Sink<TResult>, IObserver<TSource>
+        {
+            private readonly SelectMany<TSource, TResult> _parent;
+
+            public Omega(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+                : base(observer, cancel)
+            {
+                _parent = parent;
+            }
+            
+            private int _index;
+
+            public void OnNext(TSource value)
+            {
+                var xs = default(IEnumerable<TResult>);
+                try
+                {
+                    xs = _parent._selectorEI(value, checked(_index++));
+                }
                 catch (Exception exception)
                 {
                     base._observer.OnError(exception);
@@ -873,11 +1512,11 @@ namespace System.Reactive.Linq.Observαble
 
 #if !NO_TPL
 #pragma warning disable 0420
-        class τ : Sink<TResult>, IObserver<TSource>
+        class SelectManyImpl : Sink<TResult>, IObserver<TSource>
         {
             private readonly SelectMany<TSource, TResult> _parent;
 
-            public τ(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public SelectManyImpl(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -982,6 +1621,117 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
         }
+
+        class Sigma : Sink<TResult>, IObserver<TSource>
+        {
+            private readonly SelectMany<TSource, TResult> _parent;
+
+            public Sigma(SelectMany<TSource, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+                : base(observer, cancel)
+            {
+                _parent = parent;
+            }
+
+            private object _gate;
+            private CancellationDisposable _cancel;
+            private volatile int _count;
+            private int _index;
+
+            public IDisposable Run()
+            {
+                _gate = new object();
+                _cancel = new CancellationDisposable();
+                _count = 1;
+
+                return new CompositeDisposable(_parent._source.SubscribeSafe(this), _cancel);
+            }
+
+            public void OnNext(TSource value)
+            {
+                var task = default(Task<TResult>);
+                try
+                {
+                    Interlocked.Increment(ref _count);
+                    task = _parent._selectorTI(value, checked(_index++), _cancel.Token);
+                }
+                catch (Exception ex)
+                {
+                    lock (_gate)
+                    {
+                        base._observer.OnError(ex);
+                        base.Dispose();
+                    }
+
+                    return;
+                }
+
+                if (task.IsCompleted)
+                {
+                    OnCompletedTask(task);
+                }
+                else
+                {
+                    task.ContinueWith(OnCompletedTask);
+                }
+            }
+
+            private void OnCompletedTask(Task<TResult> task)
+            {
+                switch (task.Status)
+                {
+                    case TaskStatus.RanToCompletion:
+                        {
+                            lock (_gate)
+                                base._observer.OnNext(task.Result);
+
+                            OnCompleted();
+                        }
+                        break;
+                    case TaskStatus.Faulted:
+                        {
+                            lock (_gate)
+                            {
+                                base._observer.OnError(task.Exception.InnerException);
+                                base.Dispose();
+                            }
+                        }
+                        break;
+                    case TaskStatus.Canceled:
+                        {
+                            if (!_cancel.IsDisposed)
+                            {
+                                lock (_gate)
+                                {
+                                    base._observer.OnError(new TaskCanceledException(task));
+                                    base.Dispose();
+                                }
+                            }
+                        }
+                        break;
+                }
+            }
+
+            public void OnError(Exception error)
+            {
+                lock (_gate)
+                {
+                    base._observer.OnError(error);
+                    base.Dispose();
+                }
+            }
+
+            public void OnCompleted()
+            {
+                if (Interlocked.Decrement(ref _count) == 0)
+                {
+                    lock (_gate)
+                    {
+                        base._observer.OnCompleted();
+                        base.Dispose();
+                    }
+                }
+            }
+        }
 #pragma warning restore 0420
 #endif
     }
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SequenceEqual.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SequenceEqual.cs
index 4661f82..6b03aba 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SequenceEqual.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SequenceEqual.cs
@@ -5,7 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class SequenceEqual<TSource> : Producer<bool>
     {
@@ -38,7 +38,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new ε(this, observer, cancel);
+                var sink = new SequenceEqualImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -226,11 +226,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class ε : Sink<bool>, IObserver<TSource>
+        class SequenceEqualImpl : Sink<bool>, IObserver<TSource>
         {
             private readonly SequenceEqual<TSource> _parent;
 
-            public ε(SequenceEqual<TSource> parent, IObserver<bool> observer, IDisposable cancel)
+            public SequenceEqualImpl(SequenceEqual<TSource> parent, IObserver<bool> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SingleAsync.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SingleAsync.cs
index 19c07e5..c4dce4a 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SingleAsync.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SingleAsync.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class SingleAsync<TSource> : Producer<TSource>
     {
@@ -22,7 +22,7 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_predicate != null)
             {
-                var sink = new π(this, observer, cancel);
+                var sink = new SingleAsyncImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -84,13 +84,13 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<TSource>, IObserver<TSource>
+        class SingleAsyncImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly SingleAsync<TSource> _parent;
             private TSource _value;
             private bool _seenValue;
 
-            public π(SingleAsync<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public SingleAsyncImpl(SingleAsync<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Skip.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Skip.cs
index a092d99..7222816 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Skip.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Skip.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Skip<TSource> : Producer<TSource>
     {
@@ -27,7 +27,7 @@ namespace System.Reactive.Linq.Observαble
             _scheduler = scheduler;
         }
 
-        public IObservable<TSource> Ω(int count)
+        public IObservable<TSource> Omega(int count)
         {
             //
             // Sum semantics:
@@ -39,7 +39,7 @@ namespace System.Reactive.Linq.Observαble
             return new Skip<TSource>(_source, _count + count);
         }
 
-        public IObservable<TSource> Ω(TimeSpan duration)
+        public IObservable<TSource> Omega(TimeSpan duration)
         {
             //
             // Maximum semantics:
@@ -66,7 +66,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new SkipImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -105,12 +105,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<TSource>, IObserver<TSource>
+        class SkipImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly Skip<TSource> _parent;
             private volatile bool _open;
 
-            public τ(Skip<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public SkipImpl(Skip<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipLast.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipLast.cs
index 596f183..6bd771e 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipLast.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipLast.cs
@@ -5,7 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Reactive.Concurrency;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class SkipLast<TSource> : Producer<TSource>
     {
@@ -37,7 +37,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new SkipLastImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -75,12 +75,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<TSource>, IObserver<TSource>
+        class SkipLastImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly SkipLast<TSource> _parent;
             private Queue<System.Reactive.TimeInterval<TSource>> _queue;
 
-            public τ(SkipLast<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public SkipLastImpl(SkipLast<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipUntil.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipUntil.cs
index 8d4c7a9..8acce09 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipUntil.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipUntil.cs
@@ -6,7 +6,7 @@ using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class SkipUntil<TSource, TOther> : Producer<TSource>
     {
@@ -140,7 +140,7 @@ namespace System.Reactive.Linq.Observαble
             _scheduler = scheduler;
         }
 
-        public IObservable<TSource> Ω(DateTimeOffset startTime)
+        public IObservable<TSource> Omega(DateTimeOffset startTime)
         {
             //
             // Maximum semantics:
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipWhile.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipWhile.cs
index e6e379d..b5694dc 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipWhile.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/SkipWhile.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class SkipWhile<TSource> : Producer<TSource>
     {
@@ -33,7 +33,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new SkipWhileImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -86,13 +86,13 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<TSource>, IObserver<TSource>
+        class SkipWhileImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly SkipWhile<TSource> _parent;
             private bool _running;
             private int _index;
 
-            public τ(SkipWhile<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public SkipWhileImpl(SkipWhile<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sum.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sum.cs
index 6d51153..c5346f8 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sum.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Sum.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class SumDouble : Producer<double>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Switch.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Switch.cs
index 794b0d4..e27d6eb 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Switch.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Switch.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Switch<TSource> : Producer<TSource>
     {
@@ -65,7 +65,7 @@ namespace System.Reactive.Linq.Observαble
 
                 var d = new SingleAssignmentDisposable();
                 _innerSubscription.Disposable = d;
-                d.Disposable = value.SubscribeSafe(new ι(this, id, d));
+                d.Disposable = value.SubscribeSafe(new Iter(this, id, d));
             }
 
             public void OnError(Exception error)
@@ -91,13 +91,13 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class ι : IObserver<TSource>
+            class Iter : IObserver<TSource>
             {
                 private readonly _ _parent;
                 private readonly ulong _id;
                 private readonly IDisposable _self;
 
-                public ι(_ parent, ulong id, IDisposable self)
+                public Iter(_ parent, ulong id, IDisposable self)
                 {
                     _parent = parent;
                     _id = id;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Synchronize.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Synchronize.cs
index 36985e9..ef4e885 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Synchronize.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Synchronize.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Synchronize<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Take.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Take.cs
index 738e7c0..255e3d2 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Take.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Take.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Take<TSource> : Producer<TSource>
     {
@@ -27,7 +27,7 @@ namespace System.Reactive.Linq.Observαble
             _scheduler = scheduler;
         }
 
-        public IObservable<TSource> Ω(int count)
+        public IObservable<TSource> Omega(int count)
         {
             //
             // Minimum semantics:
@@ -42,7 +42,7 @@ namespace System.Reactive.Linq.Observαble
                 return new Take<TSource>(_source, count);
         }
 
-        public IObservable<TSource> Ω(TimeSpan duration)
+        public IObservable<TSource> Omega(TimeSpan duration)
         {
             //
             // Minimum semantics:
@@ -69,7 +69,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new TakeImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -115,11 +115,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<TSource>, IObserver<TSource>
+        class TakeImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly Take<TSource> _parent;
 
-            public τ(Take<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public TakeImpl(Take<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLast.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLast.cs
index 98bf40e..441a502 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLast.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLast.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class TakeLast<TSource> : Producer<TSource>
     {
@@ -41,7 +41,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new TakeLastImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -131,12 +131,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<TSource>, IObserver<TSource>
+        class TakeLastImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly TakeLast<TSource> _parent;
             private Queue<System.Reactive.TimeInterval<TSource>> _queue;
 
-            public τ(TakeLast<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public TakeLastImpl(TakeLast<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLastBuffer.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLastBuffer.cs
index 71b36b0..2a15825 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLastBuffer.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeLastBuffer.cs
@@ -7,7 +7,7 @@ using System.Linq;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class TakeLastBuffer<TSource> : Producer<IList<TSource>>
     {
@@ -39,7 +39,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new Impl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -82,12 +82,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<IList<TSource>>, IObserver<TSource>
+        class Impl : Sink<IList<TSource>>, IObserver<TSource>
         {
             private readonly TakeLastBuffer<TSource> _parent;
             private Queue<System.Reactive.TimeInterval<TSource>> _queue;
 
-            public τ(TakeLastBuffer<TSource> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
+            public Impl(TakeLastBuffer<TSource> parent, IObserver<IList<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeUntil.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeUntil.cs
index eccc222..62b450a 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeUntil.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeUntil.cs
@@ -6,7 +6,7 @@ using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class TakeUntil<TSource, TOther> : Producer<TSource>
     {
@@ -173,7 +173,7 @@ namespace System.Reactive.Linq.Observαble
             _scheduler = scheduler;
         }
 
-        public IObservable<TSource> Ω(DateTimeOffset endTime)
+        public IObservable<TSource> Omega(DateTimeOffset endTime)
         {
             //
             // Minimum semantics:
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeWhile.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeWhile.cs
index 30f63ca..dbf6117 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeWhile.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TakeWhile.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class TakeWhile<TSource> : Producer<TSource>
     {
@@ -33,7 +33,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new TakeWhileImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -91,13 +91,13 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<TSource>, IObserver<TSource>
+        class TakeWhileImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly TakeWhile<TSource> _parent;
             private bool _running;
             private int _index;
 
-            public τ(TakeWhile<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public TakeWhileImpl(TakeWhile<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throttle.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throttle.cs
index 7b7ad86..5061114 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throttle.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throttle.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Throttle<TSource> : Producer<TSource>
     {
@@ -192,7 +192,7 @@ namespace System.Reactive.Linq.Observαble
 
                 var d = new SingleAssignmentDisposable();
                 _cancelable.Disposable = d;
-                d.Disposable = throttle.SubscribeSafe(new δ(this, value, currentid, d));
+                d.Disposable = throttle.SubscribeSafe(new Delta(this, value, currentid, d));
             }
 
             public void OnError(Exception error)
@@ -226,14 +226,14 @@ namespace System.Reactive.Linq.Observαble
                 }
             }
 
-            class δ : IObserver<TThrottle>
+            class Delta : IObserver<TThrottle>
             {
                 private readonly _ _parent;
                 private readonly TSource _value;
                 private readonly ulong _currentid;
                 private readonly IDisposable _self;
 
-                public δ(_ parent, TSource value, ulong currentid, IDisposable self)
+                public Delta(_ parent, TSource value, ulong currentid, IDisposable self)
                 {
                     _parent = parent;
                     _value = value;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throw.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throw.cs
index 3b10894..9940a9d 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throw.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Throw.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Concurrency;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Throw<TResult> : Producer<TResult>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TimeInterval.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TimeInterval.cs
index dacfa03..4c40863 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TimeInterval.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/TimeInterval.cs
@@ -7,7 +7,7 @@ using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class TimeInterval<TSource> : Producer<System.Reactive.TimeInterval<TSource>>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timeout.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timeout.cs
index 4896294..94b78a6 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timeout.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timeout.cs
@@ -5,7 +5,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Timeout<TSource> : Producer<TSource>
     {
@@ -35,23 +35,23 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_dueTimeA.HasValue)
             {
-                var sink = new α(this, observer, cancel);
+                var sink = new TimeA(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
             else
             {
-                var sink = new ρ(this, observer, cancel);
+                var sink = new TimeR(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
         }
 
-        class α : Sink<TSource>, IObserver<TSource>
+        class TimeA : Sink<TSource>, IObserver<TSource>
         {
             private readonly Timeout<TSource> _parent;
 
-            public α(Timeout<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public TimeA(Timeout<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -136,11 +136,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class ρ : Sink<TSource>, IObserver<TSource>
+        class TimeR : Sink<TSource>, IObserver<TSource>
         {
             private readonly Timeout<TSource> _parent;
 
-            public ρ(Timeout<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public TimeR(Timeout<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -358,16 +358,16 @@ namespace System.Reactive.Linq.Observαble
 
                 var d = new SingleAssignmentDisposable();
                 _timer.Disposable = d;
-                d.Disposable = timeout.SubscribeSafe(new τ(this, myid, d));
+                d.Disposable = timeout.SubscribeSafe(new TimeoutImpl(this, myid, d));
             }
 
-            class τ : IObserver<TTimeout>
+            class TimeoutImpl : IObserver<TTimeout>
             {
                 private readonly _ _parent;
                 private readonly ulong _id;
                 private readonly IDisposable _self;
 
-                public τ(_ parent, ulong id, IDisposable self)
+                public TimeoutImpl(_ parent, ulong id, IDisposable self)
                 {
                     _parent = parent;
                     _id = id;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timer.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timer.cs
index 22ee0df..14df757 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timer.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timer.cs
@@ -7,7 +7,7 @@ using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Timer : Producer<long>
     {
@@ -34,7 +34,7 @@ namespace System.Reactive.Linq.Observαble
         {
             if (_period.HasValue)
             {
-                var sink = new π(this, observer, cancel);
+                var sink = new TimerImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -76,12 +76,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<long>
+        class TimerImpl : Sink<long>
         {
             private readonly Timer _parent;
             private readonly TimeSpan _period;
 
-            public π(Timer parent, IObserver<long> observer, IDisposable cancel)
+            public TimerImpl(Timer parent, IObserver<long> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timestamp.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timestamp.cs
index ed54678..19bf1be 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timestamp.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Timestamp.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Concurrency;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Timestamp<TSource> : Producer<Timestamped<TSource>>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToArray.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToArray.cs
index ba039ae..97b9bd4 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToArray.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToArray.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class ToArray<TSource> : Producer<TSource[]>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToDictionary.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToDictionary.cs
index 919c1a1..5cfd9ec 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToDictionary.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToDictionary.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class ToDictionary<TSource, TKey, TElement> : Producer<IDictionary<TKey, TElement>>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToList.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToList.cs
index 34956d4..a265098 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToList.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToList.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class ToList<TSource> : Producer<IList<TSource>>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToLookup.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToLookup.cs
index 55ff7d3..d86f5ee 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToLookup.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToLookup.cs
@@ -5,7 +5,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class ToLookup<TSource, TKey, TElement> : Producer<ILookup<TKey, TElement>>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToObservable.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToObservable.cs
index 795d54d..8de8ff7 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToObservable.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/ToObservable.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
 using System.Reactive.Concurrency;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class ToObservable<TSource> : Producer<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Using.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Using.cs
index 996ee0e..680d1f4 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Using.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Using.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Using<TSource, TResource> : Producer<TSource>
         where TResource : IDisposable
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Where.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Where.cs
index a8eaa92..3ab5f73 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Where.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Where.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Where<TSource> : Producer<TSource>
     {
@@ -23,7 +23,7 @@ namespace System.Reactive.Linq.Observαble
             _predicateI = predicate;
         }
 
-        public IObservable<TSource> Ω(Func<TSource, bool> predicate)
+        public IObservable<TSource> Omega(Func<TSource, bool> predicate)
         {
             if (_predicate != null)
                 return new Where<TSource>(_source, x => _predicate(x) && predicate(x));
@@ -41,7 +41,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new τ(this, observer, cancel);
+                var sink = new WhereImpl(this, observer, cancel);
                 setSink(sink);
                 return _source.SubscribeSafe(sink);
             }
@@ -88,12 +88,12 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<TSource>, IObserver<TSource>
+        class WhereImpl : Sink<TSource>, IObserver<TSource>
         {
             private readonly Where<TSource> _parent;
             private int _index;
 
-            public τ(Where<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
+            public WhereImpl(Where<TSource> parent, IObserver<TSource> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/While.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/While.cs
index 178e4c8..2f24adf 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/While.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/While.cs
@@ -4,7 +4,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class While<TSource> : Producer<TSource>, IConcatenatable<TSource>
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Window.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Window.cs
index 47059c7c..4dad064 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Window.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Window.cs
@@ -9,7 +9,7 @@ using System.Reactive.Disposables;
 using System.Reactive.Subjects;
 using System.Threading;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     class Window<TSource> : Producer<IObservable<TSource>>
     {
@@ -54,7 +54,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else if (_count > 0)
             {
-                var sink = new μ(this, observer, cancel);
+                var sink = new BoundedWindowImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -62,13 +62,13 @@ namespace System.Reactive.Linq.Observαble
             {
                 if (_timeSpan == _timeShift)
                 {
-                    var sink = new π(this, observer, cancel);
+                    var sink = new TimeShiftImpl(this, observer, cancel);
                     setSink(sink);
                     return sink.Run();
                 }
                 else
                 {
-                    var sink = new τ(this, observer, cancel);
+                    var sink = new WindowImpl(this, observer, cancel);
                     setSink(sink);
                     return sink.Run();
                 }
@@ -151,11 +151,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class τ : Sink<IObservable<TSource>>, IObserver<TSource>
+        class WindowImpl : Sink<IObservable<TSource>>, IObserver<TSource>
         {
             private readonly Window<TSource> _parent;
 
-            public τ(Window<TSource> parent, IObserver<IObservable<TSource>> observer, IDisposable cancel)
+            public WindowImpl(Window<TSource> parent, IObserver<IObservable<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -296,11 +296,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class π : Sink<IObservable<TSource>>, IObserver<TSource>
+        class TimeShiftImpl : Sink<IObservable<TSource>>, IObserver<TSource>
         {
             private readonly Window<TSource> _parent;
 
-            public π(Window<TSource> parent, IObserver<IObservable<TSource>> observer, IDisposable cancel)
+            public TimeShiftImpl(Window<TSource> parent, IObserver<IObservable<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -371,11 +371,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class μ : Sink<IObservable<TSource>>, IObserver<TSource>
+        class BoundedWindowImpl : Sink<IObservable<TSource>>, IObserver<TSource>
         {
             private readonly Window<TSource> _parent;
 
-            public μ(Window<TSource> parent, IObserver<IObservable<TSource>> observer, IDisposable cancel)
+            public BoundedWindowImpl(Window<TSource> parent, IObserver<IObservable<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -516,7 +516,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new β(this, observer, cancel);
+                var sink = new Beta(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -578,7 +578,7 @@ namespace System.Reactive.Linq.Observαble
 
                 var closingSubscription = new SingleAssignmentDisposable();
                 _m.Disposable = closingSubscription;
-                closingSubscription.Disposable = windowClose.SubscribeSafe(new ω(this, closingSubscription));
+                closingSubscription.Disposable = windowClose.SubscribeSafe(new Omega(this, closingSubscription));
             }
 
             private void CloseWindow(IDisposable closingSubscription)
@@ -597,12 +597,12 @@ namespace System.Reactive.Linq.Observαble
                 _windowGate.Wait(CreateWindowClose);
             }
 
-            class ω : IObserver<TWindowClosing>
+            class Omega : IObserver<TWindowClosing>
             {
                 private readonly _ _parent;
                 private readonly IDisposable _self;
 
-                public ω(_ parent, IDisposable self)
+                public Omega(_ parent, IDisposable self)
                 {
                     _parent = parent;
                     _self = self;
@@ -653,11 +653,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class β : Sink<IObservable<TSource>>, IObserver<TSource>
+        class Beta : Sink<IObservable<TSource>>, IObserver<TSource>
         {
             private readonly Window<TSource, TWindowClosing> _parent;
 
-            public β(Window<TSource, TWindowClosing> parent, IObserver<IObservable<TSource>> observer, IDisposable cancel)
+            public Beta(Window<TSource, TWindowClosing> parent, IObserver<IObservable<TSource>> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
@@ -680,16 +680,16 @@ namespace System.Reactive.Linq.Observαble
                 base._observer.OnNext(window);
 
                 d.Add(_parent._source.SubscribeSafe(this));
-                d.Add(_parent._windowBoundaries.SubscribeSafe(new ω(this)));
+                d.Add(_parent._windowBoundaries.SubscribeSafe(new Omega(this)));
 
                 return _refCountDisposable;
             }
 
-            class ω : IObserver<TWindowClosing>
+            class Omega : IObserver<TWindowClosing>
             {
-                private readonly β _parent;
+                private readonly Beta _parent;
 
-                public ω(β parent)
+                public Omega(Beta parent)
                 {
                     _parent = parent;
                 }
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Zip.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Zip.cs
index bde6e29..77434c7 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Zip.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/Zip.cs
@@ -7,7 +7,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Reactive.Disposables;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
     #region Binary
 
@@ -42,7 +42,7 @@ namespace System.Reactive.Linq.Observαble
             }
             else
             {
-                var sink = new ε(this, observer, cancel);
+                var sink = new ZipImpl(this, observer, cancel);
                 setSink(sink);
                 return sink.Run();
             }
@@ -258,11 +258,11 @@ namespace System.Reactive.Linq.Observαble
             }
         }
 
-        class ε : Sink<TResult>, IObserver<TFirst>
+        class ZipImpl : Sink<TResult>, IObserver<TFirst>
         {
             private readonly Zip<TFirst, TSecond, TResult> _parent;
 
-            public ε(Zip<TFirst, TSecond, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
+            public ZipImpl(Zip<TFirst, TSecond, TResult> parent, IObserver<TResult> observer, IDisposable cancel)
                 : base(observer, cancel)
             {
                 _parent = parent;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/_.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/_.cs
index d4b0dbc..4489003 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/_.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/Observable/_.cs
@@ -3,7 +3,7 @@
 #if !NO_PERF
 using System;
 
-namespace System.Reactive.Linq.Observαble
+namespace System.Reactive.Linq.ObservableImpl
 {
 }
 #endif
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Aggregates.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Aggregates.cs
index 739fc2d..8967297 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Aggregates.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Aggregates.cs
@@ -7,7 +7,7 @@ using System.Reactive.Disposables;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Binding.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Binding.cs
index d9a96ba..8066a0e 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Binding.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Binding.cs
@@ -6,7 +6,7 @@ using System.Reactive.Subjects;
 
 namespace System.Reactive.Linq
 {
-    using Observαble;
+    using ObservableImpl;
 
     internal partial class QueryLanguage
     {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Blocking.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Blocking.cs
index 2b37006..5f69873 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Blocking.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Blocking.cs
@@ -12,7 +12,7 @@ using System.Reactive.Threading;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
@@ -195,7 +195,7 @@ namespace System.Reactive.Linq
         {
 #if !NO_PERF
             var evt = new ManualResetEvent(false);
-            var sink = new ForEach<TSource>.τ(onNext, () => evt.Set());
+            var sink = new ForEach<TSource>.ForEachImpl(onNext, () => evt.Set());
 
             using (source.SubscribeSafe(sink))
             {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Concurrency.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Concurrency.cs
index 58408b2..0dc4035 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Concurrency.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Concurrency.cs
@@ -7,7 +7,7 @@ using System.Threading;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Conversions.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Conversions.cs
index 44d6cf6..d795b4d 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Conversions.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Conversions.cs
@@ -7,7 +7,7 @@ using System.Reactive.Disposables;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Creation.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Creation.cs
index 4aa25b2..55bae61 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Creation.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Creation.cs
@@ -14,7 +14,7 @@ using System.Threading.Tasks;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Events.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Events.cs
index 3b9f2bf..453bcee 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Events.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Events.cs
@@ -13,7 +13,7 @@ using System.Runtime.InteropServices.WindowsRuntime;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     //
@@ -57,7 +57,7 @@ namespace System.Reactive.Linq
         private static IObservable<EventPattern<EventArgs>> FromEventPattern_(Action<EventHandler> addHandler, Action<EventHandler> removeHandler, IScheduler scheduler)
         {
 #if !NO_PERF
-            return new FromEventPattern.τ<EventHandler, EventArgs>(e => new EventHandler(e), addHandler, removeHandler, scheduler);
+            return new FromEventPattern.Impl<EventHandler, EventArgs>(e => new EventHandler(e), addHandler, removeHandler, scheduler);
 #else
             var res = Observable.FromEventPattern<EventHandler, EventArgs>(e => new EventHandler(e), addHandler, removeHandler);
             return SynchronizeEvents(res, scheduler);
@@ -67,7 +67,7 @@ namespace System.Reactive.Linq
         private static IObservable<EventPattern<object>> FromEventPattern_(Action<EventHandler> addHandler, Action<EventHandler> removeHandler, IScheduler scheduler)
         {
 #if !NO_PERF
-            return new FromEventPattern.τ<EventHandler, object>(e => new EventHandler(e), addHandler, removeHandler, scheduler);
+            return new FromEventPattern.Impl<EventHandler, object>(e => new EventHandler(e), addHandler, removeHandler, scheduler);
 #else
             var res = Observable.FromEventPattern<EventHandler, object>(e => new EventHandler(e), addHandler, removeHandler);
             return SynchronizeEvents(res, scheduler);
@@ -108,7 +108,7 @@ namespace System.Reactive.Linq
 #endif
         {
 #if !NO_PERF
-            return new FromEventPattern.τ<TDelegate, TEventArgs>(addHandler, removeHandler, scheduler);
+            return new FromEventPattern.Impl<TDelegate, TEventArgs>(addHandler, removeHandler, scheduler);
 #else
             var res = new AnonymousObservable<EventPattern<TEventArgs>>(observer =>
             {
@@ -151,7 +151,7 @@ namespace System.Reactive.Linq
 #endif
         {
 #if !NO_PERF
-            return new FromEventPattern.τ<TDelegate, TEventArgs>(conversion, addHandler, removeHandler, scheduler);
+            return new FromEventPattern.Impl<TDelegate, TEventArgs>(conversion, addHandler, removeHandler, scheduler);
 #else
             var res = new AnonymousObservable<EventPattern<TEventArgs>>(observer =>
             {
@@ -193,7 +193,7 @@ namespace System.Reactive.Linq
 #endif
         {
 #if !NO_PERF
-            return new FromEventPattern.τ<TDelegate, TSender, TEventArgs>(addHandler, removeHandler, scheduler);
+            return new FromEventPattern.Impl<TDelegate, TSender, TEventArgs>(addHandler, removeHandler, scheduler);
 #else
             var res = new AnonymousObservable<EventPattern<TSender, TEventArgs>>(observer =>
             {
@@ -240,7 +240,7 @@ namespace System.Reactive.Linq
 #endif
         {
 #if !NO_PERF
-            return new FromEventPattern.τ<EventHandler<TEventArgs>, TEventArgs>(handler => handler, addHandler, removeHandler, scheduler);
+            return new FromEventPattern.Impl<EventHandler<TEventArgs>, TEventArgs>(handler => handler, addHandler, removeHandler, scheduler);
 #else
             var res = Observable.FromEventPattern<EventHandler<TEventArgs>, TEventArgs>(handler => handler, addHandler, removeHandler);
             return SynchronizeEvents(res, scheduler);
@@ -480,7 +480,7 @@ namespace System.Reactive.Linq
             if (isWinRT)
             {
 #if !NO_PERF
-                return new FromEventPattern.ρ<TSender, TEventArgs, TResult>(target, delegateType, addMethod, removeMethod, getResult, true, scheduler);
+                return new FromEventPattern.Handler<TSender, TEventArgs, TResult>(target, delegateType, addMethod, removeMethod, getResult, true, scheduler);
 #else
                 return new AnonymousObservable<TResult>(observer =>
                 {
@@ -494,7 +494,7 @@ namespace System.Reactive.Linq
 #endif
 
 #if !NO_PERF
-            return new FromEventPattern.ρ<TSender, TEventArgs, TResult>(target, delegateType, addMethod, removeMethod, getResult, false, scheduler);
+            return new FromEventPattern.Handler<TSender, TEventArgs, TResult>(target, delegateType, addMethod, removeMethod, getResult, false, scheduler);
 #else
             var res = new AnonymousObservable<TResult>(observer =>
             {
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Imperative.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Imperative.cs
index 75b86b3..1825035 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Imperative.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Imperative.cs
@@ -13,7 +13,7 @@ using System.Threading.Tasks;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Multiple.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Multiple.cs
index 7308740..c726e82 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Multiple.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Multiple.cs
@@ -16,7 +16,7 @@ using System.Threading.Tasks;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Single.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Single.cs
index 5f64e16..2770ade 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Single.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Single.cs
@@ -9,7 +9,7 @@ using System.Reactive.Subjects;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
@@ -21,7 +21,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var asObservable = source as AsObservable<TSource>;
             if (asObservable != null)
-                return asObservable.Ω();
+                return asObservable.Omega();
 
             return new AsObservable<TSource>(source);
 #else
@@ -331,7 +331,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var ignoreElements = source as IgnoreElements<TSource>;
             if (ignoreElements != null)
-                return ignoreElements.Ω();
+                return ignoreElements.Omega();
 
             return new IgnoreElements<TSource>(source);
 #else
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs
index 0089f04..41ceb9c 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs
@@ -1,13 +1,10 @@
 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
 using System.Collections.Generic;
-using System.Linq;
 using System.Reactive.Concurrency;
-using System.Reactive.Disposables;
-using System.Reactive.Subjects;
+
 
 #if !NO_TPL
-using System.Reactive.Threading.Tasks;
 using System.Threading;
 using System.Threading.Tasks;
 #endif
@@ -15,7 +12,7 @@ using System.Threading.Tasks;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
@@ -156,30 +153,50 @@ namespace System.Reactive.Linq
 
         public virtual IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector)
         {
-            return GroupBy_<TSource, TKey, TElement>(source, keySelector, elementSelector, EqualityComparer<TKey>.Default);
+            return GroupBy_<TSource, TKey, TElement>(source, keySelector, elementSelector, null, EqualityComparer<TKey>.Default);
         }
 
         public virtual IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
         {
-            return GroupBy_<TSource, TKey, TSource>(source, keySelector, x => x, comparer);
+            return GroupBy_<TSource, TKey, TSource>(source, keySelector, x => x, null, comparer);
         }
 
         public virtual IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector)
         {
-            return GroupBy_<TSource, TKey, TSource>(source, keySelector, x => x, EqualityComparer<TKey>.Default);
+            return GroupBy_<TSource, TKey, TSource>(source, keySelector, x => x, null, EqualityComparer<TKey>.Default);
         }
 
         public virtual IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
         {
-            return GroupBy_<TSource, TKey, TElement>(source, keySelector, elementSelector, comparer);
+            return GroupBy_<TSource, TKey, TElement>(source, keySelector, elementSelector, null, comparer);
+        }
+
+        public virtual IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, int capacity)
+        {
+            return GroupBy_<TSource, TKey, TElement>(source, keySelector, elementSelector, capacity, EqualityComparer<TKey>.Default);
+        }
+
+        public virtual IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            return GroupBy_<TSource, TKey, TSource>(source, keySelector, x => x, capacity, comparer);
+        }
+
+        public virtual IObservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(IObservable<TSource> source, Func<TSource, TKey> keySelector, int capacity)
+        {
+            return GroupBy_<TSource, TKey, TSource>(source, keySelector, x => x, capacity, EqualityComparer<TKey>.Default);
+        }
+
+        public virtual IObservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            return GroupBy_<TSource, TKey, TElement>(source, keySelector, elementSelector, capacity, comparer);
         }
 
-        private static IObservable<IGroupedObservable<TKey, TElement>> GroupBy_<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
+        private static IObservable<IGroupedObservable<TKey, TElement>> GroupBy_<TSource, TKey, TElement>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, int? capacity, IEqualityComparer<TKey> comparer)
         {
 #if !NO_PERF
-            return new GroupBy<TSource, TKey, TElement>(source, keySelector, elementSelector, comparer);
+            return new GroupBy<TSource, TKey, TElement>(source, keySelector, elementSelector, capacity, comparer);
 #else
-            return GroupByUntil_<TSource, TKey, TElement, Unit>(source, keySelector, elementSelector, _ => Observable.Never<Unit>(), comparer);
+            return GroupByUntil_<TSource, TKey, TElement, Unit>(source, keySelector, elementSelector, _ => Observable.Never<Unit>(), capacity, comparer);
 #endif
         }
 
@@ -189,32 +206,54 @@ namespace System.Reactive.Linq
 
         public virtual IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer)
         {
-            return GroupByUntil_<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, comparer);
+            return GroupByUntil_<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, null, comparer);
         }
 
         public virtual IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector)
         {
-            return GroupByUntil_<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, EqualityComparer<TKey>.Default);
+            return GroupByUntil_<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, null, EqualityComparer<TKey>.Default);
         }
 
         public virtual IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer)
         {
-            return GroupByUntil_<TSource, TKey, TSource, TDuration>(source, keySelector, x => x, durationSelector, comparer);
+            return GroupByUntil_<TSource, TKey, TSource, TDuration>(source, keySelector, x => x, durationSelector, null, comparer);
         }
 
         public virtual IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector)
         {
-            return GroupByUntil_<TSource, TKey, TSource, TDuration>(source, keySelector, x => x, durationSelector, EqualityComparer<TKey>.Default);
+            return GroupByUntil_<TSource, TKey, TSource, TDuration>(source, keySelector, x => x, durationSelector, null, EqualityComparer<TKey>.Default);
+        }
+
+        public virtual IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            return GroupByUntil_<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, capacity, comparer);
         }
 
-        private static IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil_<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, IEqualityComparer<TKey> comparer)
+        public virtual IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, int capacity)
+        {
+            return GroupByUntil_<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, capacity, EqualityComparer<TKey>.Default);
+        }
+
+        public virtual IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            return GroupByUntil_<TSource, TKey, TSource, TDuration>(source, keySelector, x => x, durationSelector, capacity, comparer);
+        }
+
+        public virtual IObservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>> durationSelector, int capacity)
+        {
+            return GroupByUntil_<TSource, TKey, TSource, TDuration>(source, keySelector, x => x, durationSelector, capacity, EqualityComparer<TKey>.Default);
+        }
+
+        private static IObservable<IGroupedObservable<TKey, TElement>> GroupByUntil_<TSource, TKey, TElement, TDuration>(IObservable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>> durationSelector, int? capacity, IEqualityComparer<TKey> comparer)
         {
 #if !NO_PERF
-            return new GroupByUntil<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, comparer);
+            return new GroupByUntil<TSource, TKey, TElement, TDuration>(source, keySelector, elementSelector, durationSelector, capacity, comparer);
 #else
             return new AnonymousObservable<IGroupedObservable<TKey, TElement>>(observer =>
             {
-                var map = new Dictionary<TKey, ISubject<TElement>>(comparer);
+                var map = capacity.HasValue
+                        ? new Dictionary<TKey, ISubject<TElement>>(capacity.Value, comparer)
+                        : new Dictionary<TKey, ISubject<TElement>>(comparer);
 
                 var groupDisposable = new CompositeDisposable();
                 var refCountDisposable = new RefCountDisposable(groupDisposable);
@@ -733,7 +772,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var select = source as Select<TSource>;
             if (select != null)
-                return select.Ω(selector);
+                return select.Omega(selector);
 
             return new Select<TSource, TResult>(source, selector);
 #else
@@ -853,6 +892,15 @@ namespace System.Reactive.Linq
 #endif
         }
 
+        public virtual IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, Task<TResult>> selector)
+        {
+#if !NO_PERF
+            return new SelectMany<TSource, TResult>(source, (x, i, token) => selector(x, i));
+#else
+            return SelectMany_<TSource, TResult>(source, (x, i) => selector(x, i).ToObservable());
+#endif
+        }
+
         public virtual IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, CancellationToken, Task<TResult>> selector)
         {
 #if !NO_PERF
@@ -861,6 +909,15 @@ namespace System.Reactive.Linq
             return SelectMany_<TSource, TResult>(source, x => FromAsync(ct => selector(x, ct)));
 #endif
         }
+
+        public virtual IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TResult>> selector)
+        {
+#if !NO_PERF
+            return new SelectMany<TSource, TResult>(source, selector);
+#else
+            return SelectMany_<TSource, TResult>(source, (x, i) => FromAsync(ct => selector(x, i, ct)));
+#endif
+        }
 #endif
 
         public virtual IObservable<TResult> SelectMany<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, IObservable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
@@ -883,6 +940,15 @@ namespace System.Reactive.Linq
 #endif
         }
 
+        public virtual IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(IObservable<TSource> source, Func<TSource, int, Task<TTaskResult>> taskSelector, Func<TSource, int, TTaskResult, TResult> resultSelector)
+        {
+#if !NO_PERF
+            return new SelectMany<TSource, TTaskResult, TResult>(source, (x, i, token) => taskSelector(x, i), resultSelector);
+#else
+            return SelectMany_<TSource, TTaskResult, TResult>(source, (x, i) => taskSelector(x, i).ToObservable(), (x, i, t, _) => resultSelector(x, i, t));
+#endif
+        }
+
         public virtual IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(IObservable<TSource> source, Func<TSource, CancellationToken, Task<TTaskResult>> taskSelector, Func<TSource, TTaskResult, TResult> resultSelector)
         {
 #if !NO_PERF
@@ -891,6 +957,15 @@ namespace System.Reactive.Linq
             return SelectMany_<TSource, TTaskResult, TResult>(source, x => FromAsync(ct => taskSelector(x, ct)), resultSelector);
 #endif
         }
+
+        public virtual IObservable<TResult> SelectMany<TSource, TTaskResult, TResult>(IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TTaskResult>> taskSelector, Func<TSource, int, TTaskResult, TResult> resultSelector)
+        {
+#if !NO_PERF
+            return new SelectMany<TSource, TTaskResult, TResult>(source, taskSelector, resultSelector);
+#else
+            return SelectMany_<TSource, TTaskResult, TResult>(source, (x, i) => FromAsync(ct => taskSelector(x, i, ct)), (x, i, t, _) => resultSelector(x, i, t));
+#endif
+        }
 #endif
 
         private static IObservable<TResult> SelectMany_<TSource, TResult>(IObservable<TSource> source, Func<TSource, IObservable<TResult>> selector)
@@ -901,7 +976,7 @@ namespace System.Reactive.Linq
             return source.Select(selector).Merge();
 #endif
         }
-
+        
         private static IObservable<TResult> SelectMany_<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> selector)
         {
 #if !NO_PERF
@@ -925,7 +1000,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             return new SelectMany<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
 #else
-            return SelectMany_<TSource, TResult>(source, x => collectionSelector(x).Select(y => resultSelector(x, y)));
+            return SelectMany_<TSource, TResult>(source, (x, i) => collectionSelector(x, i).Select((y, i2) => resultSelector(x, i, y, i2)));
 #endif
         }
 
@@ -946,19 +1021,23 @@ namespace System.Reactive.Linq
 #endif
         }
 
-        public virtual IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> onNext, Func<Exception, int, IObservable<TResult>> onError, Func<int, IObservable<TResult>> onCompleted)
+        public virtual IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> onNext, Func<Exception, IObservable<TResult>> onError, Func<IObservable<TResult>> onCompleted)
         {
 #if !NO_PERF
             return new SelectMany<TSource, TResult>(source, onNext, onError, onCompleted);
 #else
-            return source.Materialize().SelectMany(notification =>
+            return Defer(() =>
             {
-                if (notification.Kind == NotificationKind.OnNext)
-                    return onNext(notification.Value);
-                else if (notification.Kind == NotificationKind.OnError)
-                    return onError(notification.Exception);
-                else
-                    return onCompleted();
+                var index = 0;
+                return source.Materialize().SelectMany(notification =>
+                {
+                    if (notification.Kind == NotificationKind.OnNext)
+                        return onNext(notification.Value, checked(index++));
+                    else if (notification.Kind == NotificationKind.OnError)
+                        return onError(notification.Exception);
+                    else
+                        return onCompleted();
+                });
             });
 #endif
         }
@@ -977,7 +1056,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             return new SelectMany<TSource, TResult>(source, selector);
 #else
-            return SelectMany_<TSource, TResult, TResult>(source, selector, (_, x) => x);
+            return SelectMany_<TSource, TResult, TResult>(source, selector, (_, __, x, ___) => x);
 #endif
         }
 
@@ -986,6 +1065,11 @@ namespace System.Reactive.Linq
             return SelectMany_<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
         }
 
+        public virtual IObservable<TResult> SelectMany<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector)
+        {
+            return SelectMany_<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
+        }
+
         private static IObservable<TResult> SelectMany_<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
         {
 #if !NO_PERF
@@ -1045,9 +1129,67 @@ namespace System.Reactive.Linq
 #endif
         }
 
-        public virtual IObservable<TResult> SelectMany<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector)
+        private static IObservable<TResult> SelectMany_<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector)
         {
+#if !NO_PERF
             return new SelectMany<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
+#else
+            return new AnonymousObservable<TResult>(observer => 
+            {
+                var index = 0;
+
+                return source.Subscribe(
+                    x =>
+                    {
+                        var xs = default(IEnumerable<TCollection>);
+                        try
+                        {
+                            xs = collectionSelector(x, checked(index++));
+                        }
+                        catch (Exception exception)
+                        {
+                            observer.OnError(exception);
+                            return;
+                        }
+
+                        var e = xs.GetEnumerator();
+
+                        try
+                        {
+                            var eIndex = 0;
+                            var hasNext = true;
+                            while (hasNext)
+                            {
+                                hasNext = false;
+                                var current = default(TResult);
+
+                                try
+                                {
+                                    hasNext = e.MoveNext();
+                                    if (hasNext)
+                                        current = resultSelector(x, index, e.Current, checked(eIndex++));
+                                }
+                                catch (Exception exception)
+                                {
+                                    observer.OnError(exception);
+                                    return;
+                                }
+
+                                if (hasNext)
+                                    observer.OnNext(current);
+                            }
+                        }
+                        finally
+                        {
+                            if (e != null)
+                                e.Dispose();
+                        }
+                    },
+                    observer.OnError,
+                    observer.OnCompleted
+                )
+            });
+#endif
         }
 
         #endregion
@@ -1059,7 +1201,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var skip = source as Skip<TSource>;
             if (skip != null && skip._scheduler == null)
-                return skip.Ω(count);
+                return skip.Omega(count);
 
             return new Skip<TSource>(source, count);
 #else
@@ -1156,7 +1298,7 @@ namespace System.Reactive.Linq
         {
             var take = source as Take<TSource>;
             if (take != null && take._scheduler == null)
-                return take.Ω(count);
+                return take.Omega(count);
 
             return new Take<TSource>(source, count);
         }
@@ -1248,7 +1390,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var where = source as Where<TSource>;
             if (where != null)
-                return where.Ω(predicate);
+                return where.Omega(predicate);
 
             return new Where<TSource>(source, predicate);
 #else
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Time.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Time.cs
index 161e1c1..f495177 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Time.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.Time.cs
@@ -8,7 +8,7 @@ using System.Reactive.Subjects;
 namespace System.Reactive.Linq
 {
 #if !NO_PERF
-    using Observαble;
+    using ObservableImpl;
 #endif
 
     internal partial class QueryLanguage
@@ -612,7 +612,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var skip = source as Skip<TSource>;
             if (skip != null && skip._scheduler == scheduler)
-                return skip.Ω(duration);
+                return skip.Omega(duration);
 
             return new Skip<TSource>(source, duration, scheduler);
 #else
@@ -703,7 +703,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var skipUntil = source as SkipUntil<TSource>;
             if (skipUntil != null && skipUntil._scheduler == scheduler)
-                return skipUntil.Ω(startTime);
+                return skipUntil.Omega(startTime);
 
             return new SkipUntil<TSource>(source, startTime, scheduler);
 #else
@@ -747,7 +747,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var take = source as Take<TSource>;
             if (take != null && take._scheduler == scheduler)
-                return take.Ω(duration);
+                return take.Omega(duration);
 
             return new Take<TSource>(source, duration, scheduler);
 #else
@@ -914,7 +914,7 @@ namespace System.Reactive.Linq
 #if !NO_PERF
             var takeUntil = source as TakeUntil<TSource>;
             if (takeUntil != null && takeUntil._scheduler == scheduler)
-                return takeUntil.Ω(endTime);
+                return takeUntil.Omega(endTime);
 
             return new TakeUntil<TSource>(source, endTime, scheduler);
 #else
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/BehaviorSubject.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/BehaviorSubject.cs
index daf23eb..211ad09 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/BehaviorSubject.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Reactive/Subjects/BehaviorSubject.cs
@@ -11,6 +11,38 @@ namespace System.Reactive.Subjects
     /// <typeparam name="T">The type of the elements processed by the subject.</typeparam>
     public sealed class BehaviorSubject<T> : ISubject<T>, IDisposable
     {
+        /// <summary>
+        /// Gets the current value or throws an exception.
+        /// </summary>
+        /// <value>The initial value passed to the constructor until <see cref="OnNext"/> is called; after which, the last value passed to <see cref="OnNext"/>.</value>
+        /// <remarks>
+        /// <para><see cref="Value"/> is frozen after <see cref="OnCompleted"/> is called.</para>
+        /// <para>After <see cref="OnError"/> is called, <see cref="Value"/> always throws the specified exception.</para>
+        /// <para>An exception is always thrown after <see cref="Dispose"/> is called.</para>
+        /// <alert type="caller">
+        /// Reading <see cref="Value"/> is a thread-safe operation, though there's a potential race condition when <see cref="OnNext"/> or <see cref="OnError"/> are being invoked concurrently.
+        /// In some cases, it may be necessary for a caller to use external synchronization to avoid race conditions.
+        /// </alert>
+        /// </remarks>
+        /// <exception cref="ObjectDisposedException">Dispose was called.</exception>
+        public T Value
+        {
+            get
+            {
+                lock (_gate)
+                {
+                    CheckDisposed();
+
+                    if (_exception != null)
+                    {
+                        throw _exception;
+                    }
+
+                    return _value;
+                }
+            }
+        }
+
         private readonly object _gate = new object();
 
         private ImmutableList<IObserver<T>> _observers;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/Strings_Linq.Generated.cs b/external/rx/Rx/NET/Source/System.Reactive.Linq/Strings_Linq.Generated.cs
index 79f2dfb..3c9c6eb 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/Strings_Linq.Generated.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/Strings_Linq.Generated.cs
@@ -53,7 +53,7 @@ namespace System.Reactive
             {
                 if (object.ReferenceEquals(resourceMan, null))
                 {
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Reactive.Strings_Linq", typeof(Strings_Linq).GetTypeInfo().Assembly);
 #else
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Reactive.Strings_Linq", typeof(Strings_Linq).Assembly);
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Linq/System.Reactive.Linq.csproj b/external/rx/Rx/NET/Source/System.Reactive.Linq/System.Reactive.Linq.csproj
index 236393e..022ff0b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Linq/System.Reactive.Linq.csproj
+++ b/external/rx/Rx/NET/Source/System.Reactive.Linq/System.Reactive.Linq.csproj
@@ -12,6 +12,7 @@
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
     <CodeAnalysisRuleSet>..\Rx.ruleset</CodeAnalysisRuleSet>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU'">
     <OutputPath>bin\ReleaseXBLV\</OutputPath>
@@ -217,4 +218,5 @@
     <EmbeddedResource Include="Strings_Linq.resx" />
   </ItemGroup>
   <Import Project="..\Import.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
 </Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/Observable.Aliases.cs b/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/Observable.Aliases.cs
new file mode 100644
index 0000000..d2205cb
--- /dev/null
+++ b/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/Observable.Aliases.cs
@@ -0,0 +1,422 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#pragma warning disable 1591
+
+using System.Collections.Generic;
+using System.Reactive.Concurrency;
+using System.Reactive.Linq;
+using System.Reactive;
+
+#if !NO_TPL
+using System.Reactive.Threading.Tasks; // needed for doc comments
+using System.Threading;
+using System.Threading.Tasks;
+#endif
+
+/*
+ * Note: these methods just call methods in Observable.StandardSequenceOperators.cs
+ * in order to create the following method aliases:
+ * 
+ * Map     = Select
+ * FlatMap = SelectMany
+ * Filter  = Where
+ * 
+ */
+
+namespace System.Reactive.Observable.Aliases
+{
+    public static class QueryLanguage
+    {
+        #region + Map +
+
+        /// <summary>
+        /// Projects each element of an observable sequence into a new form. Synonym for the method 'Select'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by running the selector function for each element in the source sequence.</typeparam>
+        /// <param name="source">A sequence of elements to invoke a transform function on.</param>
+        /// <param name="selector">A transform function to apply to each source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the transform function on each element of source.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> Map<TSource, TResult>(this IObservable<TSource> source, Func<TSource, TResult> selector)
+        {
+            return source.Select<TSource, TResult>(selector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence into a new form by incorporating the element's index. Synonym for the method 'Select'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by running the selector function for each element in the source sequence.</typeparam>
+        /// <param name="source">A sequence of elements to invoke a transform function on.</param>
+        /// <param name="selector">A transform function to apply to each source element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the transform function on each element of source.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> Map<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, TResult> selector)
+        {
+            return source.Select<TSource, TResult>(selector);
+        }
+
+        #endregion
+
+        #region + FlatMap +
+
+        /// <summary>
+        /// Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. 
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TOther">The type of the elements in the other sequence and the elements in the result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="other">An observable sequence to project each element from the source sequence onto.</param>
+        /// <returns>An observable sequence whose elements are the result of projecting each source element onto the other sequence and merging all the resulting sequences together.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="other"/> is null.</exception>
+        public static IObservable<TOther> FlatMap<TSource, TOther>(this IObservable<TSource> source, IObservable<TOther> other)
+        {
+            return source.SelectMany<TSource, TOther>(other);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, IObservable<TResult>> selector)
+        {
+            return source.SelectMany<TSource, TResult>(selector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> selector)
+        {
+            return source.SelectMany<TSource, TResult>(selector);
+        }
+
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task and merges all of the task results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, Task<TResult>> selector)
+        {
+            return source.SelectMany<TSource, TResult>(selector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index and merges all of the task results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, Task<TResult>> selector)
+        {
+            return source.SelectMany<TSource, TResult>(selector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to a task with cancellation support and merges all of the task results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, CancellationToken, Task<TResult>> selector)
+        {
+            return source.SelectMany<TSource, TResult>(selector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index with cancellation support and merges all of the task results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TResult>> selector)
+        {
+            return source.SelectMany<TSource, TResult>(selector);
+        }
+#endif
+
+        /// <summary>
+        /// Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="collectionSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TCollection, TResult>(this IObservable<TSource> source, Func<TSource, IObservable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
+        {
+            return source.SelectMany<TSource, TCollection, TResult>(collectionSelector, resultSelector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to an observable sequence by incorporating the element's index, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element and the fourth parameter represents the index of the intermediate element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="collectionSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TCollection, TResult>(this IObservable<TSource> source, Func<TSource, int, IObservable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector)
+        {
+            return source.SelectMany<TSource, TCollection, TResult>(collectionSelector, resultSelector);
+        }
+
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="taskSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        public static IObservable<TResult> FlatMap<TSource, TTaskResult, TResult>(this IObservable<TSource> source, Func<TSource, Task<TTaskResult>> taskSelector, Func<TSource, TTaskResult, TResult> resultSelector)
+        {
+            return source.SelectMany<TSource, TTaskResult, TResult>(taskSelector, resultSelector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="taskSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        public static IObservable<TResult> FlatMap<TSource, TTaskResult, TResult>(this IObservable<TSource> source, Func<TSource, int, Task<TTaskResult>> taskSelector, Func<TSource, int, TTaskResult, TResult> resultSelector)
+        {
+            return source.SelectMany<TSource, TTaskResult, TResult>(taskSelector, resultSelector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to a task with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="taskSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        public static IObservable<TResult> FlatMap<TSource, TTaskResult, TResult>(this IObservable<TSource> source, Func<TSource, CancellationToken, Task<TTaskResult>> taskSelector, Func<TSource, TTaskResult, TResult> resultSelector)
+        {
+            return source.SelectMany<TSource, TTaskResult, TResult>(taskSelector, resultSelector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="taskSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="TaskObservableExtensions.ToObservable<TResult>"/>.</remarks>
+        public static IObservable<TResult> FlatMap<TSource, TTaskResult, TResult>(this IObservable<TSource> source, Func<TSource, int, CancellationToken, Task<TTaskResult>> taskSelector, Func<TSource, int, TTaskResult, TResult> resultSelector)
+        {
+            return source.SelectMany<TSource, TTaskResult, TResult>(taskSelector, resultSelector);
+        }
+#endif
+
+        /// <summary>
+        /// Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of notifications to project.</param>
+        /// <param name="onNext">A transform function to apply to each element.</param>
+        /// <param name="onError">A transform function to apply when an error occurs in the source sequence.</param>
+        /// <param name="onCompleted">A transform function to apply when the end of the source sequence is reached.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="onNext"/> or <paramref name="onError"/> or <paramref name="onCompleted"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, IObservable<TResult>> onNext, Func<Exception, IObservable<TResult>> onError, Func<IObservable<TResult>> onCompleted)
+        {
+            return source.SelectMany<TSource, TResult>(onNext, onError, onCompleted);
+        }
+
+        /// <summary>
+        /// Projects each notification of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of notifications to project.</param>
+        /// <param name="onNext">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="onError">A transform function to apply when an error occurs in the source sequence.</param>
+        /// <param name="onCompleted">A transform function to apply when the end of the source sequence is reached.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="onNext"/> or <paramref name="onError"/> or <paramref name="onCompleted"/> is null.</exception>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> onNext, Func<Exception, IObservable<TResult>> onError, Func<IObservable<TResult>> onCompleted)
+        {
+            return source.SelectMany<TSource, TResult>(onNext, onError, onCompleted);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence and concatenates the resulting enumerable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="Linq.Observable.ToObservable<TSource>(IEnumerable<TSource>)"/> conversion.</remarks>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)
+        {
+            return source.SelectMany<TSource, TResult>(selector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence by incorporating the element's index and concatenates the resulting enumerable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="selector"/> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="Linq.Observable.ToObservable<TSource>(IEnumerable<TSource>)"/> conversion.</remarks>
+        public static IObservable<TResult> FlatMap<TSource, TResult>(this IObservable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector)
+        {
+            return source.SelectMany<TSource, TResult>(selector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="collectionSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="Linq.Observable.ToObservable<TSource>(IEnumerable<TSource>)"/> conversion.</remarks>
+        public static IObservable<TResult> FlatMap<TSource, TCollection, TResult>(this IObservable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
+        {
+            return source.SelectMany<TSource, TCollection, TResult>(collectionSelector, resultSelector);
+        }
+
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence by incorporating the element's index, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element and the fourth parameter represents the index of the intermediate element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="collectionSelector"/> or <paramref name="resultSelector"/> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="Linq.Observable.ToObservable<TSource>(IEnumerable<TSource>)"/> conversion.</remarks>
+        public static IObservable<TResult> FlatMap<TSource, TCollection, TResult>(this IObservable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector)
+        {
+            return source.SelectMany<TSource, TCollection, TResult>(collectionSelector, resultSelector);
+        }
+
+        #endregion
+
+        #region + Filter +
+
+        /// <summary>
+        /// Filters the elements of an observable sequence based on a predicate.
+        /// Synonym for the method 'Where'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to filter.</param>
+        /// <param name="predicate">A function to test each source element for a condition.</param>
+        /// <returns>An observable sequence that contains elements from the input sequence that satisfy the condition.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="predicate"/> is null.</exception>
+        public static IObservable<TSource> Filter<TSource>(this IObservable<TSource> source, Func<TSource, bool> predicate)
+        {
+            return source.Where<TSource>(predicate);
+        }
+
+        /// <summary>
+        /// Filters the elements of an observable sequence based on a predicate by incorporating the element's index.
+        /// Synonym for the method 'Where'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to filter.</param>
+        /// <param name="predicate">A function to test each source element for a conditio; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence that contains elements from the input sequence that satisfy the condition.</returns>
+        /// <exception cref="ArgumentNullException"><paramref name="source"/> or <paramref name="predicate"/> is null.</exception>
+        public static IObservable<TSource> Filter<TSource>(this IObservable<TSource> source, Func<TSource, int, bool> predicate)
+        {
+            return source.Where<TSource>(predicate);
+        }
+
+        #endregion
+    }
+
+}
+
+#pragma warning restore 1591
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/Qbservable.Aliases.Generated.cs b/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/Qbservable.Aliases.Generated.cs
new file mode 100644
index 0000000..deeaf57
--- /dev/null
+++ b/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/Qbservable.Aliases.Generated.cs
@@ -0,0 +1,449 @@
+/*
+ * WARNING: Auto-generated file (11/21/2013 11:07:25 AM)
+ * Run Rx's auto-homoiconizer tool to generate this file (in the HomoIcon directory).
+ */
+
+#pragma warning disable 1591
+
+#if !NO_EXPRESSIONS
+
+using System;
+using System.Reactive.Concurrency;
+using System.Collections.Generic;
+using System.Reactive.Joins;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Threading;
+using System.Reactive;
+using System.Reactive.Subjects;
+#if !NO_TPL
+using System.Threading.Tasks;
+#endif
+#if !NO_REMOTING
+using System.Runtime.Remoting.Lifetime;
+#endif
+
+namespace System.Reactive.Linq
+{
+    public static partial class QbservableAliases
+    {
+        /// <summary>
+        /// Filters the elements of an observable sequence based on a predicate.
+        /// Synonym for the method 'Where'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to filter.</param>
+        /// <param name="predicate">A function to test each source element for a condition.</param>
+        /// <returns>An observable sequence that contains elements from the input sequence that satisfy the condition.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="predicate" /> is null.</exception>
+        public static IQbservable<TSource> Filter<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, bool>> predicate)
+        {
+            return Qbservable.Where<TSource>(source, predicate);
+        }
+        
+        /// <summary>
+        /// Filters the elements of an observable sequence based on a predicate by incorporating the element's index.
+        /// Synonym for the method 'Where'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to filter.</param>
+        /// <param name="predicate">A function to test each source element for a conditio; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence that contains elements from the input sequence that satisfy the condition.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="predicate" /> is null.</exception>
+        public static IQbservable<TSource> Filter<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int, bool>> predicate)
+        {
+            return Qbservable.Where<TSource>(source, predicate);
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="collectionSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IObservable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector)
+        {
+            return Qbservable.SelectMany<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an observable sequence by incorporating the element's index, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element and the fourth parameter represents the index of the intermediate element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="collectionSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IObservable<TCollection>>> collectionSelector, Expression<Func<TSource, int, TCollection, int, TResult>> resultSelector)
+        {
+            return Qbservable.SelectMany<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="collectionSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
+        public static IQbservable<TResult> FlatMap<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector)
+        {
+            return Qbservable.SelectMany<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence by incorporating the element's index, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element and the fourth parameter represents the index of the intermediate element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="collectionSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
+        public static IQbservable<TResult> FlatMap<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, int, TCollection, int, TResult>> resultSelector)
+        {
+            return Qbservable.SelectMany<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
+        }
+        
+        /// <summary>
+        /// Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence. 
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TOther">The type of the elements in the other sequence and the elements in the result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="other">An observable sequence to project each element from the source sequence onto.</param>
+        /// <returns>An observable sequence whose elements are the result of projecting each source element onto the other sequence and merging all the resulting sequences together.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="other" /> is null.</exception>
+        public static IQbservable<TOther> FlatMap<TSource, TOther>(this IQbservable<TSource> source, IObservable<TOther> other)
+        {
+            return Qbservable.SelectMany<TSource, TOther>(source, other);
+        }
+        
+        /// <summary>
+        /// Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of notifications to project.</param>
+        /// <param name="onNext">A transform function to apply to each element.</param>
+        /// <param name="onError">A transform function to apply when an error occurs in the source sequence.</param>
+        /// <param name="onCompleted">A transform function to apply when the end of the source sequence is reached.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="onNext" /> or <paramref name="onError" /> or <paramref name="onCompleted" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IObservable<TResult>>> onNext, Expression<Func<Exception, IObservable<TResult>>> onError, Expression<Func<IObservable<TResult>>> onCompleted)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, onNext, onError, onCompleted);
+        }
+        
+        /// <summary>
+        /// Projects each notification of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of notifications to project.</param>
+        /// <param name="onNext">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="onError">A transform function to apply when an error occurs in the source sequence.</param>
+        /// <param name="onCompleted">A transform function to apply when the end of the source sequence is reached.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="onNext" /> or <paramref name="onError" /> or <paramref name="onCompleted" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IObservable<TResult>>> onNext, Expression<Func<Exception, IObservable<TResult>>> onError, Expression<Func<IObservable<TResult>>> onCompleted)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, onNext, onError, onCompleted);
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IObservable<TResult>>> selector)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, selector);
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IObservable<TResult>>> selector)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, selector);
+        }
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task and merges all of the task results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, Task<TResult>>> selector)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, selector);
+        }
+#endif
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index and merges all of the task results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, Task<TResult>>> selector)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, selector);
+        }
+#endif
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task with cancellation support and merges all of the task results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, CancellationToken, Task<TResult>>> selector)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, selector);
+        }
+#endif
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index with cancellation support and merges all of the task results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, CancellationToken, Task<TResult>>> selector)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, selector);
+        }
+#endif
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence and concatenates the resulting enumerable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IEnumerable<TResult>>> selector)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, selector);
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence by incorporating the element's index and concatenates the resulting enumerable sequences into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
+        public static IQbservable<TResult> FlatMap<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IEnumerable<TResult>>> selector)
+        {
+            return Qbservable.SelectMany<TSource, TResult>(source, selector);
+        }
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="taskSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        public static IQbservable<TResult> FlatMap<TSource, TTaskResult, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, Task<TTaskResult>>> taskSelector, Expression<Func<TSource, TTaskResult, TResult>> resultSelector)
+        {
+            return Qbservable.SelectMany<TSource, TTaskResult, TResult>(source, taskSelector, resultSelector);
+        }
+#endif
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="taskSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        public static IQbservable<TResult> FlatMap<TSource, TTaskResult, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, Task<TTaskResult>>> taskSelector, Expression<Func<TSource, int, TTaskResult, TResult>> resultSelector)
+        {
+            return Qbservable.SelectMany<TSource, TTaskResult, TResult>(source, taskSelector, resultSelector);
+        }
+#endif
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="taskSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        public static IQbservable<TResult> FlatMap<TSource, TTaskResult, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, CancellationToken, Task<TTaskResult>>> taskSelector, Expression<Func<TSource, TTaskResult, TResult>> resultSelector)
+        {
+            return Qbservable.SelectMany<TSource, TTaskResult, TResult>(source, taskSelector, resultSelector);
+        }
+#endif
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Synonym for the method 'SelectMany'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="taskSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        public static IQbservable<TResult> FlatMap<TSource, TTaskResult, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, CancellationToken, Task<TTaskResult>>> taskSelector, Expression<Func<TSource, int, TTaskResult, TResult>> resultSelector)
+        {
+            return Qbservable.SelectMany<TSource, TTaskResult, TResult>(source, taskSelector, resultSelector);
+        }
+#endif
+        
+        /// <summary>
+        /// Projects each element of an observable sequence into a new form. Synonym for the method 'Select'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by running the selector function for each element in the source sequence.</typeparam>
+        /// <param name="source">A sequence of elements to invoke a transform function on.</param>
+        /// <param name="selector">A transform function to apply to each source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the transform function on each element of source.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        public static IQbservable<TResult> Map<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, TResult>> selector)
+        {
+            return Qbservable.Select<TSource, TResult>(source, selector);
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence into a new form by incorporating the element's index. Synonym for the method 'Select'
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by running the selector function for each element in the source sequence.</typeparam>
+        /// <param name="source">A sequence of elements to invoke a transform function on.</param>
+        /// <param name="selector">A transform function to apply to each source element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the transform function on each element of source.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        public static IQbservable<TResult> Map<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, TResult>> selector)
+        {
+            return Qbservable.Select<TSource, TResult>(source, selector);
+        }
+        
+    }
+}
+
+#endif
+
+#pragma warning restore 1591
+
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/System.Reactive.Observable.Aliases.csproj b/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/System.Reactive.Observable.Aliases.csproj
new file mode 100644
index 0000000..52ef7a5
--- /dev/null
+++ b/external/rx/Rx/NET/Source/System.Reactive.Observable.Aliases/System.Reactive.Observable.Aliases.csproj
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{9FFAC385-10A4-4DDD-B800-DE67E8469CC0}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>System.Reactive.Observable.Aliases</RootNamespace>
+    <AssemblyName>System.Reactive.Observable.Aliases</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProductSignAssembly>false</ProductSignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject />
+  </PropertyGroup>
+  <Import Project="..\Common.targets" />
+  <PropertyGroup>
+    <DocumentationFile>$(OutputPath)\$(AssemblyName).XML</DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Observable.Aliases.cs" />
+    <Compile Include="Qbservable.Aliases.Generated.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\System.Reactive.Core\System.Reactive.Core.csproj">
+      <Project>{4e516f10-da7a-4d43-963e-a93865abea5b}</Project>
+      <Name>System.Reactive.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\System.Reactive.Interfaces\System.Reactive.Interfaces.csproj">
+      <Project>{9e9b9c60-98b0-40fa-9c2b-1218d417caa4}</Project>
+      <Name>System.Reactive.Interfaces</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\System.Reactive.Linq\System.Reactive.Linq.csproj">
+      <Project>{63252ae9-5186-45ca-bfcd-fa51c6b66a43}</Project>
+      <Name>System.Reactive.Linq</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\System.Reactive.Providers\System.Reactive.Providers.csproj">
+      <Project>{c7b9d7be-f47f-466b-a6b0-e46f1069b171}</Project>
+      <Name>System.Reactive.Providers</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <Import Project="..\Import.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
+</Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Properties/AssemblyInfo.cs
index 4d3ccea..2e97541 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Properties/AssemblyInfo.cs
@@ -27,11 +27,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-#if XBOX_LAKEVIEW
-[assembly: SecurityTransparent]
-#endif
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.cs b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.cs
index 4c91463..7cb011b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/ConcurrencyAbstractionLayerImpl.cs
@@ -22,16 +22,21 @@ namespace System.Reactive.Concurrency
 
         public IDisposable StartPeriodicTimer(Action action, TimeSpan period)
         {
-            //
-            // MSDN documentation states the following:
-            //
-            //    "If period is zero (0) or negative one (-1) milliseconds and dueTime is positive, callback is invoked once;
-            //     the periodic behavior of the timer is disabled, but can be re-enabled using the Change method."
-            //
-            if (period <= TimeSpan.Zero)
+            if (period < TimeSpan.Zero)
                 throw new ArgumentOutOfRangeException("period");
 
-            return new PeriodicTimer(action, period);
+            //
+            // The contract for periodic scheduling in Rx is that specifying TimeSpan.Zero as the period causes the scheduler to 
+            // call back periodically as fast as possible, sequentially.
+            //
+            if (period == TimeSpan.Zero)
+            {
+                return new FastPeriodicTimer(action);
+            }
+            else
+            {
+                return new PeriodicTimer(action, period);
+            }
         }
 
         public IDisposable QueueUserWorkItem(Action<object> action, object state)
@@ -366,6 +371,37 @@ namespace System.Reactive.Concurrency
             }
         }
 #endif
+
+        class FastPeriodicTimer : IDisposable
+        {
+            private readonly Action _action;
+            private bool disposed;
+
+            public FastPeriodicTimer(Action action)
+            {
+                _action = action;
+                
+                new System.Threading.Thread(Loop)
+                {
+                    Name = "Rx-FastPeriodicTimer",
+                    IsBackground = true
+                }
+                .Start();
+            }
+            
+            private void Loop()
+            {
+                while (!disposed)
+                {
+                    _action();
+                }
+            }
+
+            public void Dispose()
+            {
+                disposed = true;
+            }
+        }
     }
 }
 #endif
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/EventLoopScheduler.cs b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/EventLoopScheduler.cs
index 8739895..98df416 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/EventLoopScheduler.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/EventLoopScheduler.cs
@@ -296,6 +296,16 @@ namespace System.Reactive.Concurrency
                 lock (_gate)
                 {
                     //
+                    // Bug fix that ensures the number of calls to Release never greatly exceeds the number of calls to Wait.
+                    // See work item #37: https://rx.codeplex.com/workitem/37
+                    //
+#if !NO_CDS
+                    while (_evt.CurrentCount > 0) _evt.Wait();
+#else
+                    while (_evt.WaitOne(TimeSpan.Zero)) { }
+#endif
+
+                    //
                     // The event could have been set by a call to Dispose. This takes priority over anything else. We quit the
                     // loop immediately. Subsequent calls to Schedule won't ever create a new thread.
                     //
diff --git a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/TaskPoolScheduler.cs b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/TaskPoolScheduler.cs
index a84588b..a27e7a6 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/TaskPoolScheduler.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Concurrency/TaskPoolScheduler.cs
@@ -111,7 +111,11 @@ namespace System.Reactive.Concurrency
             var ct = new CancellationDisposable();
             d.Disposable = ct;
 
+#if USE_TASKEX
+            TaskEx.Delay(dueTime, ct.Token).ContinueWith(_ =>
+#else
             Task.Delay(dueTime, ct.Token).ContinueWith(_ =>
+#endif
             {
                 if (!d.IsDisposed)
                     d.Disposable = action(this, state);
@@ -190,7 +194,11 @@ namespace System.Reactive.Concurrency
             var moveNext = default(Action);
             moveNext = () =>
             {
+#if USE_TASKEX
+                TaskEx.Delay(period, cancel.Token).ContinueWith(
+#else
                 Task.Delay(period, cancel.Token).ContinueWith(
+#endif
                     _ =>
                     {
                         moveNext();
diff --git a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/PlatformEnlightenmentProvider.cs b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/PlatformEnlightenmentProvider.cs
index 7bb597c..881178b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/PlatformEnlightenmentProvider.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Reactive/Internal/PlatformEnlightenmentProvider.cs
@@ -88,7 +88,7 @@ namespace System.Reactive.PlatformServices
 #if NETCF35
                     var name = "System.Reactive.Linq.QueryDebugger, System.Reactive.Debugger";
 #else
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
                     var ifType = t.GetTypeInfo();
 #else
                     var ifType = t;
diff --git a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Strings_PlatformServices.Generated.cs b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Strings_PlatformServices.Generated.cs
index b9330af..7ac002d 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Strings_PlatformServices.Generated.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/Strings_PlatformServices.Generated.cs
@@ -53,7 +53,7 @@ namespace System.Reactive
             {
                 if (object.ReferenceEquals(resourceMan, null))
                 {
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Reactive.Strings_PlatformServices", typeof(Strings_PlatformServices).GetTypeInfo().Assembly);
 #else
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Reactive.Strings_PlatformServices", typeof(Strings_PlatformServices).Assembly);
diff --git a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/System.Reactive.PlatformServices.csproj b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/System.Reactive.PlatformServices.csproj
index e40f2ab..10f8aa2 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/System.Reactive.PlatformServices.csproj
+++ b/external/rx/Rx/NET/Source/System.Reactive.PlatformServices/System.Reactive.PlatformServices.csproj
@@ -12,6 +12,7 @@
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
     <CodeAnalysisRuleSet>..\Rx.ruleset</CodeAnalysisRuleSet>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU'">
     <OutputPath>bin\ReleaseXBLV\</OutputPath>
@@ -72,4 +73,5 @@
     </EmbeddedResource>
   </ItemGroup>
   <Import Project="..\Import.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
 </Project>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Providers/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Providers/Properties/AssemblyInfo.cs
index cc2c4be..1065aa9 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Providers/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Providers/Properties/AssemblyInfo.cs
@@ -27,7 +27,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePattern.cs b/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePattern.cs
index 306f934..0fe90d1 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePattern.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePattern.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
 #pragma warning disable 1591
 
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePlan.cs b/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePlan.cs
index cb89983..96aab7c 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePlan.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Joins/QueryablePlan.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 
 #pragma warning disable 1591
 
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/Qbservable.Generated.cs b/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/Qbservable.Generated.cs
index 2a5f3e4..0c80cf9 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/Qbservable.Generated.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/Linq/Qbservable.Generated.cs
@@ -1,5 +1,5 @@
-/*
- * WARNING: Auto-generated file (1/10/2013 8:30:32 PM)
+/*
+ * WARNING: Auto-generated file (11/21/2013 11:07:25 AM)
  * Run Rx's auto-homoiconizer tool to generate this file (in the HomoIcon directory).
  */
 
@@ -7341,6 +7341,80 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <returns>A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="keySelector" /> is null.</exception>
+        /// <exception cref="T:System.ArgumentOutOfRangeException">
+        /// <paramref name="capacity" /> is less than 0.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, int capacity)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TSource>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.GroupBy<TSource, TKey>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(int))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)),
+#endif
+                    source.Expression,
+                    keySelector,
+                    Expression.Constant(capacity, typeof(int))
+                )
+            );
+        }
+        
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and comparer.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <returns>A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="comparer" /> is null.</exception>
+        /// <exception cref="T:System.ArgumentOutOfRangeException">
+        /// <paramref name="capacity" /> is less than 0.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TSource>> GroupBy<TSource, TKey>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
+            
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TSource>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.GroupBy<TSource, TKey>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(int), default(IEqualityComparer<TKey>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)),
+#endif
+                    source.Expression,
+                    keySelector,
+                    Expression.Constant(capacity, typeof(int)),
+                    Expression.Constant(comparer, typeof(IEqualityComparer<TKey>))
+                )
+            );
+        }
+        
+        /// <summary>
         /// Groups the elements of an observable sequence according to a specified key selector function and comparer.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
@@ -7412,6 +7486,90 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity and selects the resulting elements by using a specified function.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TElement">The type of the elements within the groups computed for each element in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <returns>A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="elementSelector" /> is null.</exception>
+        /// <exception cref="T:System.ArgumentOutOfRangeException">
+        /// <paramref name="capacity" /> is less than 0.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, int capacity)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (elementSelector == null)
+                throw new ArgumentNullException("elementSelector");
+            
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TElement>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.GroupBy<TSource, TKey, TElement>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<TSource, TElement>>), default(int))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement)),
+#endif
+                    source.Expression,
+                    keySelector,
+                    elementSelector,
+                    Expression.Constant(capacity, typeof(int))
+                )
+            );
+        }
+        
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and comparer and selects the resulting elements by using a specified function.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TElement">The type of the elements within the groups computed for each element in the source sequence.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <returns>A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="elementSelector" /> or <paramref name="comparer" /> is null.</exception>
+        /// <exception cref="T:System.ArgumentOutOfRangeException">
+        /// <paramref name="capacity" /> is less than 0.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (elementSelector == null)
+                throw new ArgumentNullException("elementSelector");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
+            
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TElement>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.GroupBy<TSource, TKey, TElement>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<TSource, TElement>>), default(int), default(IEqualityComparer<TKey>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement)),
+#endif
+                    source.Expression,
+                    keySelector,
+                    elementSelector,
+                    Expression.Constant(capacity, typeof(int)),
+                    Expression.Constant(comparer, typeof(IEqualityComparer<TKey>))
+                )
+            );
+        }
+        
+        /// <summary>
         /// Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
@@ -7452,93 +7610,283 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Groups the elements of an observable sequence according to a specified key selector function.
+        /// Groups the elements of an observable sequence according to a specified key selector function.
+        /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
+        /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <returns>
+        /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
+        /// </returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="durationSelector" /> is null.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>> durationSelector)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (durationSelector == null)
+                throw new ArgumentNullException("durationSelector");
+            
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TSource>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TDuration)),
+#endif
+                    source.Expression,
+                    keySelector,
+                    durationSelector
+                )
+            );
+        }
+        
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function.
+        /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
+        /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <returns>
+        /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
+        /// </returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="durationSelector" /> is null.</exception>
+        /// <exception cref="T:System.ArgumentOutOfRangeException">
+        /// <paramref name="capacity" /> is less than 0.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>> durationSelector, int capacity)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (durationSelector == null)
+                throw new ArgumentNullException("durationSelector");
+            
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TSource>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>>), default(int))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TDuration)),
+#endif
+                    source.Expression,
+                    keySelector,
+                    durationSelector,
+                    Expression.Constant(capacity, typeof(int))
+                )
+            );
+        }
+        
+        /// <summary>
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and comparer.
+        /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
+        /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <returns>
+        /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
+        /// </returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="durationSelector" /> or <paramref name="comparer" /> is null.</exception>
+        /// <exception cref="T:System.ArgumentOutOfRangeException">
+        /// <paramref name="capacity" /> is less than 0.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>> durationSelector, int capacity, IEqualityComparer<TKey> comparer)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (durationSelector == null)
+                throw new ArgumentNullException("durationSelector");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
+            
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TSource>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>>), default(int), default(IEqualityComparer<TKey>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TDuration)),
+#endif
+                    source.Expression,
+                    keySelector,
+                    durationSelector,
+                    Expression.Constant(capacity, typeof(int)),
+                    Expression.Constant(comparer, typeof(IEqualityComparer<TKey>))
+                )
+            );
+        }
+        
+        /// <summary>
+        /// Groups the elements of an observable sequence according to a specified key selector function and comparer.
+        /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
+        /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
+        /// <param name="source">An observable sequence whose elements to group.</param>
+        /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <returns>
+        /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
+        /// </returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="durationSelector" /> or <paramref name="comparer" /> is null.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>> durationSelector, IEqualityComparer<TKey> comparer)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (keySelector == null)
+                throw new ArgumentNullException("keySelector");
+            if (durationSelector == null)
+                throw new ArgumentNullException("durationSelector");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
+            
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TSource>>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>>), default(IEqualityComparer<TKey>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TDuration)),
+#endif
+                    source.Expression,
+                    keySelector,
+                    durationSelector,
+                    Expression.Constant(comparer, typeof(IEqualityComparer<TKey>))
+                )
+            );
+        }
+        
+        /// <summary>
+        /// Groups the elements of an observable sequence according to a specified key selector function and selects the resulting elements by using a specified function.
         /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
         /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TElement">The type of the elements within the groups computed for each element in the source sequence.</typeparam>
         /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
         /// <param name="source">An observable sequence whose elements to group.</param>
         /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
         /// <param name="durationSelector">A function to signal the expiration of a group.</param>
         /// <returns>
         /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
         /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
         /// </returns>
         /// <exception cref="T:System.ArgumentNullException">
-        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="durationSelector" /> is null.</exception>
-        public static IQbservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>> durationSelector)
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="elementSelector" /> or <paramref name="durationSelector" /> is null.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, Expression<Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>> durationSelector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (keySelector == null)
                 throw new ArgumentNullException("keySelector");
+            if (elementSelector == null)
+                throw new ArgumentNullException("elementSelector");
             if (durationSelector == null)
                 throw new ArgumentNullException("durationSelector");
             
-            return source.Provider.CreateQuery<IGroupedObservable<TKey, TSource>>(
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TElement>>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>>))),
+                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TElement, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<TSource, TElement>>), default(Expression<Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>>))),
 #else
-                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TDuration)),
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement), typeof(TDuration)),
 #endif
                     source.Expression,
                     keySelector,
+                    elementSelector,
                     durationSelector
                 )
             );
         }
         
         /// <summary>
-        /// Groups the elements of an observable sequence according to a specified key selector function and comparer.
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and selects the resulting elements by using a specified function.
         /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
         /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TKey">The type of the grouping key computed for each element in the source sequence.</typeparam>
+        /// <typeparam name="TElement">The type of the elements within the groups computed for each element in the source sequence.</typeparam>
         /// <typeparam name="TDuration">The type of the elements in the duration sequences obtained for each group to denote its lifetime.</typeparam>
         /// <param name="source">An observable sequence whose elements to group.</param>
         /// <param name="keySelector">A function to extract the key for each element.</param>
+        /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
         /// <param name="durationSelector">A function to signal the expiration of a group.</param>
-        /// <param name="comparer">An equality comparer to compare keys with.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
         /// <returns>
         /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
         /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
         /// </returns>
         /// <exception cref="T:System.ArgumentNullException">
-        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="durationSelector" /> or <paramref name="comparer" /> is null.</exception>
-        public static IQbservable<IGroupedObservable<TKey, TSource>> GroupByUntil<TSource, TKey, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>> durationSelector, IEqualityComparer<TKey> comparer)
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="elementSelector" /> or <paramref name="durationSelector" /> is null.</exception>
+        /// <exception cref="T:System.ArgumentOutOfRangeException">
+        /// <paramref name="capacity" /> is less than 0.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, Expression<Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>> durationSelector, int capacity)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (keySelector == null)
                 throw new ArgumentNullException("keySelector");
+            if (elementSelector == null)
+                throw new ArgumentNullException("elementSelector");
             if (durationSelector == null)
                 throw new ArgumentNullException("durationSelector");
-            if (comparer == null)
-                throw new ArgumentNullException("comparer");
             
-            return source.Provider.CreateQuery<IGroupedObservable<TKey, TSource>>(
+            return source.Provider.CreateQuery<IGroupedObservable<TKey, TElement>>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<IGroupedObservable<TKey, TSource>, IObservable<TDuration>>>), default(IEqualityComparer<TKey>))),
+                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TElement, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<TSource, TElement>>), default(Expression<Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>>), default(int))),
 #else
-                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TDuration)),
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement), typeof(TDuration)),
 #endif
                     source.Expression,
                     keySelector,
+                    elementSelector,
                     durationSelector,
-                    Expression.Constant(comparer, typeof(IEqualityComparer<TKey>))
+                    Expression.Constant(capacity, typeof(int))
                 )
             );
         }
         
         /// <summary>
-        /// Groups the elements of an observable sequence according to a specified key selector function and selects the resulting elements by using a specified function.
+        /// Groups the elements of an observable sequence with the specified initial capacity according to a specified key selector function and comparer and selects the resulting elements by using a specified function.
         /// A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same
         /// key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.
         /// </summary>
@@ -7550,13 +7898,17 @@ namespace System.Reactive.Linq
         /// <param name="keySelector">A function to extract the key for each element.</param>
         /// <param name="elementSelector">A function to map each source element to an element in an observable group.</param>
         /// <param name="durationSelector">A function to signal the expiration of a group.</param>
+        /// <param name="capacity">The initial number of elements that the underlying dictionary can contain.</param>
+        /// <param name="comparer">An equality comparer to compare keys with.</param>
         /// <returns>
         /// A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.
-        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.
+        /// If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encountered.
         /// </returns>
         /// <exception cref="T:System.ArgumentNullException">
-        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="elementSelector" /> or <paramref name="durationSelector" /> is null.</exception>
-        public static IQbservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, Expression<Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>> durationSelector)
+        /// <paramref name="source" /> or <paramref name="keySelector" /> or <paramref name="elementSelector" /> or <paramref name="durationSelector" /> or <paramref name="comparer" /> is null.</exception>
+        /// <exception cref="T:System.ArgumentOutOfRangeException">
+        /// <paramref name="capacity" /> is less than 0.</exception>
+        public static IQbservable<IGroupedObservable<TKey, TElement>> GroupByUntil<TSource, TKey, TElement, TDuration>(this IQbservable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, Expression<Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>> durationSelector, int capacity, IEqualityComparer<TKey> comparer)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -7566,19 +7918,23 @@ namespace System.Reactive.Linq
                 throw new ArgumentNullException("elementSelector");
             if (durationSelector == null)
                 throw new ArgumentNullException("durationSelector");
+            if (comparer == null)
+                throw new ArgumentNullException("comparer");
             
             return source.Provider.CreateQuery<IGroupedObservable<TKey, TElement>>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TElement, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<TSource, TElement>>), default(Expression<Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>>))),
+                    InfoOf(() => Qbservable.GroupByUntil<TSource, TKey, TElement, TDuration>(default(IQbservable<TSource>), default(Expression<Func<TSource, TKey>>), default(Expression<Func<TSource, TElement>>), default(Expression<Func<IGroupedObservable<TKey, TElement>, IObservable<TDuration>>>), default(int), default(IEqualityComparer<TKey>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement), typeof(TDuration)),
 #endif
                     source.Expression,
                     keySelector,
                     elementSelector,
-                    durationSelector
+                    durationSelector,
+                    Expression.Constant(capacity, typeof(int)),
+                    Expression.Constant(comparer, typeof(IEqualityComparer<TKey>))
                 )
             );
         }
@@ -8508,27 +8864,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Int32" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Double" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Int32>" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Double" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<int?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int?>> selector)
+        public static IQbservable<double> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, double>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<int?>(
+            return source.Provider.CreateQuery<double>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, int?>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, double>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8539,27 +8895,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Int64" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Single" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Int64>" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Single" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<long?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, long?>> selector)
+        public static IQbservable<float> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, float>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<long?>(
+            return source.Provider.CreateQuery<float>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, long?>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, float>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8570,27 +8926,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Double" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Decimal" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Double" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Decimal" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<double> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, double>> selector)
+        public static IQbservable<decimal> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, decimal>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<double>(
+            return source.Provider.CreateQuery<decimal>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, double>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, decimal>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8601,27 +8957,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Single" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Int32" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Single" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Int32" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<float> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, float>> selector)
+        public static IQbservable<int> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<float>(
+            return source.Provider.CreateQuery<int>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, float>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, int>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8632,27 +8988,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Decimal" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Int64" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Decimal" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Int64" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<decimal> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, decimal>> selector)
+        public static IQbservable<long> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, long>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<decimal>(
+            return source.Provider.CreateQuery<long>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, decimal>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, long>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8663,27 +9019,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Int32" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Double" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Int32" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Double>" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<int> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int>> selector)
+        public static IQbservable<double?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, double?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<int>(
+            return source.Provider.CreateQuery<double?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, int>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, double?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8694,27 +9050,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum <see cref="T:System.Int64" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Single" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Int64" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Single>" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<long> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, long>> selector)
+        public static IQbservable<float?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, float?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<long>(
+            return source.Provider.CreateQuery<float?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, long>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, float?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8725,27 +9081,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Double" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Decimal" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Double>" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Decimal>" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<double?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, double?>> selector)
+        public static IQbservable<decimal?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, decimal?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<double?>(
+            return source.Provider.CreateQuery<decimal?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, double?>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, decimal?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8756,27 +9112,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Single" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Int32" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Single>" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Int32>" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<float?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, float?>> selector)
+        public static IQbservable<int?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<float?>(
+            return source.Provider.CreateQuery<int?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, float?>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, int?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -8787,27 +9143,27 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Decimal" /> value.
+        /// Invokes a transform function on each element of a sequence and returns the maximum nullable <see cref="T:System.Int64" /> value.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values to determine the maximum value of.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Decimal>" /> that corresponds to the maximum value in the source sequence.</returns>
+        /// <returns>An observable sequence containing a single element with the value of type <see cref="T:System.Nullable<System.Int64>" /> that corresponds to the maximum value in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<decimal?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, decimal?>> selector)
+        public static IQbservable<long?> Max<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, long?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<decimal?>(
+            return source.Provider.CreateQuery<long?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, decimal?>>))),
+                    InfoOf(() => Qbservable.Max<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, long?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -11431,10 +11787,10 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Projects each element of an observable sequence to an enumerable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
-        /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
         /// <param name="collectionSelector">A transform function to apply to each element.</param>
@@ -11442,7 +11798,8 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="collectionSelector" /> or <paramref name="resultSelector" /> is null.</exception>
-        public static IQbservable<TResult> SelectMany<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IObservable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector)
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
+        public static IQbservable<TResult> SelectMany<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -11455,7 +11812,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TCollection, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, IObservable<TCollection>>>), default(Expression<Func<TSource, TCollection, TResult>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TCollection, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, IEnumerable<TCollection>>>), default(Expression<Func<TSource, TCollection, TResult>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TCollection), typeof(TResult)),
 #endif
@@ -11467,18 +11824,19 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Projects each element of an observable sequence to an enumerable sequence by incorporating the element's index, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
-        /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
-        /// <param name="collectionSelector">A transform function to apply to each source element; the second parameter of the function represents the index of the source element.</param>
-        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <param name="collectionSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element and the fourth parameter represents the index of the intermediate element.</param>
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="collectionSelector" /> or <paramref name="resultSelector" /> is null.</exception>
-        public static IQbservable<TResult> SelectMany<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IObservable<TCollection>>> collectionSelector, Expression<Func<TSource, int, TCollection, int, TResult>> resultSelector)
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
+        public static IQbservable<TResult> SelectMany<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, int, TCollection, int, TResult>> resultSelector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -11491,7 +11849,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TCollection, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, IObservable<TCollection>>>), default(Expression<Func<TSource, int, TCollection, int, TResult>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TCollection, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, IEnumerable<TCollection>>>), default(Expression<Func<TSource, int, TCollection, int, TResult>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TCollection), typeof(TResult)),
 #endif
@@ -11503,10 +11861,10 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Projects each element of an observable sequence to an enumerable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
-        /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
         /// <param name="collectionSelector">A transform function to apply to each element.</param>
@@ -11514,8 +11872,7 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="collectionSelector" /> or <paramref name="resultSelector" /> is null.</exception>
-        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
-        public static IQbservable<TResult> SelectMany<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector)
+        public static IQbservable<TResult> SelectMany<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IObservable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -11528,7 +11885,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TCollection, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, IEnumerable<TCollection>>>), default(Expression<Func<TSource, TCollection, TResult>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TCollection, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, IObservable<TCollection>>>), default(Expression<Func<TSource, TCollection, TResult>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TCollection), typeof(TResult)),
 #endif
@@ -11540,19 +11897,18 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Projects each element of an observable sequence to an enumerable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
+        /// Projects each element of an observable sequence to an observable sequence by incorporating the element's index, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
-        /// <typeparam name="TCollection">The type of the elements in the projected intermediate enumerable sequences.</typeparam>
+        /// <typeparam name="TCollection">The type of the elements in the projected intermediate sequences.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate sequence elements.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
         /// <param name="collectionSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
-        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element and the fourth parameter represents the index of the intermediate element.</param>
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="collectionSelector" /> or <paramref name="resultSelector" /> is null.</exception>
-        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
-        public static IQbservable<TResult> SelectMany<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, int, TCollection, int, TResult>> resultSelector)
+        public static IQbservable<TResult> SelectMany<TSource, TCollection, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IObservable<TCollection>>> collectionSelector, Expression<Func<TSource, int, TCollection, int, TResult>> resultSelector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -11565,7 +11921,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TCollection, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, IEnumerable<TCollection>>>), default(Expression<Func<TSource, int, TCollection, int, TResult>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TCollection, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, IObservable<TCollection>>>), default(Expression<Func<TSource, int, TCollection, int, TResult>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TCollection), typeof(TResult)),
 #endif
@@ -11634,53 +11990,117 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, IObservable<TResult>>>), default(Expression<Func<Exception, IObservable<TResult>>>), default(Expression<Func<IObservable<TResult>>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, IObservable<TResult>>>), default(Expression<Func<Exception, IObservable<TResult>>>), default(Expression<Func<IObservable<TResult>>>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)),
+#endif
+                    source.Expression,
+                    onNext,
+                    onError,
+                    onCompleted
+                )
+            );
+        }
+        
+        /// <summary>
+        /// Projects each notification of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of notifications to project.</param>
+        /// <param name="onNext">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="onError">A transform function to apply when an error occurs in the source sequence.</param>
+        /// <param name="onCompleted">A transform function to apply when the end of the source sequence is reached.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="onNext" /> or <paramref name="onError" /> or <paramref name="onCompleted" /> is null.</exception>
+        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IObservable<TResult>>> onNext, Expression<Func<Exception, IObservable<TResult>>> onError, Expression<Func<IObservable<TResult>>> onCompleted)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (onNext == null)
+                throw new ArgumentNullException("onNext");
+            if (onError == null)
+                throw new ArgumentNullException("onError");
+            if (onCompleted == null)
+                throw new ArgumentNullException("onCompleted");
+            
+            return source.Provider.CreateQuery<TResult>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, IObservable<TResult>>>), default(Expression<Func<Exception, IObservable<TResult>>>), default(Expression<Func<IObservable<TResult>>>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)),
+#endif
+                    source.Expression,
+                    onNext,
+                    onError,
+                    onCompleted
+                )
+            );
+        }
+        
+        /// <summary>
+        /// Projects each element of an observable sequence to an enumerable sequence and concatenates the resulting enumerable sequences into one observable sequence.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
+        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IEnumerable<TResult>>> selector)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (selector == null)
+                throw new ArgumentNullException("selector");
+            
+            return source.Provider.CreateQuery<TResult>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, IEnumerable<TResult>>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)),
 #endif
                     source.Expression,
-                    onNext,
-                    onError,
-                    onCompleted
+                    selector
                 )
             );
         }
         
         /// <summary>
-        /// Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+        /// Projects each element of an observable sequence to an enumerable sequence by incorporating the element's index and concatenates the resulting enumerable sequences into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
-        /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
-        /// <param name="source">An observable sequence of notifications to project.</param>
-        /// <param name="onNext">A transform function to apply to each element; the second parameter represents the index of the source element.</param>
-        /// <param name="onError">A transform function to apply when an error occurs in the source sequence; the second parameter represents the index of the source element.</param>
-        /// <param name="onCompleted">A transform function to apply when the end of the source sequence is reached; the second parameter represents the number of elements observed.</param>
-        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.</returns>
+        /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
-        /// <paramref name="source" /> or <paramref name="onNext" /> or <paramref name="onError" /> or <paramref name="onCompleted" /> is null.</exception>
-        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IObservable<TResult>>> onNext, Expression<Func<Exception, int, IObservable<TResult>>> onError, Expression<Func<int, IObservable<TResult>>> onCompleted)
+        /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
+        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IEnumerable<TResult>>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
-            if (onNext == null)
-                throw new ArgumentNullException("onNext");
-            if (onError == null)
-                throw new ArgumentNullException("onError");
-            if (onCompleted == null)
-                throw new ArgumentNullException("onCompleted");
+            if (selector == null)
+                throw new ArgumentNullException("selector");
             
             return source.Provider.CreateQuery<TResult>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, IObservable<TResult>>>), default(Expression<Func<Exception, int, IObservable<TResult>>>), default(Expression<Func<int, IObservable<TResult>>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, IEnumerable<TResult>>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)),
 #endif
                     source.Expression,
-                    onNext,
-                    onError,
-                    onCompleted
+                    selector
                 )
             );
         }
@@ -11717,12 +12137,12 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.
+        /// Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the projected inner sequences and the elements in the merged result sequence.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
-        /// <param name="selector">A transform function to apply to each source element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
         /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
@@ -11783,17 +12203,17 @@ namespace System.Reactive.Linq
         
 #if !NO_TPL
         /// <summary>
-        /// Projects each element of an observable sequence to a task with cancellation support and merges all of the task results into one observable sequence.
+        /// Projects each element of an observable sequence to a task by incorporating the element's index and merges all of the task results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
-        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
         /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
         /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, CancellationToken, Task<TResult>>> selector)
+        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, Task<TResult>>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -11804,7 +12224,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, CancellationToken, Task<TResult>>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, Task<TResult>>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)),
 #endif
@@ -11815,18 +12235,19 @@ namespace System.Reactive.Linq
         }
 #endif
         
+#if !NO_TPL
         /// <summary>
-        /// Projects each element of an observable sequence to an enumerable sequence and concatenates the resulting enumerable sequences into one observable sequence.
+        /// Projects each element of an observable sequence to a task with cancellation support and merges all of the task results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
-        /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
         /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
-        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, IEnumerable<TResult>>> selector)
+        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, CancellationToken, Task<TResult>>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -11837,7 +12258,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, IEnumerable<TResult>>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, CancellationToken, Task<TResult>>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)),
 #endif
@@ -11846,20 +12267,21 @@ namespace System.Reactive.Linq
                 )
             );
         }
+#endif
         
+#if !NO_TPL
         /// <summary>
-        /// Projects each element of an observable sequence to an enumerable sequence and concatenates the resulting enumerable sequences into one observable sequence.
-        /// The index of each source element is used in the projected form of that element. 
+        /// Projects each element of an observable sequence to a task by incorporating the element's index with cancellation support and merges all of the task results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
-        /// <typeparam name="TResult">The type of the elements in the projected inner enumerable sequences and the elements in the merged result sequence.</typeparam>
+        /// <typeparam name="TResult">The type of the result produced by the projected tasks and the elements in the merged result sequence.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
-        /// <param name="selector">A transform function to apply to each source element; the second parameter of the function represents the index of the source element.</param>
-        /// <returns>An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.</returns>
+        /// <param name="selector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of the tasks executed for each element of the input sequence.</returns>
+        /// <remarks>This overload supports composition of observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        /// <remarks>The projected sequences are enumerated synchonously within the OnNext call of the source sequence. In order to do a concurrent, non-blocking merge, change the selector to return an observable sequence obtained using the <see cref="M:System.Reactive.Linq.Observable.ToObservable``1(System.Collections.Generic.IEnumerable{``0})" /> conversion.</remarks>
-        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, IEnumerable<TResult>>> selector)
+        public static IQbservable<TResult> SelectMany<TSource, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, CancellationToken, Task<TResult>>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -11870,7 +12292,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, IEnumerable<TResult>>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, CancellationToken, Task<TResult>>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)),
 #endif
@@ -11879,6 +12301,85 @@ namespace System.Reactive.Linq
                 )
             );
         }
+#endif
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="taskSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        public static IQbservable<TResult> SelectMany<TSource, TTaskResult, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, CancellationToken, Task<TTaskResult>>> taskSelector, Expression<Func<TSource, TTaskResult, TResult>> resultSelector)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (taskSelector == null)
+                throw new ArgumentNullException("taskSelector");
+            if (resultSelector == null)
+                throw new ArgumentNullException("resultSelector");
+            
+            return source.Provider.CreateQuery<TResult>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.SelectMany<TSource, TTaskResult, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, CancellationToken, Task<TTaskResult>>>), default(Expression<Func<TSource, TTaskResult, TResult>>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TTaskResult), typeof(TResult)),
+#endif
+                    source.Expression,
+                    taskSelector,
+                    resultSelector
+                )
+            );
+        }
+#endif
+        
+#if !NO_TPL
+        /// <summary>
+        /// Projects each element of an observable sequence to a task by incorporating the element's index with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// </summary>
+        /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
+        /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
+        /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
+        /// <param name="source">An observable sequence of elements to project.</param>
+        /// <param name="taskSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element.</param>
+        /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
+        /// <exception cref="T:System.ArgumentNullException">
+        /// <paramref name="source" /> or <paramref name="taskSelector" /> or <paramref name="resultSelector" /> is null.</exception>
+        /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
+        public static IQbservable<TResult> SelectMany<TSource, TTaskResult, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, CancellationToken, Task<TTaskResult>>> taskSelector, Expression<Func<TSource, int, TTaskResult, TResult>> resultSelector)
+        {
+            if (source == null)
+                throw new ArgumentNullException("source");
+            if (taskSelector == null)
+                throw new ArgumentNullException("taskSelector");
+            if (resultSelector == null)
+                throw new ArgumentNullException("resultSelector");
+            
+            return source.Provider.CreateQuery<TResult>(
+                Expression.Call(
+                    null,
+#if CRIPPLED_REFLECTION
+                    InfoOf(() => Qbservable.SelectMany<TSource, TTaskResult, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, CancellationToken, Task<TTaskResult>>>), default(Expression<Func<TSource, int, TTaskResult, TResult>>))),
+#else
+                    ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TTaskResult), typeof(TResult)),
+#endif
+                    source.Expression,
+                    taskSelector,
+                    resultSelector
+                )
+            );
+        }
+#endif
         
 #if !NO_TPL
         /// <summary>
@@ -11921,19 +12422,19 @@ namespace System.Reactive.Linq
         
 #if !NO_TPL
         /// <summary>
-        /// Projects each element of an observable sequence to a task with cancellation support, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
+        /// Projects each element of an observable sequence to a task by incorporating the element's index, invokes the result selector for the source element and the task result, and merges the results into one observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <typeparam name="TTaskResult">The type of the results produced by the projected intermediate tasks.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, obtained by using the selector to combine source sequence elements with their corresponding intermediate task results.</typeparam>
         /// <param name="source">An observable sequence of elements to project.</param>
-        /// <param name="taskSelector">A transform function to apply to each element.</param>
-        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence.</param>
+        /// <param name="taskSelector">A transform function to apply to each element; the second parameter of the function represents the index of the source element.</param>
+        /// <param name="resultSelector">A transform function to apply to each element of the intermediate sequence; the second parameter of the function represents the index of the source element.</param>
         /// <returns>An observable sequence whose elements are the result of obtaining a task for each element of the input sequence and then mapping the task's result and its corresponding source element to a result element.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="taskSelector" /> or <paramref name="resultSelector" /> is null.</exception>
         /// <remarks>This overload supports using LINQ query comprehension syntax in C# and Visual Basic to compose observable sequences and tasks, without requiring manual conversion of the tasks to observable sequences using <see cref="M:System.Reactive.Threading.Tasks.TaskObservableExtensions.ToObservable``1(System.Threading.Tasks.Task{``0})" />.</remarks>
-        public static IQbservable<TResult> SelectMany<TSource, TTaskResult, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, CancellationToken, Task<TTaskResult>>> taskSelector, Expression<Func<TSource, TTaskResult, TResult>> resultSelector)
+        public static IQbservable<TResult> SelectMany<TSource, TTaskResult, TResult>(this IQbservable<TSource> source, Expression<Func<TSource, int, Task<TTaskResult>>> taskSelector, Expression<Func<TSource, int, TTaskResult, TResult>> resultSelector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
@@ -11946,7 +12447,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.SelectMany<TSource, TTaskResult, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, CancellationToken, Task<TTaskResult>>>), default(Expression<Func<TSource, TTaskResult, TResult>>))),
+                    InfoOf(() => Qbservable.SelectMany<TSource, TTaskResult, TResult>(default(IQbservable<TSource>), default(Expression<Func<TSource, int, Task<TTaskResult>>>), default(Expression<Func<TSource, int, TTaskResult, TResult>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TTaskResult), typeof(TResult)),
 #endif
@@ -13403,7 +13904,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of <see cref="T:System.Double" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of nullable <see cref="T:System.Int32" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13411,19 +13912,20 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Int32.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<double> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, double>> selector)
+        public static IQbservable<int?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<double>(
+            return source.Provider.CreateQuery<int?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, double>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, int?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13434,7 +13936,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of <see cref="T:System.Single" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of nullable <see cref="T:System.Int64" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13442,19 +13944,20 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Int64.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<float> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, float>> selector)
+        public static IQbservable<long?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, long?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<float>(
+            return source.Provider.CreateQuery<long?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, float>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, long?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13465,7 +13968,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of <see cref="T:System.Decimal" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of <see cref="T:System.Double" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13473,20 +13976,19 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Decimal.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<decimal> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, decimal>> selector)
+        public static IQbservable<double> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, double>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<decimal>(
+            return source.Provider.CreateQuery<double>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, decimal>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, double>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13497,7 +13999,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of <see cref="T:System.Int32" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of <see cref="T:System.Single" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13505,20 +14007,19 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Int32.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<int> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int>> selector)
+        public static IQbservable<float> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, float>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<int>(
+            return source.Provider.CreateQuery<float>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, int>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, float>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13529,7 +14030,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of <see cref="T:System.Int64" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of <see cref="T:System.Decimal" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13537,20 +14038,20 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Int64.MaxValue" />.</exception>
+        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Decimal.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<long> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, long>> selector)
+        public static IQbservable<decimal> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, decimal>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<long>(
+            return source.Provider.CreateQuery<decimal>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, long>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, decimal>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13561,7 +14062,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of nullable <see cref="T:System.Double" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of <see cref="T:System.Int32" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13569,19 +14070,20 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Int32.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<double?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, double?>> selector)
+        public static IQbservable<int> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<double?>(
+            return source.Provider.CreateQuery<int>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, double?>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, int>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13592,7 +14094,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of nullable <see cref="T:System.Single" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of <see cref="T:System.Int64" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13600,19 +14102,20 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
+        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Int64.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<float?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, float?>> selector)
+        public static IQbservable<long> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, long>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<float?>(
+            return source.Provider.CreateQuery<long>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, float?>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, long>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13623,7 +14126,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of nullable <see cref="T:System.Decimal" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of nullable <see cref="T:System.Double" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13631,20 +14134,19 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Decimal.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<decimal?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, decimal?>> selector)
+        public static IQbservable<double?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, double?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<decimal?>(
+            return source.Provider.CreateQuery<double?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, decimal?>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, double?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13655,7 +14157,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of nullable <see cref="T:System.Int32" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of nullable <see cref="T:System.Single" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13663,20 +14165,19 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Int32.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<int?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, int?>> selector)
+        public static IQbservable<float?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, float?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<int?>(
+            return source.Provider.CreateQuery<float?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, int?>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, float?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13687,7 +14188,7 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Computes the sum of a sequence of nullable <see cref="T:System.Int64" /> values that are obtained by invoking a transform function on each element of the input sequence.
+        /// Computes the sum of a sequence of nullable <see cref="T:System.Decimal" /> values that are obtained by invoking a transform function on each element of the input sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequence.</typeparam>
         /// <param name="source">A sequence of values that are used to calculate a sum.</param>
@@ -13695,20 +14196,20 @@ namespace System.Reactive.Linq
         /// <returns>An observable sequence containing a single element with the sum of the values in the source sequence.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="source" /> or <paramref name="selector" /> is null.</exception>
-        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Int64.MaxValue" />.</exception>
+        /// <exception cref="T:System.OverflowException">(Asynchronous) The sum of the projected values for the elements in the source sequence is larger than <see cref="M:System.Decimal.MaxValue" />.</exception>
         /// <remarks>The return type of this operator differs from the corresponding operator on IEnumerable in order to retain asynchronous behavior.</remarks>
-        public static IQbservable<long?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, long?>> selector)
+        public static IQbservable<decimal?> Sum<TSource>(this IQbservable<TSource> source, Expression<Func<TSource, decimal?>> selector)
         {
             if (source == null)
                 throw new ArgumentNullException("source");
             if (selector == null)
                 throw new ArgumentNullException("selector");
             
-            return source.Provider.CreateQuery<long?>(
+            return source.Provider.CreateQuery<decimal?>(
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, long?>>))),
+                    InfoOf(() => Qbservable.Sum<TSource>(default(IQbservable<TSource>), default(Expression<Func<TSource, decimal?>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)),
 #endif
@@ -13719,8 +14220,10 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Switches between the inner observable sequences such that the resulting sequence always produces elements from the most recently received inner observable sequence.
-        /// Each time a new inner observable sequence is received, the previous inner observable sequence is unsubscribed from.
+        /// Transforms an observable sequence of observable sequences into an observable sequence 
+        /// producing values only from the most recent observable sequence.
+        /// Each time a new inner observable sequence is received, unsubscribe from the 
+        /// previous inner observable sequence.
         /// </summary>
         /// <typeparam name="TSource">The type of the elements in the source sequences.</typeparam>
         /// <param name="sources">Observable sequence of inner observable sequences.</param>
@@ -13747,7 +14250,8 @@ namespace System.Reactive.Linq
         
 #if !NO_TPL
         /// <summary>
-        /// Switches between the tasks such that the resulting sequence always produces results from the most recently received task.
+        /// Transforms an observable sequence of tasks into an observable sequence 
+        /// producing values only from the most recent observable sequence.
         /// Each time a new task is received, the previous task's result is ignored.
         /// </summary>
         /// <typeparam name="TSource">The type of the results produced by the source tasks.</typeparam>
@@ -16640,18 +17144,18 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Merges two observable sequences into one observable sequence by combining their elements in a pairwise fashion.
+        /// Merges an observable sequence and an enumerable sequence into one observable sequence by using the selector function.
         /// </summary>
-        /// <typeparam name="TSource1">The type of the elements in the first source sequence.</typeparam>
-        /// <typeparam name="TSource2">The type of the elements in the second source sequence.</typeparam>
+        /// <typeparam name="TSource1">The type of the elements in the first observable source sequence.</typeparam>
+        /// <typeparam name="TSource2">The type of the elements in the second enumerable source sequence.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, returned by the selector function.</typeparam>
         /// <param name="first">First observable source.</param>
-        /// <param name="second">Second observable source.</param>
+        /// <param name="second">Second enumerable source.</param>
         /// <param name="resultSelector">Function to invoke for each consecutive pair of elements from the first and second source.</param>
         /// <returns>An observable sequence containing the result of pairwise combining the elements of the first and second source using the specified result selector function.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="first" /> or <paramref name="second" /> or <paramref name="resultSelector" /> is null.</exception>
-        public static IQbservable<TResult> Zip<TSource1, TSource2, TResult>(this IQbservable<TSource1> first, IObservable<TSource2> second, Expression<Func<TSource1, TSource2, TResult>> resultSelector)
+        public static IQbservable<TResult> Zip<TSource1, TSource2, TResult>(this IQbservable<TSource1> first, IEnumerable<TSource2> second, Expression<Func<TSource1, TSource2, TResult>> resultSelector)
         {
             if (first == null)
                 throw new ArgumentNullException("first");
@@ -16664,7 +17168,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Zip<TSource1, TSource2, TResult>(default(IQbservable<TSource1>), default(IObservable<TSource2>), default(Expression<Func<TSource1, TSource2, TResult>>))),
+                    InfoOf(() => Qbservable.Zip<TSource1, TSource2, TResult>(default(IQbservable<TSource1>), default(IEnumerable<TSource2>), default(Expression<Func<TSource1, TSource2, TResult>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource1), typeof(TSource2), typeof(TResult)),
 #endif
@@ -16676,18 +17180,18 @@ namespace System.Reactive.Linq
         }
         
         /// <summary>
-        /// Merges an observable sequence and an enumerable sequence into one observable sequence by using the selector function.
+        /// Merges two observable sequences into one observable sequence by combining their elements in a pairwise fashion.
         /// </summary>
-        /// <typeparam name="TSource1">The type of the elements in the first observable source sequence.</typeparam>
-        /// <typeparam name="TSource2">The type of the elements in the second enumerable source sequence.</typeparam>
+        /// <typeparam name="TSource1">The type of the elements in the first source sequence.</typeparam>
+        /// <typeparam name="TSource2">The type of the elements in the second source sequence.</typeparam>
         /// <typeparam name="TResult">The type of the elements in the result sequence, returned by the selector function.</typeparam>
         /// <param name="first">First observable source.</param>
-        /// <param name="second">Second enumerable source.</param>
+        /// <param name="second">Second observable source.</param>
         /// <param name="resultSelector">Function to invoke for each consecutive pair of elements from the first and second source.</param>
         /// <returns>An observable sequence containing the result of pairwise combining the elements of the first and second source using the specified result selector function.</returns>
         /// <exception cref="T:System.ArgumentNullException">
         /// <paramref name="first" /> or <paramref name="second" /> or <paramref name="resultSelector" /> is null.</exception>
-        public static IQbservable<TResult> Zip<TSource1, TSource2, TResult>(this IQbservable<TSource1> first, IEnumerable<TSource2> second, Expression<Func<TSource1, TSource2, TResult>> resultSelector)
+        public static IQbservable<TResult> Zip<TSource1, TSource2, TResult>(this IQbservable<TSource1> first, IObservable<TSource2> second, Expression<Func<TSource1, TSource2, TResult>> resultSelector)
         {
             if (first == null)
                 throw new ArgumentNullException("first");
@@ -16700,7 +17204,7 @@ namespace System.Reactive.Linq
                 Expression.Call(
                     null,
 #if CRIPPLED_REFLECTION
-                    InfoOf(() => Qbservable.Zip<TSource1, TSource2, TResult>(default(IQbservable<TSource1>), default(IEnumerable<TSource2>), default(Expression<Func<TSource1, TSource2, TResult>>))),
+                    InfoOf(() => Qbservable.Zip<TSource1, TSource2, TResult>(default(IQbservable<TSource1>), default(IObservable<TSource2>), default(Expression<Func<TSource1, TSource2, TResult>>))),
 #else
                     ((MethodInfo)MethodInfo.GetCurrentMethod()).MakeGenericMethod(typeof(TSource1), typeof(TSource2), typeof(TResult)),
 #endif
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/ObservableQuery.cs b/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/ObservableQuery.cs
index 383b75f..c0bb21b 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/ObservableQuery.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Providers/Reactive/ObservableQuery.cs
@@ -184,7 +184,7 @@ namespace System.Reactive
             {
                 var method = node.Method;
                 var declaringType = method.DeclaringType;
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
                 var baseType = declaringType.GetTypeInfo().BaseType;
 #else
                 var baseType = declaringType.BaseType;
@@ -368,7 +368,7 @@ namespace System.Reactive
                 {
                     targetType = method.DeclaringType;
 
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
                     var typeInfo = targetType.GetTypeInfo();
                     if (typeInfo.IsDefined(typeof(LocalQueryMethodImplementationTypeAttribute), false))
                     {
@@ -417,7 +417,7 @@ namespace System.Reactive
 
             private static ILookup<string, MethodInfo> GetMethods(Type type)
             {
-#if !CRIPPLED_REFLECTION
+#if !(CRIPPLED_REFLECTION && HAS_WINRT)
                 return type.GetMethods(BindingFlags.Static | BindingFlags.Public).ToLookup(m => m.Name);
 #else
                 return type.GetTypeInfo().DeclaredMethods.Where(m => m.IsStatic && m.IsPublic).ToLookup(m => m.Name);
@@ -492,7 +492,7 @@ namespace System.Reactive
         }
     }
 
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
     static class Helpers
     {
         public static MethodInfo GetMethod(this Type type, string name)
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Providers/Strings_Providers.Generated.cs b/external/rx/Rx/NET/Source/System.Reactive.Providers/Strings_Providers.Generated.cs
index df6e798..5443ec0 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Providers/Strings_Providers.Generated.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Providers/Strings_Providers.Generated.cs
@@ -53,7 +53,7 @@ namespace System.Reactive
             {
                 if (object.ReferenceEquals(resourceMan, null))
                 {
-#if CRIPPLED_REFLECTION
+#if (CRIPPLED_REFLECTION && HAS_WINRT)
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Reactive.Strings_Providers", typeof(Strings_Providers).GetTypeInfo().Assembly);
 #else
                     global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Reactive.Strings_Providers", typeof(Strings_Providers).Assembly);
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Providers/System.Reactive.Providers.csproj b/external/rx/Rx/NET/Source/System.Reactive.Providers/System.Reactive.Providers.csproj
index b0f7e21..2814eb3 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Providers/System.Reactive.Providers.csproj
+++ b/external/rx/Rx/NET/Source/System.Reactive.Providers/System.Reactive.Providers.csproj
@@ -15,6 +15,7 @@
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
     <CodeAnalysisRuleSet>..\Rx.ruleset</CodeAnalysisRuleSet>
+    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU'">
     <OutputPath>bin\ReleaseXBLV\</OutputPath>
@@ -64,6 +65,7 @@
     <EmbeddedResource Include="Strings_Providers.resx" />
   </ItemGroup>
   <Import Project="..\Import.targets" />
+  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
   <!-- HomoIconizer build task configuration (disabled for now)
   <PropertyGroup>
     <HomoIconIntermediateOutputPath>obj\$(Configuration)\HomoIcon</HomoIconIntermediateOutputPath>
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Runtime.Remoting/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Runtime.Remoting/Properties/AssemblyInfo.cs
index c51e915..431cb43 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Runtime.Remoting/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Runtime.Remoting/Properties/AssemblyInfo.cs
@@ -27,7 +27,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Windows.Forms/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Windows.Forms/Properties/AssemblyInfo.cs
index 46e1bd9..f0af34d 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Windows.Forms/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Windows.Forms/Properties/AssemblyInfo.cs
@@ -27,7 +27,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Properties/AssemblyInfo.cs
index d11d58d..419b8c1 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.Windows.Threading/Properties/AssemblyInfo.cs
@@ -34,11 +34,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-#if XBOX_LAKEVIEW
-[assembly: SecurityTransparent]
-#endif
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.WindowsRuntime/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/System.Reactive.WindowsRuntime/Properties/AssemblyInfo.cs
index f3e00b6..2d8e097 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.WindowsRuntime/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/System.Reactive.WindowsRuntime/Properties/AssemblyInfo.cs
@@ -25,7 +25,11 @@ using System.Security;
 [assembly: AllowPartiallyTrustedCallers]
 #endif
 
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Build/Source/Activities/AppendVersionInfo.cs for more information.
-//
+// ===========================================================================
+//  DO NOT EDIT OR REMOVE ANYTHING BELOW THIS COMMENT.
+//  Version numbers are automatically generated in the msbuild files based on regular expressions 
+// ===========================================================================
+
+[assembly: AssemblyVersion("2.2.0.0")]
+[assembly: AssemblyFileVersion("2.2.0.0")]
+[assembly: AssemblyInformationalVersion("2.2.0.0")]
diff --git a/external/rx/Rx/NET/Source/System.Reactive.WindowsRuntime/System.Reactive.WindowsRuntime.csproj b/external/rx/Rx/NET/Source/System.Reactive.WindowsRuntime/System.Reactive.WindowsRuntime.csproj
index 8021af8..0380c7e 100644
--- a/external/rx/Rx/NET/Source/System.Reactive.WindowsRuntime/System.Reactive.WindowsRuntime.csproj
+++ b/external/rx/Rx/NET/Source/System.Reactive.WindowsRuntime/System.Reactive.WindowsRuntime.csproj
@@ -10,16 +10,66 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>System.Reactive</RootNamespace>
     <AssemblyName>System.Reactive.WindowsRuntime</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <ProductSignAssembly>true</ProductSignAssembly>
     <CodeAnalysisRuleSet>..\Rx.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXBLV|AnyCPU'">
     <OutputPath>bin\ReleaseXBLV\</OutputPath>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugXBLV|AnyCPU'">
     <OutputPath>bin\DebugXBLV\</OutputPath>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug45|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release45|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug40|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release40|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugSL5|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseSL5|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugWP7|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseWP7|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug35|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release35|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugSL3|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseSL3|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugSL4|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseSL4|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugXNA4|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseXNA4|AnyCPU'">
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <Import Project="..\Common.targets" />
   <PropertyGroup>
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyFunc.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyFunc.cs
index c0d3dc2..222e4e1 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyFunc.cs
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Dummies/DummyFunc.cs
@@ -19,6 +19,16 @@ namespace ReactiveTests.Dummies
         public static readonly Func<T, U, V> Instance = (t, u) => { throw new NotImplementedException(); };
     }
 
+    static class DummyFunc<T, U, V, W>
+    {
+        public static readonly Func<T, U, V, W> Instance = (t, u, v) => { throw new NotImplementedException(); };
+    }
+
+    static class DummyFunc<T, U, V, W, X>
+    {
+        public static readonly Func<T, U, V, W, X> Instance = (t, u, v, w) => { throw new NotImplementedException(); };
+    }
+
     static class DummyAction
     {
         public static readonly Action Instance = () => { throw new NotImplementedException(); };
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Properties/AssemblyInfo.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Properties/AssemblyInfo.cs
index 36cb0c1..4d51081 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Properties/AssemblyInfo.cs
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Properties/AssemblyInfo.cs
@@ -16,8 +16,3 @@ using System.Runtime.InteropServices;
 [assembly: NeutralResourcesLanguage("en-US")]
 
 [assembly: ComVisible(false)]
-
-//
-// Note: Assembly (file) version numbers get inserted by the build system on the fly. Inspect the Team Build workflows
-//       and the custom activity in Source/Build/Activities/AppendVersionInfo.cs for more information.
-//
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Core/Schedulers/EventLoop.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Core/Schedulers/EventLoop.cs
new file mode 100644
index 0000000..8ef60a5
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Stress/Core/Schedulers/EventLoop.cs
@@ -0,0 +1,74 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+#if STRESS
+using System;
+using System.Linq;
+using System.Reactive.Concurrency;
+using System.Reactive.Disposables;
+using System.Reactive.Linq;
+using System.Reflection;
+using System.Threading;
+using System.Threading.Tasks;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
+
+namespace ReactiveTests.Stress.Schedulers
+{
+    /// <summary>
+    /// Test for <see href="https://rx.codeplex.com/workitem/37">work item #37</see>.
+    /// </summary>
+    public static class EventLoop
+    {
+        private static readonly FieldInfo semaphore = typeof(EventLoopScheduler).GetField("_evt", BindingFlags.NonPublic | BindingFlags.Instance);
+
+        public static void NoSemaphoreFullException()
+        {
+            var failed = new TaskCompletionSource<int>();
+
+            using (var scheduler = new EventLoopScheduler())
+            {
+                Assert.AreEqual(0, scheduler.CurrentCount());
+
+                var maxCount = Environment.ProcessorCount;
+
+                using (Enumerable.Range(1, maxCount)
+                    .Select(_ => scheduler.SchedulePeriodic(TimeSpan.Zero, () =>
+                    {
+                        var count = scheduler.CurrentCount();
+
+                        if (count > maxCount)
+                            failed.SetResult(count);
+                    }))
+                    .Aggregate(
+                        new CompositeDisposable(),
+                        (c, d) =>
+                        {
+                            c.Add(d);
+                            return c;
+                        }))
+                {
+                    if (failed.Task.Wait(TimeSpan.FromSeconds(10)))
+                    {
+                        Assert.Fail("Semaphore count is too high: {0}", failed.Task.Result);
+                    }
+                }
+            }
+        }
+
+        private static int CurrentCount(this EventLoopScheduler scheduler)
+        {
+#if !NO_CDS
+            return ((SemaphoreSlim)semaphore.GetValue(scheduler)).CurrentCount;
+#else
+            return 0;
+#endif
+        }
+    }
+}
+#endif
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests.System.Reactive.csproj b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests.System.Reactive.csproj
index 745e347..2bf0ea5 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests.System.Reactive.csproj
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests.System.Reactive.csproj
@@ -38,7 +38,7 @@
   </PropertyGroup>
   <ItemGroup>
     <!-- See readme.txt file in the References\$(BuildFlavor) folder for information on the test assemblies used here. -->
-    <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
+    <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
     <Reference Include="mscorlib" Condition=" '$(BuildPlatform)' == 'SILVERLIGHT' Or '$(BuildPlatform)' == 'XNA' " />
     <Reference Include="System" />
     <Reference Include="System.Core" />
@@ -62,6 +62,7 @@
     <Compile Include="Semaphore.cs" />
     <Compile Include="Stress\Core\Disposables\Composite.cs" />
     <Compile Include="Stress\Core\Disposables\Serial.cs" />
+    <Compile Include="Stress\Core\Schedulers\EventLoop.cs" />
     <Compile Include="Stress\Core\Disposables\SingleAssignment.cs" />
     <Compile Include="Stress\Core\Disposables\RefCount.cs" />
     <Compile Include="Stress\Linq\Delay.cs" />
@@ -70,6 +71,7 @@
     <Compile Include="Stress\Linq\Replay.cs" />
     <Compile Include="TestBase.cs" />
     <Compile Include="TestLongRunningScheduler.cs" />
+    <Compile Include="Tests\Aliases.cs" />
     <Compile Include="Tests\AnonymousTest.cs" />
     <Compile Include="Tests\Concurrency\ConcurrencyTest.cs" />
     <Compile Include="Tests\Concurrency\ScheduledItemTest.cs" />
@@ -161,6 +163,10 @@
       <Project>{9E9B9C60-98B0-40FA-9C2B-1218D417CAA4}</Project>
       <Name>System.Reactive.Interfaces</Name>
     </ProjectReference>
+    <ProjectReference Include="..\System.Reactive.Observable.Aliases\System.Reactive.Observable.Aliases.csproj">
+      <Project>{9ffac385-10a4-4ddd-b800-de67e8469cc0}</Project>
+      <Name>System.Reactive.Observable.Aliases</Name>
+    </ProjectReference>
     <ProjectReference Include="..\System.Reactive.PlatformServices\System.Reactive.PlatformServices.csproj">
       <Project>{0CCCF009-763F-40D2-8655-7A94828023BF}</Project>
       <Name>System.Reactive.PlatformServices</Name>
@@ -173,7 +179,7 @@
       <Project>{63252AE9-5186-45CA-BFCD-FA51C6B66A43}</Project>
       <Name>System.Reactive.Linq</Name>
     </ProjectReference>
-    <ProjectReference Include="..\System.Reactive.Runtime.Remoting\System.Reactive.Runtime.Remoting.csproj"  Condition=" '$(BuildPlatform)' != 'WINDOWS_PHONE' And '$(BuildTarget)' != 'WP7' ">
+    <ProjectReference Include="..\System.Reactive.Runtime.Remoting\System.Reactive.Runtime.Remoting.csproj" Condition=" '$(BuildPlatform)' != 'WINDOWS_PHONE' And '$(BuildTarget)' != 'WP7' ">
       <Project>{7A6EF49E-7946-4101-9C89-407B9C53A173}</Project>
       <Name>System.Reactive.Runtime.Remoting</Name>
     </ProjectReference>
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Aliases.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Aliases.cs
new file mode 100644
index 0000000..741ab28
--- /dev/null
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Aliases.cs
@@ -0,0 +1,37 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reactive;
+using System.Reactive.Concurrency;
+using System.Threading;
+using Microsoft.Reactive.Testing;
+#if NUNIT
+using NUnit.Framework;
+using TestClassAttribute = NUnit.Framework.TestFixtureAttribute;
+using TestMethodAttribute = NUnit.Framework.TestAttribute;
+using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
+#else
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+#endif
+using System.Reactive.Linq;
+using System.Reactive.Observable.Aliases;
+
+namespace ReactiveTests.Tests
+{
+    [TestClass]
+    public partial class AliasesTest : ReactiveTest
+    {
+        [TestMethod]
+        public void Qbservable_Aliases()
+        {
+            var xs = Observable.Return(1).AsQbservable();
+
+            Assert.IsTrue(xs.Filter(x => true).ToEnumerable().SequenceEqual(new[] { 1 }), "Filter");
+            Assert.IsTrue(xs.Filter(x => true).Concat(xs.Filter(x => false)).ToEnumerable().SequenceEqual(new[] { 1 }), "Concat/Filter");
+            Assert.IsTrue(xs.Map(x => x.ToString()).ToEnumerable().SequenceEqual(new[] { "1" }), "Map");
+            Assert.IsTrue(xs.FlatMap(x => xs).ToEnumerable().SequenceEqual(new[] { 1 }), "FlatMap");
+        }
+    }
+}
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs
index a4bb03e..854dbaf 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs
@@ -14,6 +14,9 @@ using TestInitializeAttribute = NUnit.Framework.SetUpAttribute;
 #else
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 #endif
+#if STRESS
+using ReactiveTests.Stress.Schedulers;
+#endif
 
 namespace ReactiveTests.Tests
 {
@@ -377,5 +380,13 @@ namespace ReactiveTests.Tests
                 d.Dispose();
             }
         }
+
+#if STRESS
+        [TestMethod]
+        public void EventLoop_Stress()
+        {
+            EventLoop.NoSemaphoreFullException();
+        }
+#endif
     }
 }
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs
index e226ca2..40c3eec 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/DefaultConcurrencyAbstractionLayerTest.cs
@@ -154,6 +154,69 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
+        public void StartPeriodicTimer_Fast()
+        {
+            var e = new MarshalByRefCell<ManualResetEvent> { Value = new ManualResetEvent(false) };
+            _domain.SetData("state", e);
+
+            Run(() =>
+            {
+                var n = 0;
+
+                Scheduler.Default.SchedulePeriodic(TimeSpan.Zero, () =>
+                {
+                    var state = (MarshalByRefCell<ManualResetEvent>)_domain.GetData("state");
+
+                    if (n++ == 10)
+                        state.Value.Set();
+                });
+            });
+
+            e.Value.WaitOne();
+        }
+
+        [TestMethod]
+        public void StartPeriodicTimer_Fast_Cancel()
+        {
+            var e = new MarshalByRefCell<ManualResetEvent> { Value = new ManualResetEvent(false) };
+            _domain.SetData("set_cancel", e);
+
+            Run(() =>
+            {
+                var n = 0;
+                
+                var schedule = Scheduler.Default.SchedulePeriodic(TimeSpan.Zero, () =>
+                {
+                    _domain.SetData("value", n++);
+                });
+
+                _domain.SetData("cancel", new MarshalByRefAction(schedule.Dispose));
+
+                var setCancel = (MarshalByRefCell<ManualResetEvent>)_domain.GetData("set_cancel");
+                setCancel.Value.Set();
+            });
+
+            e.Value.WaitOne();
+
+            var value = (int)_domain.GetData("value");
+
+            var cancel = (MarshalByRefAction)_domain.GetData("cancel");
+            cancel.Invoke();
+            
+            Thread.Sleep(TimeSpan.FromMilliseconds(50));
+            
+            var newValue = (int)_domain.GetData("value");
+            
+            Assert.IsTrue(newValue >= value);
+
+            Thread.Sleep(TimeSpan.FromMilliseconds(50));
+
+            value = (int)_domain.GetData("value");
+            
+            Assert.AreEqual(newValue, value);
+        }
+
+        [TestMethod]
         public void CreateThread()
         {
             var e = new MarshalByRefCell<ManualResetEvent> { Value = new ManualResetEvent(false) };
@@ -294,5 +357,20 @@ namespace ReactiveTests.Tests
     {
         public T Value;
     }
+
+    public class MarshalByRefAction : MarshalByRefObject
+    {
+        private readonly Action _action;
+
+        public MarshalByRefAction(Action action)
+        {
+            _action = action;
+        }
+
+        public void Invoke()
+        {
+            _action();
+        }
+    }
 }
 #endif
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableMultipleTest.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableMultipleTest.cs
index a91c744..bf289b1 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableMultipleTest.cs
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableMultipleTest.cs
@@ -1873,6 +1873,9 @@ namespace ReactiveTests.Tests
             res.Messages.AssertEqual(expected);
         }
 
+#if MONODROID
+		[IgnoreAttribute ("monodroid runtime bug causes it blocking")]
+#endif
         [TestMethod]
         public void Catch_TailRecursive2()
         {
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableStandardQueryOperatorTest.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableStandardQueryOperatorTest.cs
index 112a4e5..bf147e5 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableStandardQueryOperatorTest.cs
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableStandardQueryOperatorTest.cs
@@ -2493,7 +2493,7 @@ namespace ReactiveTests.Tests
 
             var nullGroup = scheduler.CreateObserver<string>();
             var err = default(Exception);
-            
+
             scheduler.ScheduleAbsolute(200, () => xs.GroupBy(x => x[0] == 'b' ? null : x.ToUpper()).Where(g => g.Key == null).Subscribe(g => g.Subscribe(nullGroup), ex_ => err = ex_));
             scheduler.Start();
 
@@ -2560,34 +2560,56 @@ namespace ReactiveTests.Tests
 
         #endregion
 
-        #region + GroupByUntil +
+        #region + GroupBy w/capacity +
+
+        private const int _groupByCapacity = 1024;
 
         [TestMethod]
-        public void GroupByUntil_ArgumentChecking()
+        public void GroupBy_Capacity_ArgumentChecking()
         {
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>), EqualityComparer<int>.Default));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, default(IEqualityComparer<int>)));
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).GroupBy(DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, _groupByCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy((Func<int, int>)null, DummyFunc<int, int>.Instance, _groupByCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, (Func<int, int>)null, _groupByCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, _groupByCapacity, null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, _groupByCapacity, EqualityComparer<int>.Default).Subscribe(null));
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>)));
+            ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, -1, EqualityComparer<int>.Default));
+        }
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>), EqualityComparer<int>.Default));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, default(IEqualityComparer<int>)));
+        [TestMethod]
+        public void GroupBy_Capacity_KeyEle_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).GroupBy(DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, _groupByCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy((Func<int, int>)null, DummyFunc<int, int>.Instance, _groupByCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, (Func<int, int>)null, _groupByCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, _groupByCapacity).Subscribe(null));
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>)));
+            ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, -1));
         }
 
         [TestMethod]
-        public void GroupByUntil_WithKeyComparer()
+        public void GroupBy_Capacity_KeyComparer_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).GroupBy(DummyFunc<int, int>.Instance, _groupByCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy((Func<int, int>)null, _groupByCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, _groupByCapacity, (IEqualityComparer<int>)null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, _groupByCapacity, EqualityComparer<int>.Default).Subscribe(null));
+
+            ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, -1, EqualityComparer<int>.Default));
+        }
+
+        [TestMethod]
+        public void GroupBy_Capacity_Key_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).GroupBy(DummyFunc<int, int>.Instance, _groupByCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy((Func<int, int>)null, _groupByCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, _groupByCapacity).Subscribe(null));
+
+            ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => DummyObservable<int>.Instance.GroupBy(DummyFunc<int, int>.Instance, -1));
+        }
+
+        [TestMethod]
+        public void GroupBy_Capacity_WithKeyComparer()
         {
             var scheduler = new TestScheduler();
 
@@ -2618,15 +2640,11 @@ namespace ReactiveTests.Tests
             var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupByUntil(
-                    x =>
-                    {
-                        keyInvoked++;
-                        return x.Trim();
-                    },
-                    g => g.Skip(2),
-                    comparer
-                ).Select(g => g.Key)
+                xs.GroupBy(x =>
+                {
+                    keyInvoked++;
+                    return x.Trim();
+                }, _groupByCapacity, comparer).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
@@ -2634,7 +2652,6 @@ namespace ReactiveTests.Tests
                 OnNext(270, "baR"),
                 OnNext(350, "Baz"),
                 OnNext(360, "qux"),
-                OnNext(470, "FOO"),
                 OnCompleted<string>(570)
             );
 
@@ -2646,7 +2663,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Outer_Complete()
+        public void GroupBy_Capacity_Outer_Complete()
         {
             var scheduler = new TestScheduler();
 
@@ -2678,7 +2695,7 @@ namespace ReactiveTests.Tests
             var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupByUntil(
+                xs.GroupBy(
                     x =>
                     {
                         keyInvoked++;
@@ -2689,7 +2706,7 @@ namespace ReactiveTests.Tests
                         eleInvoked++;
                         return Reverse(x);
                     },
-                    g => g.Skip(2),
+                    _groupByCapacity,
                     comparer
                 ).Select(g => g.Key)
             );
@@ -2699,7 +2716,6 @@ namespace ReactiveTests.Tests
                 OnNext(270, "baR"),
                 OnNext(350, "Baz"),
                 OnNext(360, "qux"),
-                OnNext(470, "FOO"),
                 OnCompleted<string>(570)
             );
 
@@ -2712,7 +2728,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Outer_Error()
+        public void GroupBy_Capacity_Outer_Error()
         {
             var scheduler = new TestScheduler();
 
@@ -2745,7 +2761,7 @@ namespace ReactiveTests.Tests
             var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupByUntil(
+                xs.GroupBy(
                     x =>
                     {
                         keyInvoked++;
@@ -2756,7 +2772,7 @@ namespace ReactiveTests.Tests
                         eleInvoked++;
                         return Reverse(x);
                     },
-                    g => g.Skip(2),
+                    _groupByCapacity,
                     comparer
                 ).Select(g => g.Key)
             );
@@ -2766,7 +2782,6 @@ namespace ReactiveTests.Tests
                 OnNext(270, "baR"),
                 OnNext(350, "Baz"),
                 OnNext(360, "qux"),
-                OnNext(470, "FOO"),
                 OnError<string>(570, ex)
             );
 
@@ -2779,7 +2794,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Outer_Dispose()
+        public void GroupBy_Capacity_Outer_Dispose()
         {
             var scheduler = new TestScheduler();
 
@@ -2811,19 +2826,16 @@ namespace ReactiveTests.Tests
             var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupByUntil(
+                xs.GroupBy(
                     x =>
                     {
                         keyInvoked++;
                         return x.Trim();
-                    },
-                    x =>
+                    }, x =>
                     {
                         eleInvoked++;
                         return Reverse(x);
-                    },
-                    g => g.Skip(2),
-                    comparer
+                    }, _groupByCapacity, comparer
                 ).Select(g => g.Key),
                 355
             );
@@ -2843,7 +2855,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Outer_KeyThrow()
+        public void GroupBy_Capacity_Outer_KeyThrow()
         {
             var scheduler = new TestScheduler();
 
@@ -2876,7 +2888,7 @@ namespace ReactiveTests.Tests
             var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupByUntil(
+                xs.GroupBy(
                     x =>
                     {
                         keyInvoked++;
@@ -2889,7 +2901,7 @@ namespace ReactiveTests.Tests
                         eleInvoked++;
                         return Reverse(x);
                     },
-                    g => g.Skip(2),
+                    _groupByCapacity,
                     comparer
                 ).Select(g => g.Key)
             );
@@ -2899,7 +2911,6 @@ namespace ReactiveTests.Tests
                 OnNext(270, "baR"),
                 OnNext(350, "Baz"),
                 OnNext(360, "qux"),
-                OnNext(470, "FOO"),
                 OnError<string>(480, ex)
             );
 
@@ -2912,7 +2923,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Outer_EleThrow()
+        public void GroupBy_Capacity_Outer_EleThrow()
         {
             var scheduler = new TestScheduler();
 
@@ -2945,7 +2956,7 @@ namespace ReactiveTests.Tests
             var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupByUntil(
+                xs.GroupBy(
                     x =>
                     {
                         keyInvoked++;
@@ -2958,7 +2969,7 @@ namespace ReactiveTests.Tests
                             throw ex;
                         return Reverse(x);
                     },
-                    g => g.Skip(2),
+                    _groupByCapacity,
                     comparer
                 ).Select(g => g.Key)
             );
@@ -2968,7 +2979,6 @@ namespace ReactiveTests.Tests
                 OnNext(270, "baR"),
                 OnNext(350, "Baz"),
                 OnNext(360, "qux"),
-                OnNext(470, "FOO"),
                 OnError<string>(480, ex)
             );
 
@@ -2981,7 +2991,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Outer_ComparerEqualsThrow()
+        public void GroupBy_Capacity_Outer_ComparerEqualsThrow()
         {
             var scheduler = new TestScheduler();
 
@@ -3013,7 +3023,7 @@ namespace ReactiveTests.Tests
             var comparer = new GroupByComparer(scheduler, 250, ushort.MaxValue);
 
             var res = scheduler.Start(() =>
-                xs.GroupByUntil(
+                xs.GroupBy(
                     x =>
                     {
                         keyInvoked++;
@@ -3024,7 +3034,7 @@ namespace ReactiveTests.Tests
                         eleInvoked++;
                         return Reverse(x);
                     },
-                    g => g.Skip(2),
+                    _groupByCapacity,
                     comparer
                 ).Select(g => g.Key)
             );
@@ -3044,7 +3054,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Outer_ComparerGetHashCodeThrow()
+        public void GroupBy_Capacity_Outer_ComparerGetHashCodeThrow()
         {
             var scheduler = new TestScheduler();
 
@@ -3076,7 +3086,7 @@ namespace ReactiveTests.Tests
             var comparer = new GroupByComparer(scheduler, ushort.MaxValue, 410);
 
             var res = scheduler.Start(() =>
-                xs.GroupByUntil(
+                xs.GroupBy(
                     x =>
                     {
                         keyInvoked++;
@@ -3087,7 +3097,7 @@ namespace ReactiveTests.Tests
                         eleInvoked++;
                         return Reverse(x);
                     },
-                    g => g.Skip(2),
+                    _groupByCapacity,
                     comparer
                 ).Select(g => g.Key)
             );
@@ -3109,7 +3119,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Complete()
+        public void GroupBy_Capacity_Inner_Complete()
         {
             var scheduler = new TestScheduler();
 
@@ -3142,7 +3152,7 @@ namespace ReactiveTests.Tests
             var innerSubscriptions = new Dictionary<string, IDisposable>();
             var res = new Dictionary<string, ITestableObserver<string>>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3161,27 +3171,27 @@ namespace ReactiveTests.Tests
 
             scheduler.Start();
 
-            Assert.AreEqual(5, inners.Count);
+            Assert.AreEqual(4, inners.Count);
 
             res["foo"].Messages.AssertEqual(
-                OnCompleted<string>(320)
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
             );
 
             res["baR"].Messages.AssertEqual(
                 OnNext(390, "rab   "),
-                OnCompleted<string>(420)
+                OnNext(420, "  RAB "),
+                OnCompleted<string>(570)
             );
 
             res["Baz"].Messages.AssertEqual(
                 OnNext(480, "  zab"),
-                OnCompleted<string>(510)
-            );
-
-            res["qux"].Messages.AssertEqual(
+                OnNext(510, " ZAb "),
                 OnCompleted<string>(570)
             );
 
-            res["FOO"].Messages.AssertEqual(
+            res["qux"].Messages.AssertEqual(
                 OnCompleted<string>(570)
             );
 
@@ -3191,7 +3201,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Complete_All()
+        public void GroupBy_Capacity_Inner_Complete_All()
         {
             var scheduler = new TestScheduler();
 
@@ -3224,7 +3234,7 @@ namespace ReactiveTests.Tests
             var innerSubscriptions = new Dictionary<string, IDisposable>();
             var res = new Dictionary<string, ITestableObserver<string>>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3243,27 +3253,29 @@ namespace ReactiveTests.Tests
 
             scheduler.Start();
 
-            Assert.AreEqual(5, inners.Count);
+            Assert.AreEqual(4, inners.Count);
 
             res["foo"].Messages.AssertEqual(
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
                 OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
             );
 
             res["baR"].Messages.AssertEqual(
                 OnNext(270, "  Rab"),
                 OnNext(390, "rab   "),
                 OnNext(420, "  RAB "),
-                OnCompleted<string>(420)
+                OnCompleted<string>(570)
             );
 
             res["Baz"].Messages.AssertEqual(
                 OnNext(350, "   zaB "),
                 OnNext(480, "  zab"),
                 OnNext(510, " ZAb "),
-                OnCompleted<string>(510)
+                OnCompleted<string>(570)
             );
 
             res["qux"].Messages.AssertEqual(
@@ -3271,19 +3283,13 @@ namespace ReactiveTests.Tests
                 OnCompleted<string>(570)
             );
 
-            res["FOO"].Messages.AssertEqual(
-                OnNext(470, " OOF"),
-                OnNext(530, "    oOf    "),
-                OnCompleted<string>(570)
-            );
-
             xs.Subscriptions.AssertEqual(
                 Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Error()
+        public void GroupBy_Capacity_Inner_Error()
         {
             var scheduler = new TestScheduler();
 
@@ -3318,7 +3324,7 @@ namespace ReactiveTests.Tests
             var innerSubscriptions = new Dictionary<string, IDisposable>();
             var res = new Dictionary<string, ITestableObserver<string>>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3337,27 +3343,27 @@ namespace ReactiveTests.Tests
 
             scheduler.Start();
 
-            Assert.AreEqual(5, inners.Count);
+            Assert.AreEqual(4, inners.Count);
 
             res["foo"].Messages.AssertEqual(
-                OnCompleted<string>(320)
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnError<string>(570, ex1)
             );
 
             res["baR"].Messages.AssertEqual(
                 OnNext(390, "rab   "),
-                OnCompleted<string>(420)
-               );
+                OnNext(420, "  RAB "),
+                OnError<string>(570, ex1)
+            );
 
             res["Baz"].Messages.AssertEqual(
                 OnNext(480, "  zab"),
-                OnCompleted<string>(510)
-            );
-
-            res["qux"].Messages.AssertEqual(
+                OnNext(510, " ZAb "),
                 OnError<string>(570, ex1)
             );
 
-            res["FOO"].Messages.AssertEqual(
+            res["qux"].Messages.AssertEqual(
                 OnError<string>(570, ex1)
             );
 
@@ -3367,7 +3373,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Dispose()
+        public void GroupBy_Capacity_Inner_Dispose()
         {
             var scheduler = new TestScheduler();
 
@@ -3400,7 +3406,7 @@ namespace ReactiveTests.Tests
             var innerSubscriptions = new Dictionary<string, IDisposable>();
             var res = new Dictionary<string, ITestableObserver<string>>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3424,8 +3430,7 @@ namespace ReactiveTests.Tests
             res["foo"].Messages.AssertEqual(
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
-                OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnNext(310, " Oof")
             );
 
             res["baR"].Messages.AssertEqual(
@@ -3447,10 +3452,12 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_KeyThrow()
+        public void GroupBy_Capacity_Inner_KeyThrow()
         {
             var scheduler = new TestScheduler();
 
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
                 OnNext(90, "error"),
                 OnNext(110, "error"),
@@ -3481,15 +3488,14 @@ namespace ReactiveTests.Tests
             var res = new Dictionary<string, ITestableObserver<string>>();
 
             var keyInvoked = 0;
-            var ex = new Exception();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x =>
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x =>
             {
                 keyInvoked++;
                 if (keyInvoked == 6)
                     throw ex;
                 return x.Trim();
-            }, x => Reverse(x), g => g.Skip(2), comparer));
+            }, x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3514,7 +3520,7 @@ namespace ReactiveTests.Tests
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
                 OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnError<string>(360, ex)
             );
 
             res["baR"].Messages.AssertEqual(
@@ -3533,10 +3539,12 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_EleThrow()
+        public void GroupBy_Capacity_Inner_EleThrow()
         {
             var scheduler = new TestScheduler();
 
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
                 OnNext(90, "error"),
                 OnNext(110, "error"),
@@ -3567,15 +3575,14 @@ namespace ReactiveTests.Tests
             var res = new Dictionary<string, ITestableObserver<string>>();
 
             var eleInvoked = 0;
-            var ex = new Exception();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x =>
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x =>
             {
                 eleInvoked++;
                 if (eleInvoked == 6)
                     throw ex;
                 return Reverse(x);
-            }, g => g.Skip(2), comparer));
+            }, _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3600,7 +3607,7 @@ namespace ReactiveTests.Tests
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
                 OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnError<string>(360, ex)
             );
 
             res["baR"].Messages.AssertEqual(
@@ -3623,7 +3630,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Comparer_EqualsThrow()
+        public void GroupBy_Capacity_Inner_Comparer_EqualsThrow()
         {
             var scheduler = new TestScheduler();
 
@@ -3656,7 +3663,7 @@ namespace ReactiveTests.Tests
             var innerSubscriptions = new Dictionary<string, IDisposable>();
             var res = new Dictionary<string, ITestableObserver<string>>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3681,7 +3688,7 @@ namespace ReactiveTests.Tests
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
                 OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnError<string>(420, comparer.EqualsException)
             );
 
             res["baR"].Messages.AssertEqual(
@@ -3706,7 +3713,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Comparer_GetHashCodeThrow()
+        public void GroupBy_Capacity_Inner_Comparer_GetHashCodeThrow()
         {
             var scheduler = new TestScheduler();
 
@@ -3739,7 +3746,7 @@ namespace ReactiveTests.Tests
             var innerSubscriptions = new Dictionary<string, IDisposable>();
             var res = new Dictionary<string, ITestableObserver<string>>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3764,7 +3771,7 @@ namespace ReactiveTests.Tests
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
                 OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnError<string>(420, comparer.HashCodeException)
             );
 
             res["baR"].Messages.AssertEqual(
@@ -3789,7 +3796,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Outer_Independence()
+        public void GroupBy_Capacity_Outer_Independence()
         {
             var scheduler = new TestScheduler();
 
@@ -3823,7 +3830,7 @@ namespace ReactiveTests.Tests
             var res = new Dictionary<string, ITestableObserver<string>>();
             var outerResults = scheduler.CreateObserver<string>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3856,23 +3863,25 @@ namespace ReactiveTests.Tests
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
                 OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
             );
 
             res["baR"].Messages.AssertEqual(
                 OnNext(270, "  Rab"),
                 OnNext(390, "rab   "),
                 OnNext(420, "  RAB "),
-                OnCompleted<string>(420)
+                OnCompleted<string>(570)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 420)
+                Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Independence()
+        public void GroupBy_Capacity_Inner_Independence()
         {
             var scheduler = new TestScheduler();
 
@@ -3906,7 +3915,7 @@ namespace ReactiveTests.Tests
             var res = new Dictionary<string, ITestableObserver<string>>();
             var outerResults = scheduler.CreateObserver<string>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -3928,27 +3937,26 @@ namespace ReactiveTests.Tests
 
             scheduler.Start();
 
-            Assert.AreEqual(5, inners.Count);
+            Assert.AreEqual(4, inners.Count);
 
             res["foo"].Messages.AssertEqual(
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
-                OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnNext(310, " Oof")
             );
 
             res["baR"].Messages.AssertEqual(
                 OnNext(270, "  Rab"),
                 OnNext(390, "rab   "),
                 OnNext(420, "  RAB "),
-                OnCompleted<string>(420)
+                OnCompleted<string>(570)
             );
 
             res["Baz"].Messages.AssertEqual(
                 OnNext(350, "   zaB "),
                 OnNext(480, "  zab"),
                 OnNext(510, " ZAb "),
-                OnCompleted<string>(510)
+                OnCompleted<string>(570)
             );
 
             res["qux"].Messages.AssertEqual(
@@ -3956,19 +3964,13 @@ namespace ReactiveTests.Tests
                 OnCompleted<string>(570)
             );
 
-            res["FOO"].Messages.AssertEqual(
-                OnNext(470, " OOF"),
-                OnNext(530, "    oOf    "),
-                OnCompleted<string>(570)
-            );
-
             xs.Subscriptions.AssertEqual(
                 Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Multiple_Independence()
+        public void GroupBy_Capacity_Inner_Multiple_Independence()
         {
             var scheduler = new TestScheduler();
 
@@ -4002,7 +4004,7 @@ namespace ReactiveTests.Tests
             var res = new Dictionary<string, ITestableObserver<string>>();
             var outerResults = scheduler.CreateObserver<string>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), x => Reverse(x), _groupByCapacity, comparer));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -4027,13 +4029,12 @@ namespace ReactiveTests.Tests
 
             scheduler.Start();
 
-            Assert.AreEqual(5, inners.Count);
+            Assert.AreEqual(4, inners.Count);
 
             res["foo"].Messages.AssertEqual(
                 OnNext(220, "oof  "),
                 OnNext(240, " OoF "),
-                OnNext(310, " Oof"),
-                OnCompleted<string>(310)
+                OnNext(310, " Oof")
             );
 
             res["baR"].Messages.AssertEqual(
@@ -4048,19 +4049,13 @@ namespace ReactiveTests.Tests
                 OnNext(360, " xuq  ")
             );
 
-            res["FOO"].Messages.AssertEqual(
-                OnNext(470, " OOF"),
-                OnNext(530, "    oOf    "),
-                OnCompleted<string>(570)
-            );
-
             xs.Subscriptions.AssertEqual(
                 Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Escape_Complete()
+        public void GroupBy_Capacity_Inner_Escape_Complete()
         {
             var scheduler = new TestScheduler();
 
@@ -4079,7 +4074,7 @@ namespace ReactiveTests.Tests
             var innerSubscription = default(IDisposable);
             var res = scheduler.CreateObserver<string>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2)));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), _groupByCapacity));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -4106,7 +4101,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Escape_Error()
+        public void GroupBy_Capacity_Inner_Escape_Error()
         {
             var scheduler = new TestScheduler();
 
@@ -4127,7 +4122,7 @@ namespace ReactiveTests.Tests
             var innerSubscription = default(IDisposable);
             var res = scheduler.CreateObserver<string>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2)));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), _groupByCapacity));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
@@ -4154,7 +4149,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Inner_Escape_Dispose()
+        public void GroupBy_Capacity_Inner_Escape_Dispose()
         {
             var scheduler = new TestScheduler();
 
@@ -4173,14 +4168,14 @@ namespace ReactiveTests.Tests
             var innerSubscription = default(IDisposable);
             var res = scheduler.CreateObserver<string>();
 
-            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2)));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupBy(x => x.Trim(), _groupByCapacity));
 
             scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
                 inner = group;
             }));
 
-            scheduler.ScheduleAbsolute(290, () => outerSubscription.Dispose());
+            scheduler.ScheduleAbsolute(400, () => outerSubscription.Dispose());
 
             scheduler.ScheduleAbsolute(600, () => innerSubscription = inner.Subscribe(res));
 
@@ -4192,7 +4187,7 @@ namespace ReactiveTests.Tests
             scheduler.Start();
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 290)
+                Subscribe(200, 400)
             );
 
             res.Messages.AssertEqual(
@@ -4200,113 +4195,60 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void GroupByUntil_Default()
+        public void GroupBy_Capacity_NullKeys_Simple()
         {
             var scheduler = new TestScheduler();
 
-            var keyInvoked = 0;
-            var eleInvoked = 0;
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(90, "error"),
-                OnNext(110, "error"),
-                OnNext(130, "error"),
-                OnNext(220, "  foo"),
-                OnNext(240, " FoO "),
-                OnNext(270, "baR  "),
-                OnNext(310, "foO "),
-                OnNext(350, " Baz   "),
-                OnNext(360, "  qux "),
-                OnNext(390, "   bar"),
-                OnNext(420, " BAR  "),
-                OnNext(470, "FOO "),
-                OnNext(480, "baz  "),
-                OnNext(510, " bAZ "),
-                OnNext(530, "    fOo    "),
-                OnCompleted<string>(570),
-                OnNext(580, "error"),
-                OnCompleted<string>(600),
-                OnError<string>(650, new Exception())
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnCompleted<string>(500)
             );
 
-            var res = scheduler.Start(() =>
-                xs.GroupByUntil(
-                    x =>
-                    {
-                        keyInvoked++;
-                        return x.Trim().ToLower();
-                    },
-                    x =>
-                    {
-                        eleInvoked++;
-                        return Reverse(x);
-                    },
-                    g => g.Skip(2)
-                ).Select(g => g.Key)
-            );
+            var res = scheduler.Start(() => xs.GroupBy(x => x[0] == 'b' ? null : x.ToUpper(), _groupByCapacity).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
 
             res.Messages.AssertEqual(
-                OnNext(220, "foo"),
-                OnNext(270, "bar"),
-                OnNext(350, "baz"),
-                OnNext(360, "qux"),
-                OnNext(470, "foo"),
-                OnCompleted<string>(570)
+                OnNext(220, "(null)bar"),
+                OnNext(240, "FOOfoo"),
+                OnNext(310, "QUXqux"),
+                OnNext(470, "(null)baz"),
+                OnCompleted<string>(500)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 570)
+                Subscribe(200, 500)
             );
-
-            Assert.AreEqual(12, keyInvoked);
-            Assert.AreEqual(12, eleInvoked);
         }
 
         [TestMethod]
-        public void GroupByUntil_DurationSelector_Throws()
+        public void GroupBy_Capacity_NullKeys_Error()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, "foo")
-            );
-
             var ex = new Exception();
 
-            var res = scheduler.Start(() =>
-                xs.GroupByUntil<string, string, string>(x => x, g => { throw ex; })
-            );
-
-            res.Messages.AssertEqual(
-                OnError<IGroupedObservable<string, string>>(210, ex)
-            );
-
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
-            );
-        }
-
-        [TestMethod]
-        public void GroupByUntil_NullKeys_Simple_Never()
-        {
-            var scheduler = new TestScheduler();
-
             var xs = scheduler.CreateHotObservable(
                 OnNext(220, "bar"),
                 OnNext(240, "foo"),
                 OnNext(310, "qux"),
                 OnNext(470, "baz"),
-                OnCompleted<string>(500)
+                OnError<string>(500, ex)
             );
 
-            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => Observable.Never<Unit>()).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
+            var nullGroup = scheduler.CreateObserver<string>();
+            var err = default(Exception);
 
-            res.Messages.AssertEqual(
-                OnNext(220, "(null)bar"),
-                OnNext(240, "FOOfoo"),
-                OnNext(310, "QUXqux"),
-                OnNext(470, "(null)baz"),
-                OnCompleted<string>(500)
+            scheduler.ScheduleAbsolute(200, () => xs.GroupBy(x => x[0] == 'b' ? null : x.ToUpper(), _groupByCapacity).Where(g => g.Key == null).Subscribe(g => g.Subscribe(nullGroup), ex_ => err = ex_));
+            scheduler.Start();
+
+            Assert.AreSame(ex, err);
+
+            nullGroup.Messages.AssertEqual(
+                OnNext(220, "bar"),
+                OnNext(470, "baz"),
+                OnError<string>(500, ex)
             );
 
             xs.Subscriptions.AssertEqual(
@@ -4314,6070 +4256,12740 @@ namespace ReactiveTests.Tests
             );
         }
 
-        [TestMethod]
-        public void GroupByUntil_NullKeys_Simple_Expire1()
-        {
-            var scheduler = new TestScheduler();
+        #endregion
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(220, "bar"),
-                OnNext(240, "foo"),
-                OnNext(310, "qux"),
-                OnNext(470, "baz"),
-                OnCompleted<string>(500)
-            );
+        #region + GroupByUntil +
 
-            var n = 0;
-            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => { if (g.Key == null) n++; return Observable.Timer(TimeSpan.FromTicks(50), scheduler); }).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
+        [TestMethod]
+        public void GroupByUntil_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>), EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, default(IEqualityComparer<int>)));
 
-            Assert.AreEqual(2, n);
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>)));
 
-            res.Messages.AssertEqual(
-                OnNext(220, "(null)bar"),
-                OnNext(240, "FOOfoo"),
-                OnNext(310, "QUXqux"),
-                OnNext(470, "(null)baz"),
-                OnCompleted<string>(500)
-            );
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>), EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, default(IEqualityComparer<int>)));
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 500)
-            );
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>)));
         }
 
         [TestMethod]
-        public void GroupByUntil_NullKeys_Simple_Expire2()
+        public void GroupByUntil_WithKeyComparer()
         {
             var scheduler = new TestScheduler();
 
+            var keyInvoked = 0;
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(220, "bar"),
-                OnNext(240, "foo"),
-                OnNext(310, "qux"),
-                OnNext(470, "baz"),
-                OnCompleted<string>(500)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var n = 0;
-            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => { if (g.Key == null) n++; return Observable.Timer(TimeSpan.FromTicks(50), scheduler).IgnoreElements(); }).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
+            var comparer = new GroupByComparer(scheduler);
 
-            Assert.AreEqual(2, n);
+            var res = scheduler.Start(() =>
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    g => g.Skip(2),
+                    comparer
+                ).Select(g => g.Key)
+            );
 
             res.Messages.AssertEqual(
-                OnNext(220, "(null)bar"),
-                OnNext(240, "FOOfoo"),
-                OnNext(310, "QUXqux"),
-                OnNext(470, "(null)baz"),
-                OnCompleted<string>(500)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnCompleted<string>(570)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 500)
+                Subscribe(200, 570)
             );
+
+            Assert.AreEqual(12, keyInvoked);
         }
 
         [TestMethod]
-        public void GroupByUntil_NullKeys_Error()
+        public void GroupByUntil_Outer_Complete()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
+            var keyInvoked = 0;
+            var eleInvoked = 0;
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(220, "bar"),
-                OnNext(240, "foo"),
-                OnNext(310, "qux"),
-                OnNext(470, "baz"),
-                OnError<string>(500, ex)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var nullGroup = scheduler.CreateObserver<string>();
-            var err = default(Exception);
-
-            scheduler.ScheduleAbsolute(200, () => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => Observable.Never<Unit>()).Where(g => g.Key == null).Subscribe(g => g.Subscribe(nullGroup), ex_ => err = ex_));
-            scheduler.Start();
+            var comparer = new GroupByComparer(scheduler);
 
-            Assert.AreSame(ex, err);
+            var res = scheduler.Start(() =>
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    comparer
+                ).Select(g => g.Key)
+            );
 
-            nullGroup.Messages.AssertEqual(
-                OnNext(220, "bar"),
-                OnNext(470, "baz"),
-                OnError<string>(500, ex)
+            res.Messages.AssertEqual(
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnCompleted<string>(570)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 500)
+                Subscribe(200, 570)
             );
-        }
-
-        #endregion
-
-        #region + GroupJoin +
 
-        [TestMethod]
-        public void GroupJoinOp_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(null, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, null, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, DummyObservable<int>.Instance, default(Func<int, IObservable<int>>), DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, default(Func<int, IObservable<int>>), DummyFunc<int, IObservable<int>, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, default(Func<int, IObservable<int>, int>)));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>, int>.Instance).Subscribe(null));
+            Assert.AreEqual(12, keyInvoked);
+            Assert.AreEqual(12, eleInvoked);
         }
 
         [TestMethod]
-        public void GroupJoinOp_Normal_I()
+        public void GroupByUntil_Outer_Error()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(280))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+            var ex = new Exception();
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnError<string>(570, ex),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnNext(830, "9rat"),
-                OnCompleted<string>(990)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnError<string>(570, ex)
             );
 
-            AssertDurations(xs, xsd, 990);
-            AssertDurations(ys, ysd, 990);
-
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
-            );
-#else
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 990)
+                Subscribe(200, 570)
             );
-#endif
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 800)
-            );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 990)
-            );
-#endif
+            Assert.AreEqual(12, keyInvoked);
+            Assert.AreEqual(12, eleInvoked);
         }
 
         [TestMethod]
-        public void GroupJoinOp_Normal_II()
+        public void GroupByUntil_Outer_Dispose()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnCompleted<TimeInterval<int>>(721)
-            );
+            var keyInvoked = 0;
+            var eleInvoked = 0;
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(990)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    comparer
+                ).Select(g => g.Key),
+                355
             );
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnCompleted<string>(910)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz")
             );
 
-            AssertDurations(xs, xsd, 910);
-            AssertDurations(ys, ysd, 910);
-
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 721)
-            );
-#else
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 910)
+                Subscribe(200, 355)
             );
-#endif
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 910)
-            );
+            Assert.AreEqual(5, keyInvoked);
+            Assert.AreEqual(5, eleInvoked);
         }
 
         [TestMethod]
-        public void GroupJoinOp_Normal_III()
+        public void GroupByUntil_Outer_KeyThrow()
         {
             var scheduler = new TestScheduler();
 
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(280))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
-            );
-
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler).Where(_ => false), y => NewTimer(ysd, y.Interval, scheduler).Where(_ => false), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        if (keyInvoked == 10)
+                            throw ex;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnNext(830, "9rat"),
-                OnCompleted<string>(990)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnError<string>(480, ex)
             );
 
-            AssertDurations(xs, xsd, 990);
-            AssertDurations(ys, ysd, 990);
-
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
-            );
-#else
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 990)
+                Subscribe(200, 480)
             );
-#endif
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 800)
-            );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 990)
-            );
-#endif
+            Assert.AreEqual(10, keyInvoked);
+            Assert.AreEqual(9, eleInvoked);
         }
 
         [TestMethod]
-        public void GroupJoinOp_Normal_IV()
+        public void GroupByUntil_Outer_EleThrow()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnCompleted<TimeInterval<int>>(990)
-            );
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+            var ex = new Exception();
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(980)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        if (eleInvoked == 10)
+                            throw ex;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnCompleted<string>(990)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnError<string>(480, ex)
             );
 
-            AssertDurations(xs, xsd, 990);
-            AssertDurations(ys, ysd, 990);
-
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 990)
+                Subscribe(200, 480)
             );
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 980)
-            );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 990)
-            );
-#endif
+            Assert.AreEqual(10, keyInvoked);
+            Assert.AreEqual(10, eleInvoked);
         }
 
         [TestMethod]
-        public void GroupJoinOp_Normal_V()
+        public void GroupByUntil_Outer_ComparerEqualsThrow()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnCompleted<TimeInterval<int>>(990)
-            );
+            var keyInvoked = 0;
+            var eleInvoked = 0;
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(900)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler, 250, ushort.MaxValue);
 
             var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
-            );
-
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnCompleted<string>(990)
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    comparer
+                ).Select(g => g.Key)
             );
 
-            AssertDurations(xs, xsd, 990);
-            AssertDurations(ys, ysd, 990);
+            res.Messages.AssertEqual(
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnError<string>(310, comparer.EqualsException)
+            );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 990)
+                Subscribe(200, 310)
             );
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
-            );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 990)
-            );
-#endif
+            Assert.AreEqual(4, keyInvoked);
+            Assert.AreEqual(3, eleInvoked);
         }
 
         [TestMethod]
-        public void GroupJoinOp_Normal_VI()
+        public void GroupByUntil_Outer_ComparerGetHashCodeThrow()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(30))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(200))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(850)
-            );
+            var keyInvoked = 0;
+            var eleInvoked = 0;
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(20))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(900)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler, ushort.MaxValue, 410);
 
             var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnCompleted<string>(920)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnError<string>(420, comparer.HashCodeException)
             );
 
-            AssertDurations(xs, xsd, 920);
-            AssertDurations(ys, ysd, 920);
-
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 850)
-            );
-#else
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 920)
+                Subscribe(200, 420)
             );
-#endif
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
-            );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 920)
-            );
-#endif
+            Assert.AreEqual(8, keyInvoked);
+            Assert.AreEqual(7, eleInvoked);
         }
 
         [TestMethod]
-        public void GroupJoinOp_Normal_VII()
+        public void GroupByUntil_Inner_Complete()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnCompleted<TimeInterval<int>>(210)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(20))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(900)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                scheduler.ScheduleRelative(100, () => innerSubscriptions[group.Key] = group.Subscribe(result));
+            }));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.Start();
+
+            Assert.AreEqual(5, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnCompleted<string>(320)
             );
 
-            res.Messages.AssertEqual(
-                OnCompleted<string>(210)
+            res["baR"].Messages.AssertEqual(
+                OnNext(390, "rab   "),
+                OnCompleted<string>(420)
             );
 
-            AssertDurations(xs, xsd, 210);
-            AssertDurations(ys, ysd, 210);
+            res["Baz"].Messages.AssertEqual(
+                OnNext(480, "  zab"),
+                OnCompleted<string>(510)
+            );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+            res["qux"].Messages.AssertEqual(
+                OnCompleted<string>(570)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+            res["FOO"].Messages.AssertEqual(
+                OnCompleted<string>(570)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void GroupJoinOp_Normal_VIII()
+        public void GroupByUntil_Inner_Complete_All()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(200)))
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(220, new TimeInterval<string>("hat", TimeSpan.FromTicks(100))),
-                OnCompleted<TimeInterval<string>>(230)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }));
 
-            res.Messages.AssertEqual(
-                OnNext(220, "0hat")
-            );
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-            AssertDurations(xs, xsd, 1000);
-            AssertDurations(ys, ysd, 1000);
+            scheduler.Start();
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 1000)
-            );
+            Assert.AreEqual(5, inners.Count);
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 230)
-            );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 1000)
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
-#endif
-        }
-
-        [TestMethod]
-        public void GroupJoinOp_Normal_IX()
-        {
-            var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnNext(420, "  RAB "),
+                OnCompleted<string>(420)
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnNext(480, "  zab"),
+                OnNext(510, " ZAb "),
+                OnCompleted<string>(510)
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
-
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge(),
-                713
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  "),
+                OnCompleted<string>(570)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man")
+            res["FOO"].Messages.AssertEqual(
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
             );
 
-            AssertDurations(xs, xsd, 713);
-            AssertDurations(ys, ysd, 713);
-
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 713)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 713)
+                Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void GroupJoinOp_Error_I()
+        public void GroupByUntil_Inner_Error()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
+            var ex1 = new Exception();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnError<TimeInterval<int>>(310, ex)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnError<string>(570, ex1),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                scheduler.ScheduleRelative(100, () => innerSubscriptions[group.Key] = group.Subscribe(result));
+            }, ex => { }));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.Start();
+
+            Assert.AreEqual(5, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnCompleted<string>(320)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnError<string>(310, ex)
+            res["baR"].Messages.AssertEqual(
+                OnNext(390, "rab   "),
+                OnCompleted<string>(420)
+               );
+
+            res["Baz"].Messages.AssertEqual(
+                OnNext(480, "  zab"),
+                OnCompleted<string>(510)
             );
 
-            AssertDurations(xs, xsd, 310);
-            AssertDurations(ys, ysd, 310);
+            res["qux"].Messages.AssertEqual(
+                OnError<string>(570, ex1)
+            );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 310)
+            res["FOO"].Messages.AssertEqual(
+                OnError<string>(570, ex1)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 310)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void GroupJoinOp_Error_II()
+        public void GroupByUntil_Inner_Dispose()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnError<TimeInterval<string>>(722, ex)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }));
+
+            scheduler.ScheduleAbsolute(400, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.Start();
+
+            Assert.AreEqual(4, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnError<string>(722, ex)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   ")
             );
 
-            AssertDurations(xs, xsd, 722);
-            AssertDurations(ys, ysd, 722);
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB ")
+            );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 722)
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  ")
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 722)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
             );
         }
 
         [TestMethod]
-        public void GroupJoinOp_Error_III()
+        public void GroupByUntil_Inner_KeyThrow()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
+            var keyInvoked = 0;
             var ex = new Exception();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x =>
+            {
+                keyInvoked++;
+                if (keyInvoked == 6)
+                    throw ex;
+                return x.Trim();
+            }, x => Reverse(x), g => g.Skip(2), comparer));
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler).SelectMany(x.Value == 6 ? Observable.Throw<long>(ex) : Observable.Empty<long>()), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, _ => { }));
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnError<string>(725, ex)
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.Start();
+
+            Assert.AreEqual(3, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            AssertDurations(xs, xsd, 725);
-            AssertDurations(ys, ysd, 725);
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnError<string>(360, ex)
+            );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 725)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnError<string>(360, ex)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 725)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 360)
             );
         }
 
         [TestMethod]
-        public void GroupJoinOp_Error_IV()
+        public void GroupByUntil_Inner_EleThrow()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
-
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(19))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ex = new Exception();
-
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler).SelectMany(y.Value == "tin" ? Observable.Throw<long>(ex) : Observable.Empty<long>()), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
-            );
+            var eleInvoked = 0;
+            var ex = new Exception();
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnError<string>(721, ex)
-            );
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x =>
+            {
+                eleInvoked++;
+                if (eleInvoked == 6)
+                    throw ex;
+                return Reverse(x);
+            }, g => g.Skip(2), comparer));
 
-            AssertDurations(xs, xsd, 721);
-            AssertDurations(ys, ysd, 721);
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, _ => { }));
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 721)
-            );
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 721)
-            );
-        }
+            scheduler.Start();
 
-        [TestMethod]
-        public void GroupJoinOp_Error_V()
-        {
-            var scheduler = new TestScheduler();
+            Assert.AreEqual(4, inners.Count);
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnError<string>(360, ex)
             );
 
-            var ex = new Exception();
-
-            var ysd = new List<ITestableObservable<long>>();
-
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => { if (x.Value >= 0) throw ex; return Observable.Empty<long>(); }, y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnError<string>(360, ex)
             );
 
-            res.Messages.AssertEqual(
-                OnError<string>(210, ex)
+            res["qux"].Messages.AssertEqual(
+                OnError<string>(360, ex)
             );
 
-            AssertDurations(ys, ysd, 210);
-
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+                Subscribe(200, 360)
             );
         }
 
         [TestMethod]
-        public void GroupJoinOp_Error_VI()
+        public void GroupByUntil_Inner_Comparer_EqualsThrow()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
-            );
+            var comparer = new GroupByComparer(scheduler, 400, ushort.MaxValue);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var ex = new Exception();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
 
-            var xsd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, _ => { }));
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => { if (y.Value.Length >= 0) throw ex; return Observable.Empty<long>(); }, (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.Start();
+
+            Assert.AreEqual(4, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            res.Messages.AssertEqual(
-                OnError<string>(215, ex)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnError<string>(420, comparer.EqualsException)
             );
 
-            AssertDurations(xs, xsd, 215);
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnError<string>(420, comparer.EqualsException)
+            );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  "),
+                OnError<string>(420, comparer.EqualsException)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
             );
         }
 
         [TestMethod]
-        public void GroupJoinOp_Error_VII()
+        public void GroupByUntil_Inner_Comparer_GetHashCodeThrow()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
-
-            var ys = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ex = new Exception();
+            var comparer = new GroupByComparer(scheduler, ushort.MaxValue, 400);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => { if (x.Value >= 0) throw ex; return yy.Select(y => x.Value + y.Value); }).Merge()
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, _ => { }));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.Start();
+
+            Assert.AreEqual(4, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            res.Messages.AssertEqual(
-                OnError<string>(215, ex)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnError<string>(420, comparer.HashCodeException)
             );
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x - Duration selector is now invoked before the result selector
-            AssertDurations(xs, xsd, 215);
-#endif
-            AssertDurations(ys, ysd, 215);
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnError<string>(420, comparer.HashCodeException)
+            );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  "),
+                OnError<string>(420, comparer.HashCodeException)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
             );
         }
 
         [TestMethod]
-        public void GroupJoinOp_Error_VIII()
+        public void GroupByUntil_Outer_Independence()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
+            var outerResults = scheduler.CreateObserver<string>();
 
-            var ex = new Exception();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                outerResults.OnNext(group.Key);
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, outerResults.OnError, outerResults.OnCompleted));
 
-            var res = scheduler.Start(() =>
-                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => { if (x.Value >= 0) throw ex; return yy.Select(y => x.Value + y.Value); }).Merge()
-            );
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-            res.Messages.AssertEqual(
-                OnError<string>(210, ex)
-            );
+            scheduler.ScheduleAbsolute(320, () => outerSubscription.Dispose());
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x - Duration selector is now invoked before the result selector
-            AssertDurations(xs, xsd, 210);
-#endif
-            AssertDurations(ys, ysd, 210);
+            scheduler.Start();
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
-            );
+            Assert.AreEqual(2, inners.Count);
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+            outerResults.Messages.AssertEqual(
+                OnNext(220, "foo"),
+                OnNext(270, "baR")
             );
-        }
 
-        #endregion
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
+            );
 
-        #region + Join +
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnNext(420, "  RAB "),
+                OnCompleted<string>(420)
+            );
 
-        [TestMethod]
-        public void JoinOp_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(null, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, null, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, DummyObservable<int>.Instance, default(Func<int, IObservable<int>>), DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, default(Func<int, IObservable<int>>), DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, default(Func<int, int, int>)));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance).Subscribe(null));
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
+            );
         }
 
         [TestMethod]
-        public void JoinOp_Normal_I()
+        public void GroupByUntil_Inner_Independence()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
-
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
-
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
+            var outerResults = scheduler.CreateObserver<string>();
+
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
+
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                outerResults.OnNext(group.Key);
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, outerResults.OnError, outerResults.OnCompleted));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.ScheduleAbsolute(320, () => innerSubscriptions["foo"].Dispose());
+
+            scheduler.Start();
+
+            Assert.AreEqual(5, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnNext(830, "9rat"),
-                OnCompleted<string>(900)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnNext(420, "  RAB "),
+                OnCompleted<string>(420)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnNext(480, "  zab"),
+                OnNext(510, " ZAb "),
+                OnCompleted<string>(510)
             );
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 800)
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  "),
+                OnCompleted<string>(570)
             );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
+
+            res["FOO"].Messages.AssertEqual(
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
             );
-#endif
 
-            AssertDurations(xs, xsd, 900);
-            AssertDurations(ys, ysd, 900);
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
+            );
         }
 
         [TestMethod]
-        public void JoinOp_Normal_II()
+        public void GroupByUntil_Inner_Multiple_Independence()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnCompleted<TimeInterval<int>>(721)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(990)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
+            var outerResults = scheduler.CreateObserver<string>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), comparer));
 
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                outerResults.OnNext(group.Key);
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, outerResults.OnError, outerResults.OnCompleted));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.ScheduleAbsolute(320, () => innerSubscriptions["foo"].Dispose());
+            scheduler.ScheduleAbsolute(280, () => innerSubscriptions["baR"].Dispose());
+            scheduler.ScheduleAbsolute(355, () => innerSubscriptions["Baz"].Dispose());
+            scheduler.ScheduleAbsolute(400, () => innerSubscriptions["qux"].Dispose());
+
+            scheduler.Start();
+
+            Assert.AreEqual(5, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnCompleted<string>(910)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab")
             );
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 721)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB ")
             );
-#else
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 910)
+
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  ")
             );
-#endif
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 910)
+            res["FOO"].Messages.AssertEqual(
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
             );
 
-            AssertDurations(xs, xsd, 910);
-            AssertDurations(ys, ysd, 910);
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
+            );
         }
 
         [TestMethod]
-        public void JoinOp_Normal_III()
+        public void GroupByUntil_Inner_Escape_Complete()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(310, "foO "),
+                OnNext(470, "FOO "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570)
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
-            );
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inner = default(IObservable<string>);
+            var innerSubscription = default(IDisposable);
+            var res = scheduler.CreateObserver<string>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2)));
 
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler).Where(_ => false), y => NewTimer(ysd, y.Interval, scheduler).Where(_ => false), (x, y) => x.Value + y.Value)
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                inner = group;
+            }));
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnNext(830, "9rat"),
-                OnCompleted<string>(900)
-            );
+            scheduler.ScheduleAbsolute(600, () => innerSubscription = inner.Subscribe(res));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                innerSubscription.Dispose();
+            });
+
+            scheduler.Start();
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
+                Subscribe(200, 570)
             );
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 800)
-            );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
+            res.Messages.AssertEqual(
+                OnCompleted<string>(600)
             );
-#endif
-
-            AssertDurations(xs, xsd, 900);
-            AssertDurations(ys, ysd, 900);
         }
 
         [TestMethod]
-        public void JoinOp_Normal_IV()
+        public void GroupByUntil_Inner_Escape_Error()
         {
             var scheduler = new TestScheduler();
 
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnCompleted<TimeInterval<int>>(990)
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(310, "foO "),
+                OnNext(470, "FOO "),
+                OnNext(530, "    fOo    "),
+                OnError<string>(570, ex)
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(980)
-            );
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inner = default(IObservable<string>);
+            var innerSubscription = default(IDisposable);
+            var res = scheduler.CreateObserver<string>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2)));
 
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                inner = group;
+            }, _ => { }));
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnCompleted<string>(980)
-            );
+            scheduler.ScheduleAbsolute(600, () => innerSubscription = inner.Subscribe(res));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                innerSubscription.Dispose();
+            });
+
+            scheduler.Start();
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 980)
+                Subscribe(200, 570)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 980)
+            res.Messages.AssertEqual(
+                OnError<string>(600, ex)
             );
-
-            AssertDurations(xs, xsd, 980);
-            AssertDurations(ys, ysd, 980);
         }
 
         [TestMethod]
-        public void JoinOp_Normal_V()
+        public void GroupByUntil_Inner_Escape_Dispose()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnCompleted<TimeInterval<int>>(990)
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(310, "foO "),
+                OnNext(470, "FOO "),
+                OnNext(530, "    fOo    "),
+                OnError<string>(570, new Exception())
             );
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(900)
-            );
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inner = default(IObservable<string>);
+            var innerSubscription = default(IDisposable);
+            var res = scheduler.CreateObserver<string>();
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2)));
 
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                inner = group;
+            }));
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnCompleted<string>(922)
-            );
+            scheduler.ScheduleAbsolute(290, () => outerSubscription.Dispose());
+
+            scheduler.ScheduleAbsolute(600, () => innerSubscription = inner.Subscribe(res));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                innerSubscription.Dispose();
+            });
+
+            scheduler.Start();
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 922)
+                Subscribe(200, 290)
             );
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
-            );
-#else
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 922)
+            res.Messages.AssertEqual(
             );
-#endif
-
-            AssertDurations(xs, xsd, 922);
-            AssertDurations(ys, ysd, 922);
         }
 
         [TestMethod]
-        public void JoinOp_Normal_VI()
+        public void GroupByUntil_Default()
         {
             var scheduler = new TestScheduler();
 
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(30))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(200))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(850)
-            );
-
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(20))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(900)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
-
             var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim().ToLower();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2)
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnNext(732, "7wig"),
-                OnNext(732, "8wig"),
-                OnCompleted<string>(900)
+                OnNext(220, "foo"),
+                OnNext(270, "bar"),
+                OnNext(350, "baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "foo"),
+                OnCompleted<string>(570)
             );
 
-#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 850)
-            );
-#else
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
-            );
-#endif
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
+                Subscribe(200, 570)
             );
 
-            AssertDurations(xs, xsd, 900);
-            AssertDurations(ys, ysd, 900);
+            Assert.AreEqual(12, keyInvoked);
+            Assert.AreEqual(12, eleInvoked);
         }
 
         [TestMethod]
-        public void JoinOp_Normal_VII()
+        public void GroupByUntil_DurationSelector_Throws()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
-
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+                OnNext(210, "foo")
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var ex = new Exception();
 
             var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value),
-                713
+                xs.GroupByUntil<string, string, string>(x => x, g => { throw ex; })
             );
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man")
+                OnError<IGroupedObservable<string, string>>(210, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 713)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 713)
+                Subscribe(200, 210)
             );
-
-            AssertDurations(xs, xsd, 713);
-            AssertDurations(ys, ysd, 713);
         }
 
         [TestMethod]
-        public void JoinOp_Error_I()
+        public void GroupByUntil_NullKeys_Simple_Never()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnError<TimeInterval<int>>(310, ex)
-            );
-
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnCompleted<string>(500)
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
-
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
-            );
+            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => Observable.Never<Unit>()).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnError<string>(310, ex)
+                OnNext(220, "(null)bar"),
+                OnNext(240, "FOOfoo"),
+                OnNext(310, "QUXqux"),
+                OnNext(470, "(null)baz"),
+                OnCompleted<string>(500)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 310)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 310)
+                Subscribe(200, 500)
             );
-
-            AssertDurations(xs, xsd, 310);
-            AssertDurations(ys, ysd, 310);
         }
 
         [TestMethod]
-        public void JoinOp_Error_II()
+        public void GroupByUntil_NullKeys_Simple_Expire1()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
-
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnError<TimeInterval<string>>(722, ex)
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnCompleted<string>(500)
             );
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var n = 0;
+            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => { if (g.Key == null) n++; return Observable.Timer(TimeSpan.FromTicks(50), scheduler); }).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
 
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
-            );
+            Assert.AreEqual(2, n);
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnError<string>(722, ex)
+                OnNext(220, "(null)bar"),
+                OnNext(240, "FOOfoo"),
+                OnNext(310, "QUXqux"),
+                OnNext(470, "(null)baz"),
+                OnCompleted<string>(500)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 722)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 722)
+                Subscribe(200, 500)
             );
-
-            AssertDurations(xs, xsd, 722);
-            AssertDurations(ys, ysd, 722);
         }
 
         [TestMethod]
-        public void JoinOp_Error_III()
+        public void GroupByUntil_NullKeys_Simple_Expire2()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
-
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnCompleted<string>(500)
             );
 
-            var ex = new Exception();
-
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var n = 0;
+            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => { if (g.Key == null) n++; return Observable.Timer(TimeSpan.FromTicks(50), scheduler).IgnoreElements(); }).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
 
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler).SelectMany(x.Value == 6 ? Observable.Throw<long>(ex) : Observable.Empty<long>()), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
-            );
+            Assert.AreEqual(2, n);
 
             res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnNext(722, "7rat"),
-                OnNext(722, "6rat"),
-                OnNext(722, "8rat"),
-                OnError<string>(725, ex)
+                OnNext(220, "(null)bar"),
+                OnNext(240, "FOOfoo"),
+                OnNext(310, "QUXqux"),
+                OnNext(470, "(null)baz"),
+                OnCompleted<string>(500)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 725)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 725)
+                Subscribe(200, 500)
             );
-
-            AssertDurations(xs, xsd, 725);
-            AssertDurations(ys, ysd, 725);
         }
 
         [TestMethod]
-        public void JoinOp_Error_IV()
+        public void GroupByUntil_NullKeys_Error()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
+            var ex = new Exception();
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(19))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnError<string>(500, ex)
             );
 
-            var ex = new Exception();
+            var nullGroup = scheduler.CreateObserver<string>();
+            var err = default(Exception);
 
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            scheduler.ScheduleAbsolute(200, () => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => Observable.Never<Unit>()).Where(g => g.Key == null).Subscribe(g => g.Subscribe(nullGroup), ex_ => err = ex_));
+            scheduler.Start();
 
-            var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler).SelectMany(y.Value == "tin" ? Observable.Throw<long>(ex) : Observable.Empty<long>()), (x, y) => x.Value + y.Value)
-            );
+            Assert.AreSame(ex, err);
 
-            res.Messages.AssertEqual(
-                OnNext(215, "0hat"),
-                OnNext(217, "0bat"),
-                OnNext(219, "1hat"),
-                OnNext(300, "3wag"),
-                OnNext(300, "3pig"),
-                OnNext(305, "3cup"),
-                OnNext(310, "4wag"),
-                OnNext(310, "4pig"),
-                OnNext(310, "4cup"),
-                OnNext(702, "6tin"),
-                OnNext(710, "7tin"),
-                OnNext(712, "7man"),
-                OnNext(712, "6man"),
-                OnNext(720, "8tin"),
-                OnNext(720, "8man"),
-                OnError<string>(721, ex)
+            nullGroup.Messages.AssertEqual(
+                OnNext(220, "bar"),
+                OnNext(470, "baz"),
+                OnError<string>(500, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 721)
+                Subscribe(200, 500)
             );
+        }
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 721)
-            );
+        #endregion
 
-            AssertDurations(xs, xsd, 721);
-            AssertDurations(ys, ysd, 721);
+        #region + GroupByUntil w/capacity +
+
+        private const int _groupByUntilCapacity = 1024;
+
+        [TestMethod]
+        public void GroupByUntil_Capacity_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>), _groupByUntilCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity, default(IEqualityComparer<int>)));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>), _groupByUntilCapacity));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>), _groupByUntilCapacity, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity, default(IEqualityComparer<int>)));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(default(IObservable<int>), DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, default(Func<int, int>), DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, _groupByUntilCapacity));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, default(Func<IGroupedObservable<int, int>, IObservable<int>>), _groupByUntilCapacity));
+
+            ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, -1, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, -1));
+            ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, -1, EqualityComparer<int>.Default));
+            ReactiveAssert.Throws<ArgumentOutOfRangeException>(() => Observable.GroupByUntil(DummyObservable<int>.Instance, DummyFunc<int, int>.Instance, DummyFunc<IGroupedObservable<int, int>, IObservable<int>>.Instance, -1));
         }
 
         [TestMethod]
-        public void JoinOp_Error_V()
+        public void GroupByUntil_Capacity_WithKeyComparer()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
+            var keyInvoked = 0;
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ex = new Exception();
-
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.Join(ys, x => { if (x.Value >= 0) throw ex; return Observable.Empty<long>(); }, y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity,
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnError<string>(210, ex)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnCompleted<string>(570)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+                Subscribe(200, 570)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
-            );
-
-            AssertDurations(ys, ysd, 210);
+            Assert.AreEqual(12, keyInvoked);
         }
 
         [TestMethod]
-        public void JoinOp_Error_VI()
+        public void GroupByUntil_Capacity_Outer_Complete()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
+            var keyInvoked = 0;
+            var eleInvoked = 0;
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ex = new Exception();
-
-            var xsd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => { if (y.Value.Length >= 0) throw ex; return Observable.Empty<long>(); }, (x, y) => x.Value + y.Value)
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity,
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnError<string>(215, ex)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnCompleted<string>(570)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
+                Subscribe(200, 570)
             );
 
-            AssertDurations(xs, xsd, 215);
+            Assert.AreEqual(12, keyInvoked);
+            Assert.AreEqual(12, eleInvoked);
         }
 
         [TestMethod]
-        public void JoinOp_Error_VII()
+        public void GroupByUntil_Capacity_Outer_Error()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+            var ex = new Exception();
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnError<string>(570, ex),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ex = new Exception();
-
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => { if (x.Value >= 0) throw ex; return x.Value + y.Value; })
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity,
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnError<string>(215, ex)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnError<string>(570, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
+                Subscribe(200, 570)
             );
 
-            AssertDurations(xs, xsd, 215);
-            AssertDurations(ys, ysd, 215);
+            Assert.AreEqual(12, keyInvoked);
+            Assert.AreEqual(12, eleInvoked);
         }
 
         [TestMethod]
-        public void JoinOp_Error_VIII()
+        public void GroupByUntil_Capacity_Outer_Dispose()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
-                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
-                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
-                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
-                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
-                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
-                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
-                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
-                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
-                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
-                OnCompleted<TimeInterval<int>>(900)
-            );
+            var keyInvoked = 0;
+            var eleInvoked = 0;
 
-            var ys = scheduler.CreateHotObservable(
-                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
-                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
-                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
-                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
-                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
-                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
-                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
-                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
-                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
-                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
-                OnCompleted<TimeInterval<string>>(800)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ex = new Exception();
-
-            var xsd = new List<ITestableObservable<long>>();
-            var ysd = new List<ITestableObservable<long>>();
+            var comparer = new GroupByComparer(scheduler);
 
             var res = scheduler.Start(() =>
-                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => { if (x.Value >= 0) throw ex; return x.Value + y.Value; })
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity,
+                    comparer
+                ).Select(g => g.Key),
+                355
             );
 
             res.Messages.AssertEqual(
-                OnError<string>(215, ex)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz")
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
+                Subscribe(200, 355)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(200, 215)
-            );
-
-            AssertDurations(xs, xsd, 215);
-            AssertDurations(ys, ysd, 215);
-        }
-
-        private ITestableObservable<long> NewTimer(List<ITestableObservable<long>> l, TimeSpan t, TestScheduler scheduler)
-        {
-            var timer = scheduler.CreateColdObservable(OnNext(t.Ticks, 0L), OnCompleted<long>(t.Ticks));
-            l.Add(timer);
-            return timer;
-        }
-
-        private void AssertDurations<T, U>(ITestableObservable<TimeInterval<T>> xs, List<ITestableObservable<U>> xsd, long lastEnd)
-        {
-            Assert.AreEqual(xs.Messages.Where(x => x.Value.Kind == NotificationKind.OnNext && x.Time <= lastEnd).Count(), xsd.Count);
-
-            foreach (var pair in xs.Messages.Zip(xsd, (x, y) => new { Item1 = x, Item2 = y }))
-            {
-                var start = pair.Item1.Time;
-                var end = Math.Min(start + pair.Item1.Value.Value.Interval.Ticks, lastEnd);
-                pair.Item2.Subscriptions.AssertEqual(
-                    Subscribe(start, end)
-                );
-            }
-        }
-
-        #endregion
-
-        #region + OfType +
-
-        [TestMethod]
-        public void OfType_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OfType<bool>(default(IObservable<object>)));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OfType<bool>(DummyObservable<object>.Instance).Subscribe(null));
-        }
+            Assert.AreEqual(5, keyInvoked);
+            Assert.AreEqual(5, eleInvoked);
+        }
 
         [TestMethod]
-        public void OfType_Complete()
+        public void GroupByUntil_Capacity_Outer_KeyThrow()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable<object>(
-                OnNext<object>(210, new B(0)),
-                OnNext<object>(220, new A(1)),
-                OnNext<object>(230, new E(2)),
-                OnNext<object>(240, new D(3)),
-                OnNext<object>(250, new C(4)),
-                OnNext<object>(260, new B(5)),
-                OnNext<object>(270, new B(6)),
-                OnNext<object>(280, new D(7)),
-                OnNext<object>(290, new A(8)),
-                OnNext<object>(300, new E(9)),
-                OnNext<object>(310, 3),
-                OnNext<object>(320, "foo"),
-                OnNext<object>(330, true),
-                OnNext<object>(340, new B(10)),
-                OnCompleted<object>(350)
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
+            var comparer = new GroupByComparer(scheduler);
+
             var res = scheduler.Start(() =>
-                xs.OfType<B>()
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        if (keyInvoked == 10)
+                            throw ex;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity,
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext<B>(210, new B(0)),
-                OnNext<B>(240, new D(3)),
-                OnNext<B>(260, new B(5)),
-                OnNext<B>(270, new B(6)),
-                OnNext<B>(280, new D(7)),
-                OnNext<B>(340, new B(10)),
-                OnCompleted<B>(350)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnError<string>(480, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 350)
+                Subscribe(200, 480)
             );
+
+            Assert.AreEqual(10, keyInvoked);
+            Assert.AreEqual(9, eleInvoked);
         }
 
         [TestMethod]
-        public void OfType_Error()
+        public void GroupByUntil_Capacity_Outer_EleThrow()
         {
             var scheduler = new TestScheduler();
 
+            var keyInvoked = 0;
+            var eleInvoked = 0;
             var ex = new Exception();
 
-            var xs = scheduler.CreateHotObservable<object>(
-                OnNext<object>(210, new B(0)),
-                OnNext<object>(220, new A(1)),
-                OnNext<object>(230, new E(2)),
-                OnNext<object>(240, new D(3)),
-                OnNext<object>(250, new C(4)),
-                OnNext<object>(260, new B(5)),
-                OnNext<object>(270, new B(6)),
-                OnNext<object>(280, new D(7)),
-                OnNext<object>(290, new A(8)),
-                OnNext<object>(300, new E(9)),
-                OnNext<object>(310, 3),
-                OnNext<object>(320, "foo"),
-                OnNext<object>(330, true),
-                OnNext<object>(340, new B(10)),
-                OnError<object>(350, ex)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
+            var comparer = new GroupByComparer(scheduler);
+
             var res = scheduler.Start(() =>
-                xs.OfType<B>()
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        if (eleInvoked == 10)
+                            throw ex;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity,
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext<B>(210, new B(0)),
-                OnNext<B>(240, new D(3)),
-                OnNext<B>(260, new B(5)),
-                OnNext<B>(270, new B(6)),
-                OnNext<B>(280, new D(7)),
-                OnNext<B>(340, new B(10)),
-                OnError<B>(350, ex)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "FOO"),
+                OnError<string>(480, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 350)
+                Subscribe(200, 480)
             );
+
+            Assert.AreEqual(10, keyInvoked);
+            Assert.AreEqual(10, eleInvoked);
         }
 
         [TestMethod]
-        public void OfType_Dispose()
+        public void GroupByUntil_Capacity_Outer_ComparerEqualsThrow()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable<object>(
-                OnNext<object>(210, new B(0)),
-                OnNext<object>(220, new A(1)),
-                OnNext<object>(230, new E(2)),
-                OnNext<object>(240, new D(3)),
-                OnNext<object>(250, new C(4)),
-                OnNext<object>(260, new B(5)),
-                OnNext<object>(270, new B(6)),
-                OnNext<object>(280, new D(7)),
-                OnNext<object>(290, new A(8)),
-                OnNext<object>(300, new E(9)),
-                OnNext<object>(310, 3),
-                OnNext<object>(320, "foo"),
-                OnNext<object>(330, true),
-                OnNext<object>(340, new B(10)),
-                OnError<object>(350, new Exception())
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
+            var comparer = new GroupByComparer(scheduler, 250, ushort.MaxValue);
+
             var res = scheduler.Start(() =>
-                xs.OfType<B>(),
-                275
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity,
+                    comparer
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext<B>(210, new B(0)),
-                OnNext<B>(240, new D(3)),
-                OnNext<B>(260, new B(5)),
-                OnNext<B>(270, new B(6))
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnError<string>(310, comparer.EqualsException)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 275)
+                Subscribe(200, 310)
             );
-        }
-
-        #endregion
-
-        #region + Select +
-
-        [TestMethod]
-        public void Select_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).Select<int, int>(DummyFunc<int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Select<int, int>((Func<int, int>)null));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Select<int, int>(DummyFunc<int, int>.Instance).Subscribe(null));
-        }
 
-        [TestMethod]
-        public void Select_Throws()
-        {
-            ReactiveAssert.Throws<InvalidOperationException>(() =>
-                Observable.Return(1).Select<int, int>(x => x).Subscribe(
-                 x =>
-                 {
-                     throw new InvalidOperationException();
-                 }));
-            ReactiveAssert.Throws<InvalidOperationException>(() =>
-                Observable.Throw<int>(new Exception()).Select<int, int>(x => x).Subscribe(
-                 x => { },
-                 exception =>
-                 {
-                     throw new InvalidOperationException();
-                 }));
-            ReactiveAssert.Throws<InvalidOperationException>(() =>
-                 Observable.Empty<int>().Select<int, int>(x => x).Subscribe(
-                 x => { },
-                 exception => { },
-                 () =>
-                 {
-                     throw new InvalidOperationException();
-                 }));
-            ReactiveAssert.Throws<InvalidOperationException>(() => Observable.Create<int>(new Func<IObserver<int>, Action>(o => { throw new InvalidOperationException(); })).Select(x => x).Subscribe());
+            Assert.AreEqual(4, keyInvoked);
+            Assert.AreEqual(3, eleInvoked);
         }
 
         [TestMethod]
-        public void Select_DisposeInsideSelector()
+        public void GroupByUntil_Capacity_Outer_ComparerGetHashCodeThrow()
         {
             var scheduler = new TestScheduler();
 
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(100, 1),
-                OnNext(200, 2),
-                OnNext(500, 3),
-                OnNext(600, 4)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var invoked = 0;
-
-            var res = scheduler.CreateObserver<int>();
-
-            var d = new SerialDisposable();
-            d.Disposable = xs.Select(x =>
-            {
-                invoked++;
-                if (scheduler.Clock > 400)
-                    d.Dispose();
-                return x;
-            }).Subscribe(res);
-
-            scheduler.ScheduleAbsolute(Disposed, d.Dispose);
+            var comparer = new GroupByComparer(scheduler, ushort.MaxValue, 410);
 
-            scheduler.Start();
+            var res = scheduler.Start(() =>
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity,
+                    comparer
+                ).Select(g => g.Key)
+            );
 
             res.Messages.AssertEqual(
-                OnNext(100, 1),
-                OnNext(200, 2)
+                OnNext(220, "foo"),
+                OnNext(270, "baR"),
+                OnNext(350, "Baz"),
+                OnNext(360, "qux"),
+                OnError<string>(420, comparer.HashCodeException)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(0, 500)
+                Subscribe(200, 420)
             );
 
-            Assert.AreEqual(3, invoked);
+            Assert.AreEqual(8, keyInvoked);
+            Assert.AreEqual(7, eleInvoked);
         }
 
         [TestMethod]
-        public void Select_Completed()
+        public void GroupByUntil_Capacity_Inner_Complete()
         {
             var scheduler = new TestScheduler();
 
-            var invoked = 0;
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(180, 1),
-                OnNext(210, 2),
-                OnNext(240, 3),
-                OnNext(290, 4),
-                OnNext(350, 5),
-                OnCompleted<int>(400),
-                OnNext(410, -1),
-                OnCompleted<int>(420),
-                OnError<int>(430, new Exception())
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var res = scheduler.Start(() =>
-                xs.Select(x =>
-                {
-                    invoked++;
-                    return x + 1;
-                })
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            res.Messages.AssertEqual(
-                OnNext(210, 3),
-                OnNext(240, 4),
-                OnNext(290, 5),
-                OnNext(350, 6),
-                OnCompleted<int>(400)
-            );
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 400)
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                scheduler.ScheduleRelative(100, () => innerSubscriptions[group.Key] = group.Subscribe(result));
+            }));
 
-            Assert.AreEqual(4, invoked);
-        }
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-        [TestMethod]
-        public void Select_NotCompleted()
-        {
-            var scheduler = new TestScheduler();
+            scheduler.Start();
 
-            var invoked = 0;
+            Assert.AreEqual(5, inners.Count);
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(180, 1),
-                OnNext(210, 2),
-                OnNext(240, 3),
-                OnNext(290, 4),
-                OnNext(350, 5)
+            res["foo"].Messages.AssertEqual(
+                OnCompleted<string>(320)
             );
 
-            var res = scheduler.Start(() =>
-                xs.Select(x =>
-                {
-                    invoked++;
-                    return x + 1;
-                })
+            res["baR"].Messages.AssertEqual(
+                OnNext(390, "rab   "),
+                OnCompleted<string>(420)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(210, 3),
-                OnNext(240, 4),
-                OnNext(290, 5),
-                OnNext(350, 6)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(480, "  zab"),
+                OnCompleted<string>(510)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 1000)
+            res["qux"].Messages.AssertEqual(
+                OnCompleted<string>(570)
             );
 
-            Assert.AreEqual(4, invoked);
+            res["FOO"].Messages.AssertEqual(
+                OnCompleted<string>(570)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
+            );
         }
 
         [TestMethod]
-        public void Select_Error()
+        public void GroupByUntil_Capacity_Inner_Complete_All()
         {
             var scheduler = new TestScheduler();
 
-            var invoked = 0;
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
+            );
 
-            var ex = new Exception();
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(180, 1),
-                OnNext(210, 2),
-                OnNext(240, 3),
-                OnNext(290, 4),
-                OnNext(350, 5),
-                OnError<int>(400, ex),
-                OnNext(410, -1),
-                OnCompleted<int>(420),
-                OnError<int>(430, new Exception())
-            );
-
-            var res = scheduler.Start(() =>
-                xs.Select(x =>
-                {
-                    invoked++;
-                    return x + 1;
-                })
-            );
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
 
-            res.Messages.AssertEqual(
-                OnNext(210, 3),
-                OnNext(240, 4),
-                OnNext(290, 5),
-                OnNext(350, 6),
-                OnError<int>(400, ex)
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }));
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 400)
-            );
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-            Assert.AreEqual(4, invoked);
-        }
+            scheduler.Start();
 
-        [TestMethod]
-        public void Select_SelectorThrows()
-        {
-            var scheduler = new TestScheduler();
+            Assert.AreEqual(5, inners.Count);
 
-            var invoked = 0;
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
+            );
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(180, 1),
-                OnNext(210, 2),
-                OnNext(240, 3),
-                OnNext(290, 4),
-                OnNext(350, 5),
-                OnCompleted<int>(400),
-                OnNext(410, -1),
-                OnCompleted<int>(420),
-                OnError<int>(430, new Exception())
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnNext(420, "  RAB "),
+                OnCompleted<string>(420)
             );
 
-            var ex = new Exception();
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnNext(480, "  zab"),
+                OnNext(510, " ZAb "),
+                OnCompleted<string>(510)
+            );
 
-            var res = scheduler.Start(() =>
-                xs.Select(x =>
-                {
-                    invoked++;
-                    if (invoked == 3)
-                        throw ex;
-                    return x + 1;
-                })
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  "),
+                OnCompleted<string>(570)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(210, 3),
-                OnNext(240, 4),
-                OnError<int>(290, ex)
+            res["FOO"].Messages.AssertEqual(
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 290)
+                Subscribe(200, 570)
             );
-
-            Assert.AreEqual(3, invoked);
-        }
-
-        [TestMethod]
-        public void SelectWithIndex_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).Select<int, int>(DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Select<int, int>((Func<int, int, int>)null));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Select<int, int>(DummyFunc<int, int, int>.Instance).Subscribe(null));
-        }
-
-        [TestMethod]
-        public void SelectWithIndex_Throws()
-        {
-            ReactiveAssert.Throws<InvalidOperationException>(() =>
-                Observable.Return(1).Select<int, int>((x, index) => x).Subscribe(
-                 x =>
-                 {
-                     throw new InvalidOperationException();
-                 }));
-            ReactiveAssert.Throws<InvalidOperationException>(() =>
-                Observable.Throw<int>(new Exception()).Select<int, int>((x, index) => x).Subscribe(
-                 x => { },
-                 exception =>
-                 {
-                     throw new InvalidOperationException();
-                 }));
-            ReactiveAssert.Throws<InvalidOperationException>(() =>
-                 Observable.Empty<int>().Select<int, int>((x, index) => x).Subscribe(
-                 x => { },
-                 exception => { },
-                 () =>
-                 {
-                     throw new InvalidOperationException();
-                 }));
-            ReactiveAssert.Throws<InvalidOperationException>(() => Observable.Create<int>(new Func<IObserver<int>, Action>(o => { throw new InvalidOperationException(); })).Select((x, index) => x).Subscribe());
         }
 
         [TestMethod]
-        public void SelectWithIndex_DisposeInsideSelector()
+        public void GroupByUntil_Capacity_Inner_Error()
         {
             var scheduler = new TestScheduler();
 
+            var ex1 = new Exception();
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(100, 4),
-                OnNext(200, 3),
-                OnNext(500, 2),
-                OnNext(600, 1)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnError<string>(570, ex1),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var invoked = 0;
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var res = scheduler.CreateObserver<int>();
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
 
-            var d = new SerialDisposable();
-            d.Disposable = xs.Select((x, index) =>
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
             {
-                invoked++;
-                if (scheduler.Clock > 400)
-                    d.Dispose();
-                return x + index * 10;
-            }).Subscribe(res);
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                scheduler.ScheduleRelative(100, () => innerSubscriptions[group.Key] = group.Subscribe(result));
+            }, ex => { }));
 
-            scheduler.ScheduleAbsolute(Disposed, d.Dispose);
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
             scheduler.Start();
 
-            res.Messages.AssertEqual(
-                OnNext(100, 4),
-                OnNext(200, 13)
-            );
+            Assert.AreEqual(5, inners.Count);
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(0, 500)
+            res["foo"].Messages.AssertEqual(
+                OnCompleted<string>(320)
             );
 
-            Assert.AreEqual(3, invoked);
-        }
-
-        [TestMethod]
-        public void SelectWithIndex_Completed()
-        {
-            var scheduler = new TestScheduler();
-
-            var invoked = 0;
+            res["baR"].Messages.AssertEqual(
+                OnNext(390, "rab   "),
+                OnCompleted<string>(420)
+               );
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(180, 5),
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1),
-                OnCompleted<int>(400),
-                OnNext(410, -1),
-                OnCompleted<int>(420),
-                OnError<int>(430, new Exception())
+            res["Baz"].Messages.AssertEqual(
+                OnNext(480, "  zab"),
+                OnCompleted<string>(510)
             );
 
-            var res = scheduler.Start(() =>
-                xs.Select((x, index) =>
-                {
-                    invoked++;
-                    return (x + 1) + (index * 10);
-                })
+            res["qux"].Messages.AssertEqual(
+                OnError<string>(570, ex1)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(210, 5),
-                OnNext(240, 14),
-                OnNext(290, 23),
-                OnNext(350, 32),
-                OnCompleted<int>(400)
+            res["FOO"].Messages.AssertEqual(
+                OnError<string>(570, ex1)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 400)
+                Subscribe(200, 570)
             );
-
-            Assert.AreEqual(4, invoked);
         }
 
         [TestMethod]
-        public void SelectWithIndex_NotCompleted()
+        public void GroupByUntil_Capacity_Inner_Dispose()
         {
             var scheduler = new TestScheduler();
 
-            var invoked = 0;
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(180, 5),
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1)
-            );
-
-            var res = scheduler.Start(() =>
-                xs.Select((x, index) =>
-                {
-                    invoked++;
-                    return (x + 1) + (index * 10);
-                })
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            res.Messages.AssertEqual(
-                OnNext(210, 5),
-                OnNext(240, 14),
-                OnNext(290, 23),
-                OnNext(350, 32)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 1000)
-            );
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
 
-            Assert.AreEqual(4, invoked);
-        }
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }));
 
-        [TestMethod]
-        public void SelectWithIndex_Error()
-        {
-            var scheduler = new TestScheduler();
+            scheduler.ScheduleAbsolute(400, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-            var invoked = 0;
-            var ex = new Exception();
+            scheduler.Start();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(180, 5),
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1),
-                OnError<int>(400, ex),
-                OnNext(410, -1),
-                OnCompleted<int>(420),
-                OnError<int>(430, new Exception())
+            Assert.AreEqual(4, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            var res = scheduler.Start(() =>
-                xs.Select((x, index) =>
-                {
-                    invoked++;
-                    return (x + 1) + (index * 10);
-                })
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   ")
             );
 
-            res.Messages.AssertEqual(
-                OnNext(210, 5),
-                OnNext(240, 14),
-                OnNext(290, 23),
-                OnNext(350, 32),
-                OnError<int>(400, ex)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB ")
+            );
+
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  ")
             );
 
             xs.Subscriptions.AssertEqual(
                 Subscribe(200, 400)
             );
-
-            Assert.AreEqual(4, invoked);
         }
 
         [TestMethod]
-        public void SelectWithIndex_SelectorThrows()
+        public void GroupByUntil_Capacity_Inner_KeyThrow()
         {
             var scheduler = new TestScheduler();
 
-            var invoked = 0;
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(180, 5),
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1),
-                OnCompleted<int>(400),
-                OnNext(410, -1),
-                OnCompleted<int>(420),
-                OnError<int>(430, new Exception())
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
+
+            var keyInvoked = 0;
             var ex = new Exception();
 
-            var res = scheduler.Start(() =>
-                xs.Select((x, index) =>
-                {
-                    invoked++;
-                    if (invoked == 3)
-                        throw ex;
-                    return (x + 1) + (index * 10);
-                })
-            );
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x =>
+            {
+                keyInvoked++;
+                if (keyInvoked == 6)
+                    throw ex;
+                return x.Trim();
+            }, x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
 
-            res.Messages.AssertEqual(
-                OnNext(210, 5),
-                OnNext(240, 14),
-                OnError<int>(290, ex)
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, _ => { }));
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 290)
-            );
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-            Assert.AreEqual(3, invoked);
-        }
+            scheduler.Start();
 
-        [TestMethod]
-        public void Select_Select1()
-        {
-            var scheduler = new TestScheduler();
+            Assert.AreEqual(3, inners.Count);
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(180, 5),
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1),
-                OnCompleted<int>(400)
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            var res = scheduler.Start(() =>
-                xs.Select(x => x + 1).Select(x => x - 2)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnError<string>(360, ex)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(210, 4 + 1 - 2),
-                OnNext(240, 3 + 1 - 2),
-                OnNext(290, 2 + 1 - 2),
-                OnNext(350, 1 + 1 - 2),
-                OnCompleted<int>(400)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnError<string>(360, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 400)
+                Subscribe(200, 360)
             );
         }
 
         [TestMethod]
-        public void Select_Select2()
+        public void GroupByUntil_Capacity_Inner_EleThrow()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(180, 5),
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1),
-                OnCompleted<int>(400)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var res = scheduler.Start(() =>
-                xs.Select((x, i) => x + i).Select(x => x - 2)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            res.Messages.AssertEqual(
-                OnNext(210, 4 + 0 - 2),
-                OnNext(240, 3 + 1 - 2),
-                OnNext(290, 2 + 2 - 2),
-                OnNext(350, 1 + 3 - 2),
-                OnCompleted<int>(400)
-            );
+            var eleInvoked = 0;
+            var ex = new Exception();
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 400)
-            );
-        }
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x =>
+            {
+                eleInvoked++;
+                if (eleInvoked == 6)
+                    throw ex;
+                return Reverse(x);
+            }, g => g.Skip(2), _groupByUntilCapacity, comparer));
 
-        [TestMethod]
-        public void Select_Select3()
-        {
-            var scheduler = new TestScheduler();
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, _ => { }));
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(180, 5),
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1),
-                OnCompleted<int>(400)
-            );
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-            var res = scheduler.Start(() =>
-                xs.Select(x => x + 1).Select((x, i) => x - i)
-            );
+            scheduler.Start();
 
-            res.Messages.AssertEqual(
-                OnNext(210, 4 + 1 - 0),
-                OnNext(240, 3 + 1 - 1),
-                OnNext(290, 2 + 1 - 2),
-                OnNext(350, 1 + 1 - 3),
-                OnCompleted<int>(400)
-            );
+            Assert.AreEqual(4, inners.Count);
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 400)
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
-        }
-
-        [TestMethod]
-        public void Select_Select4()
-        {
-            var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(180, 5),
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1),
-                OnCompleted<int>(400)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnError<string>(360, ex)
             );
 
-            var res = scheduler.Start(() =>
-                xs.Select((x, i) => x + i).Select((x, i) => x - i)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnError<string>(360, ex)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(210, 4),
-                OnNext(240, 3),
-                OnNext(290, 2),
-                OnNext(350, 1),
-                OnCompleted<int>(400)
+            res["qux"].Messages.AssertEqual(
+                OnError<string>(360, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 400)
+                Subscribe(200, 360)
             );
         }
 
-        #endregion
-
-        #region + SelectMany +
-
-        [TestMethod]
-        public void SelectMany_Then_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany(DummyObservable<string>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(((IObservable<string>)null)));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyObservable<string>.Instance).Subscribe(null));
-        }
-
         [TestMethod]
-        public void SelectMany_Then_Complete_Complete()
+        public void GroupByUntil_Capacity_Inner_Comparer_EqualsThrow()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateColdObservable(
-                OnNext(100, 4),
-                OnNext(200, 2),
-                OnNext(300, 3),
-                OnNext(400, 1),
-                OnCompleted<int>(500)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateColdObservable(
-                OnNext(50, "foo"),
-                OnNext(100, "bar"),
-                OnNext(150, "baz"),
-                OnNext(200, "qux"),
-                OnCompleted<string>(250)
-            );
+            var comparer = new GroupByComparer(scheduler, 400, ushort.MaxValue);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(ys)
-            );
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
 
-            res.Messages.AssertEqual(
-                OnNext(350, "foo"),
-                OnNext(400, "bar"),
-                OnNext(450, "baz"),
-                OnNext(450, "foo"),
-                OnNext(500, "qux"),
-                OnNext(500, "bar"),
-                OnNext(550, "baz"),
-                OnNext(550, "foo"),
-                OnNext(600, "qux"),
-                OnNext(600, "bar"),
-                OnNext(650, "baz"),
-                OnNext(650, "foo"),
-                OnNext(700, "qux"),
-                OnNext(700, "bar"),
-                OnNext(750, "baz"),
-                OnNext(800, "qux"),
-                OnCompleted<string>(850)
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, _ => { }));
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 700)
-            );
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(300, 550),
-                Subscribe(400, 650),
-                Subscribe(500, 750),
-                Subscribe(600, 850)
-            );
-        }
+            scheduler.Start();
 
-        [TestMethod]
-        public void SelectMany_Then_Complete_Complete_2()
-        {
-            var scheduler = new TestScheduler();
+            Assert.AreEqual(4, inners.Count);
 
-            var xs = scheduler.CreateColdObservable(
-                OnNext(100, 4),
-                OnNext(200, 2),
-                OnNext(300, 3),
-                OnNext(400, 1),
-                OnCompleted<int>(700)
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            var ys = scheduler.CreateColdObservable(
-                OnNext(50, "foo"),
-                OnNext(100, "bar"),
-                OnNext(150, "baz"),
-                OnNext(200, "qux"),
-                OnCompleted<string>(250)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnError<string>(420, comparer.EqualsException)
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(ys)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnError<string>(420, comparer.EqualsException)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(350, "foo"),
-                OnNext(400, "bar"),
-                OnNext(450, "baz"),
-                OnNext(450, "foo"),
-                OnNext(500, "qux"),
-                OnNext(500, "bar"),
-                OnNext(550, "baz"),
-                OnNext(550, "foo"),
-                OnNext(600, "qux"),
-                OnNext(600, "bar"),
-                OnNext(650, "baz"),
-                OnNext(650, "foo"),
-                OnNext(700, "qux"),
-                OnNext(700, "bar"),
-                OnNext(750, "baz"),
-                OnNext(800, "qux"),
-                OnCompleted<string>(900)
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  "),
+                OnError<string>(420, comparer.EqualsException)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900)
-            );
-
-            ys.Subscriptions.AssertEqual(
-                Subscribe(300, 550),
-                Subscribe(400, 650),
-                Subscribe(500, 750),
-                Subscribe(600, 850)
+                Subscribe(200, 420)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Then_Never_Complete()
+        public void GroupByUntil_Capacity_Inner_Comparer_GetHashCodeThrow()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateColdObservable(
-                OnNext(100, 4),
-                OnNext(200, 2),
-                OnNext(300, 3),
-                OnNext(400, 1),
-                OnNext(500, 5),
-                OnNext(700, 0)
-            );
-
-            var ys = scheduler.CreateColdObservable(
-                OnNext(50, "foo"),
-                OnNext(100, "bar"),
-                OnNext(150, "baz"),
-                OnNext(200, "qux"),
-                OnCompleted<string>(250)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(ys)
-            );
+            var comparer = new GroupByComparer(scheduler, ushort.MaxValue, 400);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
 
-            res.Messages.AssertEqual(
-                OnNext(350, "foo"),
-                OnNext(400, "bar"),
-                OnNext(450, "baz"),
-                OnNext(450, "foo"),
-                OnNext(500, "qux"),
-                OnNext(500, "bar"),
-                OnNext(550, "baz"),
-                OnNext(550, "foo"),
-                OnNext(600, "qux"),
-                OnNext(600, "bar"),
-                OnNext(650, "baz"),
-                OnNext(650, "foo"),
-                OnNext(700, "qux"),
-                OnNext(700, "bar"),
-                OnNext(750, "baz"),
-                OnNext(750, "foo"),
-                OnNext(800, "qux"),
-                OnNext(800, "bar"),
-                OnNext(850, "baz"),
-                OnNext(900, "qux"),
-                OnNext(950, "foo")
-            );
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 1000)
-            );
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, _ => { }));
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(300, 550),
-                Subscribe(400, 650),
-                Subscribe(500, 750),
-                Subscribe(600, 850),
-                Subscribe(700, 950),
-                Subscribe(900, 1000)
-            );
-        }
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
 
-        [TestMethod]
-        public void SelectMany_Then_Complete_Never()
-        {
-            var scheduler = new TestScheduler();
+            scheduler.Start();
 
-            var xs = scheduler.CreateColdObservable(
-                OnNext(100, 4),
-                OnNext(200, 2),
-                OnNext(300, 3),
-                OnNext(400, 1),
-                OnCompleted<int>(500)
-            );
+            Assert.AreEqual(4, inners.Count);
 
-            var ys = scheduler.CreateColdObservable(
-                OnNext(50, "foo"),
-                OnNext(100, "bar"),
-                OnNext(150, "baz"),
-                OnNext(200, "qux")
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(ys)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnError<string>(420, comparer.HashCodeException)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(350, "foo"),
-                OnNext(400, "bar"),
-                OnNext(450, "baz"),
-                OnNext(450, "foo"),
-                OnNext(500, "qux"),
-                OnNext(500, "bar"),
-                OnNext(550, "baz"),
-                OnNext(550, "foo"),
-                OnNext(600, "qux"),
-                OnNext(600, "bar"),
-                OnNext(650, "baz"),
-                OnNext(650, "foo"),
-                OnNext(700, "qux"),
-                OnNext(700, "bar"),
-                OnNext(750, "baz"),
-                OnNext(800, "qux")
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnError<string>(420, comparer.HashCodeException)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 700)
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  "),
+                OnError<string>(420, comparer.HashCodeException)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(300, 1000),
-                Subscribe(400, 1000),
-                Subscribe(500, 1000),
-                Subscribe(600, 1000)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Then_Complete_Error()
+        public void GroupByUntil_Capacity_Outer_Independence()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
-            var xs = scheduler.CreateColdObservable(
-                OnNext(100, 4),
-                OnNext(200, 2),
-                OnNext(300, 3),
-                OnNext(400, 1),
-                OnCompleted<int>(500)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var ys = scheduler.CreateColdObservable(
-                OnNext(50, "foo"),
-                OnNext(100, "bar"),
-                OnNext(150, "baz"),
-                OnNext(200, "qux"),
-                OnError<string>(300, ex)
-            );
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
+            var outerResults = scheduler.CreateObserver<string>();
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(ys)
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
+
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                outerResults.OnNext(group.Key);
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, outerResults.OnError, outerResults.OnCompleted));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.ScheduleAbsolute(320, () => outerSubscription.Dispose());
+
+            scheduler.Start();
+
+            Assert.AreEqual(2, inners.Count);
+
+            outerResults.Messages.AssertEqual(
+                OnNext(220, "foo"),
+                OnNext(270, "baR")
             );
 
-            res.Messages.AssertEqual(
-                OnNext(350, "foo"),
-                OnNext(400, "bar"),
-                OnNext(450, "baz"),
-                OnNext(450, "foo"),
-                OnNext(500, "qux"),
-                OnNext(500, "bar"),
-                OnNext(550, "baz"),
-                OnNext(550, "foo"),
-                OnError<string>(600, ex)
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 600)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnNext(420, "  RAB "),
+                OnCompleted<string>(420)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(300, 600),
-                Subscribe(400, 600),
-                Subscribe(500, 600),
-                Subscribe(600, 600)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Then_Error_Complete()
+        public void GroupByUntil_Capacity_Inner_Independence()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
-            var xs = scheduler.CreateColdObservable(
-                OnNext(100, 4),
-                OnNext(200, 2),
-                OnNext(300, 3),
-                OnNext(400, 1),
-                OnError<int>(500, ex)
-            );
-
-            var ys = scheduler.CreateColdObservable(
-                OnNext(50, "foo"),
-                OnNext(100, "bar"),
-                OnNext(150, "baz"),
-                OnNext(200, "qux"),
-                OnCompleted<string>(250)
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(ys)
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
+            var outerResults = scheduler.CreateObserver<string>();
+
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
+
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                outerResults.OnNext(group.Key);
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, outerResults.OnError, outerResults.OnCompleted));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.ScheduleAbsolute(320, () => innerSubscriptions["foo"].Dispose());
+
+            scheduler.Start();
+
+            Assert.AreEqual(5, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(350, "foo"),
-                OnNext(400, "bar"),
-                OnNext(450, "baz"),
-                OnNext(450, "foo"),
-                OnNext(500, "qux"),
-                OnNext(500, "bar"),
-                OnNext(550, "baz"),
-                OnNext(550, "foo"),
-                OnNext(600, "qux"),
-                OnNext(600, "bar"),
-                OnNext(650, "baz"),
-                OnNext(650, "foo"),
-                OnError<string>(700, ex)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab"),
+                OnNext(390, "rab   "),
+                OnNext(420, "  RAB "),
+                OnCompleted<string>(420)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 700)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB "),
+                OnNext(480, "  zab"),
+                OnNext(510, " ZAb "),
+                OnCompleted<string>(510)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(300, 550),
-                Subscribe(400, 650),
-                Subscribe(500, 700),
-                Subscribe(600, 700)
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  "),
+                OnCompleted<string>(570)
+            );
+
+            res["FOO"].Messages.AssertEqual(
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Then_Error_Error()
+        public void GroupByUntil_Capacity_Inner_Multiple_Independence()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
+            var xs = scheduler.CreateHotObservable(
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
+            );
 
-            var xs = scheduler.CreateColdObservable(
-                OnNext(100, 4),
-                OnNext(200, 2),
-                OnNext(300, 3),
-                OnNext(400, 1),
-                OnError<int>(500, new Exception())
+            var comparer = new GroupByComparer(scheduler);
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inners = new Dictionary<string, IObservable<string>>();
+            var innerSubscriptions = new Dictionary<string, IDisposable>();
+            var res = new Dictionary<string, ITestableObserver<string>>();
+            var outerResults = scheduler.CreateObserver<string>();
+
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), x => Reverse(x), g => g.Skip(2), _groupByUntilCapacity, comparer));
+
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                outerResults.OnNext(group.Key);
+                var result = scheduler.CreateObserver<string>();
+                inners[group.Key] = group;
+                res[group.Key] = result;
+                innerSubscriptions[group.Key] = group.Subscribe(result);
+            }, outerResults.OnError, outerResults.OnCompleted));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                foreach (var d in innerSubscriptions.Values)
+                    d.Dispose();
+            });
+
+            scheduler.ScheduleAbsolute(320, () => innerSubscriptions["foo"].Dispose());
+            scheduler.ScheduleAbsolute(280, () => innerSubscriptions["baR"].Dispose());
+            scheduler.ScheduleAbsolute(355, () => innerSubscriptions["Baz"].Dispose());
+            scheduler.ScheduleAbsolute(400, () => innerSubscriptions["qux"].Dispose());
+
+            scheduler.Start();
+
+            Assert.AreEqual(5, inners.Count);
+
+            res["foo"].Messages.AssertEqual(
+                OnNext(220, "oof  "),
+                OnNext(240, " OoF "),
+                OnNext(310, " Oof"),
+                OnCompleted<string>(310)
             );
 
-            var ys = scheduler.CreateColdObservable(
-                OnNext(50, "foo"),
-                OnNext(100, "bar"),
-                OnNext(150, "baz"),
-                OnNext(200, "qux"),
-                OnError<string>(250, ex)
+            res["baR"].Messages.AssertEqual(
+                OnNext(270, "  Rab")
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(ys)
+            res["Baz"].Messages.AssertEqual(
+                OnNext(350, "   zaB ")
             );
 
-            res.Messages.AssertEqual(
-                OnNext(350, "foo"),
-                OnNext(400, "bar"),
-                OnNext(450, "baz"),
-                OnNext(450, "foo"),
-                OnNext(500, "qux"),
-                OnNext(500, "bar"),
-                OnError<string>(550, ex)
+            res["qux"].Messages.AssertEqual(
+                OnNext(360, " xuq  ")
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 550)
+            res["FOO"].Messages.AssertEqual(
+                OnNext(470, " OOF"),
+                OnNext(530, "    oOf    "),
+                OnCompleted<string>(570)
             );
 
-            ys.Subscriptions.AssertEqual(
-                Subscribe(300, 550),
-                Subscribe(400, 550),
-                Subscribe(500, 550)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
             );
         }
 
         [TestMethod]
-        public void SelectMany_ArgumentChecking()
+        public void GroupByUntil_Capacity_Inner_Escape_Complete()
         {
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, IObservable<int>>)null));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IObservable<int>>.Instance).Subscribe(null));
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(310, "foO "),
+                OnNext(470, "FOO "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570)
+            );
+
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inner = default(IObservable<string>);
+            var innerSubscription = default(IDisposable);
+            var res = scheduler.CreateObserver<string>();
+
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2), _groupByUntilCapacity));
+
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                inner = group;
+            }));
+
+            scheduler.ScheduleAbsolute(600, () => innerSubscription = inner.Subscribe(res));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                innerSubscription.Dispose();
+            });
+
+            scheduler.Start();
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
+            );
+
+            res.Messages.AssertEqual(
+                OnCompleted<string>(600)
+            );
         }
 
         [TestMethod]
-        public void SelectMany_Complete()
+        public void GroupByUntil_Capacity_Inner_Escape_Error()
         {
             var scheduler = new TestScheduler();
 
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
-                    OnNext(5, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(105, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(300, scheduler.CreateColdObservable(
-                        OnNext(10, 102),
-                        OnNext(90, 103),
-                        OnNext(110, 104),
-                        OnNext(190, 105),
-                        OnNext(440, 106),
-                        OnCompleted<int>(460))),
-                    OnNext(400, scheduler.CreateColdObservable(
-                        OnNext(180, 202),
-                        OnNext(190, 203),
-                        OnCompleted<int>(205))),
-                    OnNext(550, scheduler.CreateColdObservable(
-                        OnNext(10, 301),
-                        OnNext(50, 302),
-                        OnNext(70, 303),
-                        OnNext(260, 304),
-                        OnNext(310, 305),
-                        OnCompleted<int>(410))),
-                    OnNext(750, scheduler.CreateColdObservable(
-                        OnCompleted<int>(40))),
-                    OnNext(850, scheduler.CreateColdObservable(
-                        OnNext(80, 401),
-                        OnNext(90, 402),
-                        OnCompleted<int>(100))),
-                    OnCompleted<ITestableObservable<int>>(900)
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(310, "foO "),
+                OnNext(470, "FOO "),
+                OnNext(530, "    fOo    "),
+                OnError<string>(570, ex)
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x => x)
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inner = default(IObservable<string>);
+            var innerSubscription = default(IDisposable);
+            var res = scheduler.CreateObserver<string>();
+
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2), _groupByUntilCapacity));
+
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                inner = group;
+            }, _ => { }));
+
+            scheduler.ScheduleAbsolute(600, () => innerSubscription = inner.Subscribe(res));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                outerSubscription.Dispose();
+                innerSubscription.Dispose();
+            });
+
+            scheduler.Start();
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 570)
             );
 
             res.Messages.AssertEqual(
-                OnNext(310, 102),
-                OnNext(390, 103),
-                OnNext(410, 104),
-                OnNext(490, 105),
-                OnNext(560, 301),
-                OnNext(580, 202),
-                OnNext(590, 203),
-                OnNext(600, 302),
-                OnNext(620, 303),
-                OnNext(740, 106),
-                OnNext(810, 304),
-                OnNext(860, 305),
-                OnNext(930, 401),
-                OnNext(940, 402),
-                OnCompleted<int>(960)
+                OnError<string>(600, ex)
             );
+        }
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900));
+        [TestMethod]
+        public void GroupByUntil_Capacity_Inner_Escape_Dispose()
+        {
+            var scheduler = new TestScheduler();
 
-            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(300, 760));
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(310, "foO "),
+                OnNext(470, "FOO "),
+                OnNext(530, "    fOo    "),
+                OnError<string>(570, new Exception())
+            );
 
-            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(400, 605));
+            var outer = default(IObservable<IGroupedObservable<string, string>>);
+            var outerSubscription = default(IDisposable);
+            var inner = default(IObservable<string>);
+            var innerSubscription = default(IDisposable);
+            var res = scheduler.CreateObserver<string>();
 
-            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(550, 960));
+            scheduler.ScheduleAbsolute(Created, () => outer = xs.GroupByUntil(x => x.Trim(), g => g.Skip(2), _groupByUntilCapacity));
 
-            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(750, 790));
+            scheduler.ScheduleAbsolute(Subscribed, () => outerSubscription = outer.Subscribe(group =>
+            {
+                inner = group;
+            }));
 
-            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(850, 950));
+            scheduler.ScheduleAbsolute(290, () => outerSubscription.Dispose());
+
+            scheduler.ScheduleAbsolute(600, () => innerSubscription = inner.Subscribe(res));
+
+            scheduler.ScheduleAbsolute(Disposed, () =>
+            {
+                innerSubscription.Dispose();
+            });
+
+            scheduler.Start();
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+
+            res.Messages.AssertEqual(
+            );
         }
 
         [TestMethod]
-        public void SelectMany_Complete_InnerNotComplete()
+        public void GroupByUntil_Capacity_Default()
         {
             var scheduler = new TestScheduler();
 
+            var keyInvoked = 0;
+            var eleInvoked = 0;
+
             var xs = scheduler.CreateHotObservable(
-                    OnNext(5, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(105, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(300, scheduler.CreateColdObservable(
-                        OnNext(10, 102),
-                        OnNext(90, 103),
-                        OnNext(110, 104),
-                        OnNext(190, 105),
-                        OnNext(440, 106),
-                        OnCompleted<int>(460))),
-                    OnNext(400, scheduler.CreateColdObservable(
-                        OnNext(180, 202),
-                        OnNext(190, 203))),
-                    OnNext(550, scheduler.CreateColdObservable(
-                        OnNext(10, 301),
-                        OnNext(50, 302),
-                        OnNext(70, 303),
-                        OnNext(260, 304),
-                        OnNext(310, 305),
-                        OnCompleted<int>(410))),
-                    OnNext(750, scheduler.CreateColdObservable(
-                        OnCompleted<int>(40))),
-                    OnNext(850, scheduler.CreateColdObservable(
-                        OnNext(80, 401),
-                        OnNext(90, 402),
-                        OnCompleted<int>(100))),
-                    OnCompleted<ITestableObservable<int>>(900)
+                OnNext(90, "error"),
+                OnNext(110, "error"),
+                OnNext(130, "error"),
+                OnNext(220, "  foo"),
+                OnNext(240, " FoO "),
+                OnNext(270, "baR  "),
+                OnNext(310, "foO "),
+                OnNext(350, " Baz   "),
+                OnNext(360, "  qux "),
+                OnNext(390, "   bar"),
+                OnNext(420, " BAR  "),
+                OnNext(470, "FOO "),
+                OnNext(480, "baz  "),
+                OnNext(510, " bAZ "),
+                OnNext(530, "    fOo    "),
+                OnCompleted<string>(570),
+                OnNext(580, "error"),
+                OnCompleted<string>(600),
+                OnError<string>(650, new Exception())
             );
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => x)
+                xs.GroupByUntil(
+                    x =>
+                    {
+                        keyInvoked++;
+                        return x.Trim().ToLower();
+                    },
+                    x =>
+                    {
+                        eleInvoked++;
+                        return Reverse(x);
+                    },
+                    g => g.Skip(2),
+                    _groupByUntilCapacity
+                ).Select(g => g.Key)
             );
 
             res.Messages.AssertEqual(
-                OnNext(310, 102),
-                OnNext(390, 103),
-                OnNext(410, 104),
-                OnNext(490, 105),
-                OnNext(560, 301),
-                OnNext(580, 202),
-                OnNext(590, 203),
-                OnNext(600, 302),
-                OnNext(620, 303),
-                OnNext(740, 106),
-                OnNext(810, 304),
-                OnNext(860, 305),
-                OnNext(930, 401),
-                OnNext(940, 402)
+                OnNext(220, "foo"),
+                OnNext(270, "bar"),
+                OnNext(350, "baz"),
+                OnNext(360, "qux"),
+                OnNext(470, "foo"),
+                OnCompleted<string>(570)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900));
+                Subscribe(200, 570)
+            );
 
-            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(300, 760));
+            Assert.AreEqual(12, keyInvoked);
+            Assert.AreEqual(12, eleInvoked);
+        }
 
-            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(400, 1000));
+        [TestMethod]
+        public void GroupByUntil_Capacity_DurationSelector_Throws()
+        {
+            var scheduler = new TestScheduler();
 
-            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(550, 960));
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, "foo")
+            );
 
-            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(750, 790));
+            var ex = new Exception();
 
-            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(850, 950));
+            var res = scheduler.Start(() =>
+                xs.GroupByUntil<string, string, string>(x => x, g => { throw ex; }, _groupByUntilCapacity)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<IGroupedObservable<string, string>>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
         }
 
         [TestMethod]
-        public void SelectMany_Complete_OuterNotComplete()
+        public void GroupByUntil_Capacity_NullKeys_Simple_Never()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                    OnNext(5, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(105, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(300, scheduler.CreateColdObservable(
-                        OnNext(10, 102),
-                        OnNext(90, 103),
-                        OnNext(110, 104),
-                        OnNext(190, 105),
-                        OnNext(440, 106),
-                        OnCompleted<int>(460))),
-                    OnNext(400, scheduler.CreateColdObservable(
-                        OnNext(180, 202),
-                        OnNext(190, 203),
-                        OnCompleted<int>(205))),
-                    OnNext(550, scheduler.CreateColdObservable(
-                        OnNext(10, 301),
-                        OnNext(50, 302),
-                        OnNext(70, 303),
-                        OnNext(260, 304),
-                        OnNext(310, 305),
-                        OnCompleted<int>(410))),
-                    OnNext(750, scheduler.CreateColdObservable(
-                        OnCompleted<int>(40))),
-                    OnNext(850, scheduler.CreateColdObservable(
-                        OnNext(80, 401),
-                        OnNext(90, 402),
-                        OnCompleted<int>(100)))
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnCompleted<string>(500)
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x => x)
-            );
+            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => Observable.Never<Unit>(), _groupByUntilCapacity).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
 
             res.Messages.AssertEqual(
-                OnNext(310, 102),
-                OnNext(390, 103),
-                OnNext(410, 104),
-                OnNext(490, 105),
-                OnNext(560, 301),
-                OnNext(580, 202),
-                OnNext(590, 203),
-                OnNext(600, 302),
-                OnNext(620, 303),
-                OnNext(740, 106),
-                OnNext(810, 304),
-                OnNext(860, 305),
-                OnNext(930, 401),
-                OnNext(940, 402)
+                OnNext(220, "(null)bar"),
+                OnNext(240, "FOOfoo"),
+                OnNext(310, "QUXqux"),
+                OnNext(470, "(null)baz"),
+                OnCompleted<string>(500)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 1000));
-
-            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(300, 760));
-
-            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(400, 605));
-
-            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(550, 960));
-
-            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(750, 790));
-
-            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(850, 950));
+                Subscribe(200, 500)
+            );
         }
 
         [TestMethod]
-        public void SelectMany_Error_Outer()
+        public void GroupByUntil_Capacity_NullKeys_Simple_Expire1()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
             var xs = scheduler.CreateHotObservable(
-                    OnNext(5, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(105, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(300, scheduler.CreateColdObservable(
-                        OnNext(10, 102),
-                        OnNext(90, 103),
-                        OnNext(110, 104),
-                        OnNext(190, 105),
-                        OnNext(440, 106),
-                        OnCompleted<int>(460))),
-                    OnNext(400, scheduler.CreateColdObservable(
-                        OnNext(180, 202),
-                        OnNext(190, 203),
-                        OnCompleted<int>(205))),
-                    OnNext(550, scheduler.CreateColdObservable(
-                        OnNext(10, 301),
-                        OnNext(50, 302),
-                        OnNext(70, 303),
-                        OnNext(260, 304),
-                        OnNext(310, 305),
-                        OnCompleted<int>(410))),
-                    OnNext(750, scheduler.CreateColdObservable(
-                        OnCompleted<int>(40))),
-                    OnNext(850, scheduler.CreateColdObservable(
-                        OnNext(80, 401),
-                        OnNext(90, 402),
-                        OnCompleted<int>(100))),
-                    OnError<ITestableObservable<int>>(900, ex)
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnCompleted<string>(500)
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x => x)
-            );
+            var n = 0;
+            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => { if (g.Key == null) n++; return Observable.Timer(TimeSpan.FromTicks(50), scheduler); }, _groupByUntilCapacity).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
+
+            Assert.AreEqual(2, n);
 
             res.Messages.AssertEqual(
-                OnNext(310, 102),
-                OnNext(390, 103),
-                OnNext(410, 104),
-                OnNext(490, 105),
-                OnNext(560, 301),
-                OnNext(580, 202),
-                OnNext(590, 203),
-                OnNext(600, 302),
-                OnNext(620, 303),
-                OnNext(740, 106),
-                OnNext(810, 304),
-                OnNext(860, 305),
-                OnError<int>(900, ex)
+                OnNext(220, "(null)bar"),
+                OnNext(240, "FOOfoo"),
+                OnNext(310, "QUXqux"),
+                OnNext(470, "(null)baz"),
+                OnCompleted<string>(500)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 900));
+                Subscribe(200, 500)
+            );
+        }
 
-            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(300, 760));
+        [TestMethod]
+        public void GroupByUntil_Capacity_NullKeys_Simple_Expire2()
+        {
+            var scheduler = new TestScheduler();
 
-            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(400, 605));
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnCompleted<string>(500)
+            );
 
-            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(550, 900));
+            var n = 0;
+            var res = scheduler.Start(() => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => { if (g.Key == null) n++; return Observable.Timer(TimeSpan.FromTicks(50), scheduler).IgnoreElements(); }, _groupByUntilCapacity).SelectMany(g => g, (g, x) => (g.Key ?? "(null)") + x));
 
-            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(750, 790));
+            Assert.AreEqual(2, n);
 
-            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(850, 900));
+            res.Messages.AssertEqual(
+                OnNext(220, "(null)bar"),
+                OnNext(240, "FOOfoo"),
+                OnNext(310, "QUXqux"),
+                OnNext(470, "(null)baz"),
+                OnCompleted<string>(500)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 500)
+            );
         }
 
         [TestMethod]
-        public void SelectMany_Error_Inner()
+        public void GroupByUntil_Capacity_NullKeys_Error()
         {
             var scheduler = new TestScheduler();
 
             var ex = new Exception();
 
             var xs = scheduler.CreateHotObservable(
-                    OnNext(5, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(105, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(300, scheduler.CreateColdObservable(
-                        OnNext(10, 102),
-                        OnNext(90, 103),
-                        OnNext(110, 104),
-                        OnNext(190, 105),
-                        OnNext(440, 106),
-                        OnError<int>(460, ex))),
-                    OnNext(400, scheduler.CreateColdObservable(
-                        OnNext(180, 202),
-                        OnNext(190, 203),
-                        OnCompleted<int>(205))),
-                    OnNext(550, scheduler.CreateColdObservable(
-                        OnNext(10, 301),
-                        OnNext(50, 302),
-                        OnNext(70, 303),
-                        OnNext(260, 304),
-                        OnNext(310, 305),
-                        OnCompleted<int>(410))),
-                    OnNext(750, scheduler.CreateColdObservable(
-                        OnCompleted<int>(40))),
-                    OnNext(850, scheduler.CreateColdObservable(
-                        OnNext(80, 401),
-                        OnNext(90, 402),
-                        OnCompleted<int>(100))),
-                    OnCompleted<ITestableObservable<int>>(900)
+                OnNext(220, "bar"),
+                OnNext(240, "foo"),
+                OnNext(310, "qux"),
+                OnNext(470, "baz"),
+                OnError<string>(500, ex)
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x => x)
-            );
+            var nullGroup = scheduler.CreateObserver<string>();
+            var err = default(Exception);
 
-            res.Messages.AssertEqual(
-                OnNext(310, 102),
-                OnNext(390, 103),
-                OnNext(410, 104),
-                OnNext(490, 105),
-                OnNext(560, 301),
-                OnNext(580, 202),
-                OnNext(590, 203),
-                OnNext(600, 302),
-                OnNext(620, 303),
-                OnNext(740, 106),
-                OnError<int>(760, ex)
-            );
+            scheduler.ScheduleAbsolute(200, () => xs.GroupByUntil(x => x[0] == 'b' ? null : x.ToUpper(), g => Observable.Never<Unit>(), _groupByUntilCapacity).Where(g => g.Key == null).Subscribe(g => g.Subscribe(nullGroup), ex_ => err = ex_));
+            scheduler.Start();
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 760));
+            Assert.AreSame(ex, err);
 
-            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(300, 760));
+            nullGroup.Messages.AssertEqual(
+                OnNext(220, "bar"),
+                OnNext(470, "baz"),
+                OnError<string>(500, ex)
+            );
 
-            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(400, 605));
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 500)
+            );
+        }
 
-            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(550, 760));
+        #endregion
 
-            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(750, 760));
+        #region + GroupJoin +
 
-            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
-            );
+        [TestMethod]
+        public void GroupJoinOp_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(null, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, null, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, DummyObservable<int>.Instance, default(Func<int, IObservable<int>>), DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, default(Func<int, IObservable<int>>), DummyFunc<int, IObservable<int>, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, default(Func<int, IObservable<int>, int>)));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.GroupJoin(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>, int>.Instance).Subscribe(null));
         }
 
         [TestMethod]
-        public void SelectMany_Dispose()
+        public void GroupJoinOp_Normal_I()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                    OnNext(5, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(105, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(300, scheduler.CreateColdObservable(
-                        OnNext(10, 102),
-                        OnNext(90, 103),
-                        OnNext(110, 104),
-                        OnNext(190, 105),
-                        OnNext(440, 106),
-                        OnCompleted<int>(460))),
-                    OnNext(400, scheduler.CreateColdObservable(
-                        OnNext(180, 202),
-                        OnNext(190, 203),
-                        OnCompleted<int>(205))),
-                    OnNext(550, scheduler.CreateColdObservable(
-                        OnNext(10, 301),
-                        OnNext(50, 302),
-                        OnNext(70, 303),
-                        OnNext(260, 304),
-                        OnNext(310, 305),
-                        OnCompleted<int>(410))),
-                    OnNext(750, scheduler.CreateColdObservable(
-                        OnCompleted<int>(40))),
-                    OnNext(850, scheduler.CreateColdObservable(
-                        OnNext(80, 401),
-                        OnNext(90, 402),
-                        OnCompleted<int>(100))),
-                    OnCompleted<ITestableObservable<int>>(900)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(280))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
+            );
+
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => x),
-                700
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(310, 102),
-                OnNext(390, 103),
-                OnNext(410, 104),
-                OnNext(490, 105),
-                OnNext(560, 301),
-                OnNext(580, 202),
-                OnNext(590, 203),
-                OnNext(600, 302),
-                OnNext(620, 303)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnNext(830, "9rat"),
+                OnCompleted<string>(990)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 700));
-
-            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(300, 700));
-
-            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(400, 605));
-
-            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(550, 700));
+            AssertDurations(xs, xsd, 990);
+            AssertDurations(ys, ysd, 990);
 
-            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
+            );
+#else
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 990)
             );
+#endif
 
-            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 800)
+            );
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 990)
             );
+#endif
         }
 
         [TestMethod]
-        public void SelectMany_Throw()
+        public void GroupJoinOp_Normal_II()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                    OnNext(5, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(105, scheduler.CreateColdObservable(
-                        OnError<int>(1, new InvalidOperationException()))),
-                    OnNext(300, scheduler.CreateColdObservable(
-                        OnNext(10, 102),
-                        OnNext(90, 103),
-                        OnNext(110, 104),
-                        OnNext(190, 105),
-                        OnNext(440, 106),
-                        OnCompleted<int>(460))),
-                    OnNext(400, scheduler.CreateColdObservable(
-                        OnNext(180, 202),
-                        OnNext(190, 203),
-                        OnCompleted<int>(205))),
-                    OnNext(550, scheduler.CreateColdObservable(
-                        OnNext(10, 301),
-                        OnNext(50, 302),
-                        OnNext(70, 303),
-                        OnNext(260, 304),
-                        OnNext(310, 305),
-                        OnCompleted<int>(410))),
-                    OnNext(750, scheduler.CreateColdObservable(
-                        OnCompleted<int>(40))),
-                    OnNext(850, scheduler.CreateColdObservable(
-                        OnNext(80, 401),
-                        OnNext(90, 402),
-                        OnCompleted<int>(100))),
-                    OnCompleted<ITestableObservable<int>>(900)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnCompleted<TimeInterval<int>>(721)
             );
 
-            var invoked = 0;
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(990)
+            );
 
-            var ex = new Exception();
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(x =>
-                {
-                    invoked++;
-                    if (invoked == 3)
-                        throw ex;
-                    return x;
-                })
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(310, 102),
-                OnNext(390, 103),
-                OnNext(410, 104),
-                OnNext(490, 105),
-                OnError<int>(550, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnCompleted<string>(910)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 550));
-
-            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(300, 550));
-
-            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
-                Subscribe(400, 550));
+            AssertDurations(xs, xsd, 910);
+            AssertDurations(ys, ysd, 910);
 
-            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 721)
             );
-
-            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+#else
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 910)
             );
+#endif
 
-            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 910)
             );
-
-            Assert.AreEqual(3, invoked);
         }
 
         [TestMethod]
-        public void SelectMany_UseFunction()
+        public void GroupJoinOp_Normal_III()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 4),
-                OnNext(220, 3),
-                OnNext(250, 5),
-                OnNext(270, 1),
-                OnCompleted<int>(290)
-            );
-
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x => Observable.Interval(TimeSpan.FromTicks(10), scheduler).Select(_ => x).Take(x))
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(280))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(220, 4),
-                OnNext(230, 3),
-                OnNext(230, 4),
-                OnNext(240, 3),
-                OnNext(240, 4),
-                OnNext(250, 3),
-                OnNext(250, 4),
-                OnNext(260, 5),
-                OnNext(270, 5),
-                OnNext(280, 1),
-                OnNext(280, 5),
-                OnNext(290, 5),
-                OnNext(300, 5),
-                OnCompleted<int>(300)
-            );
-
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 290)
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
-        }
-
-        [TestMethod]
-        // Tests this overload:
-        // IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> selector);
-        public void SelectMany_WithIndex_Complete()
-        {
-            var scheduler = new TestScheduler();
 
-            ITestableObservable<char> cs = scheduler.CreateHotObservable(
-                 OnNext(190, 'h'),   // Test scheduler starts pushing events at time 200, so this is ignored.
-                 OnNext(250, 'a'),
-                 OnNext(270, 'l'),
-                 OnNext(310, 'o'),
-                 OnCompleted<char>(410)
-                 );
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                cs.SelectMany(
-                    (x, i) => Observable.Return(new { x, i }, scheduler)
-                ));
-
-            res.Messages.AssertEqual(
-                OnNext(251, new { x = 'a', i = 0 }),
-                OnNext(271, new { x = 'l', i = 1 }),
-                OnNext(311, new { x = 'o', i = 2 }),
-                OnCompleted(new { x = default(char), i = default(int) }, 410)
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler).Where(_ => false), y => NewTimer(ysd, y.Interval, scheduler).Where(_ => false), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
-            cs.Subscriptions.AssertEqual(
-                Subscribe(200, 410));
-        }
-
-        [TestMethod]
-        // Tests this overload:
-        // IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector);
-        public void SelectMany_WithIndex_IEnumerable_Complete()
-        {
-            var scheduler = new TestScheduler();
-
-            ITestableObservable<char> cs = scheduler.CreateHotObservable(
-                 OnNext(190, 'h'),   // Test scheduler starts pushing events at time 200, so this is ignored.
-                 OnNext(250, 'a'),
-                 OnNext(270, 'l'),
-                 OnNext(310, 'o'),
-                 OnCompleted<char>(410)
-                 );
-
-            var res = scheduler.Start(() =>
-                cs.SelectMany(
-                    (c, i) => new [] { new { c = c, i = i } }
-                ));
-
-            
             res.Messages.AssertEqual(
-                OnNext(250, new { c = 'a', i = 0 }),
-                OnNext(270, new { c = 'l', i = 1 }),
-                OnNext(310, new { c = 'o', i = 2 }),
-                OnCompleted(new { c = default(char), i = default(int) }, 410)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnNext(830, "9rat"),
+                OnCompleted<string>(990)
             );
 
-            cs.Subscriptions.AssertEqual(
-                Subscribe(200, 410));
-        }
-
-
-        [TestMethod]
-        // Tests this overload:
-        // IObservable<TResult> SelectMany<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TCollection>> collectionSelector, Func<TSource, TCollection, int, TResult> resultSelector);
-        public void SelectMany_WithIndex_IObservable_ResultSelector_Complete()
-        {
-            var scheduler = new TestScheduler();
-
-            ITestableObservable<ITestableObservable<char>> css = scheduler.CreateHotObservable(
-                 OnNext(190, scheduler.CreateColdObservable(
-                        OnNext(1, 'h'),
-                        OnCompleted<char>(2))),
-                 OnNext(250, scheduler.CreateColdObservable(
-                        OnNext(1, 'a'),
-                        OnCompleted<char>(2))),
-                 OnNext(270, scheduler.CreateColdObservable(
-                        OnNext(1, 'l'),
-                        OnCompleted<char>(2))),
-                 OnNext(310, scheduler.CreateColdObservable(
-                        OnNext(1, 'o'),
-                        OnNext(2, ' '),
-                        OnNext(3, 'r'),
-                        OnNext(4, 'u'),
-                        OnNext(5, 'l'),
-                        OnNext(6, 'e'),
-                        OnNext(7, 'z'),
-                        OnCompleted<char>(8))),
-                 OnCompleted<ITestableObservable<char>>(410)
-                 );
-
-            var res = scheduler.Start(() =>
-                css.SelectMany(
-                    (foo, i) =>
-                    {
-                        return foo.Select(c => new { c = c, i = i });
-                    },
-                    (source, i, cs, j) => new { c = cs.c, i = cs.i, i2 = i, j = j }
-                ));
+            AssertDurations(xs, xsd, 990);
+            AssertDurations(ys, ysd, 990);
 
-            res.Messages.AssertEqual(
-                OnNext(251, new { c = 'a', i = 0, i2 = 0, j = 0 }),
-                OnNext(271, new { c = 'l', i = 1, i2 = 1, j = 0 }),
-                OnNext(311, new { c = 'o', i = 2, i2 = 2, j = 0 }),
-                OnNext(312, new { c = ' ', i = 2, i2 = 2, j = 1 }),
-                OnNext(313, new { c = 'r', i = 2, i2 = 2, j = 2 }),
-                OnNext(314, new { c = 'u', i = 2, i2 = 2, j = 3 }),
-                OnNext(315, new { c = 'l', i = 2, i2 = 2, j = 4 }),
-                OnNext(316, new { c = 'e', i = 2, i2 = 2, j = 5 }),
-                OnNext(317, new { c = 'z', i = 2, i2 = 2, j = 6 }),
-                OnCompleted(new { c = 'a', i = 0, i2 = 0, j = 0 }, 410)
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
+            );
+#else
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 990)
             );
+#endif
 
-            css.Subscriptions.AssertEqual(
-                Subscribe(200, 410));
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 800)
+            );
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 990)
+            );
+#endif
         }
 
-        
         [TestMethod]
-        // Tests this overload:
-        // IObservable<TResult> SelectMany<TSource, TCollection, TResult>(IObservable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, int, TCollection, int, TResult> resultSelector);
-        public void SelectMany_WithIndex_IEnumerable_ResultSelector_Complete()
+        public void GroupJoinOp_Normal_IV()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 5),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnCompleted<TimeInterval<int>>(990)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(980)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                        xs.SelectMany(
-                          (x, i) => new[] { new { x = x + 1, i = i }, new { x = -x, i = i }, new { x = x * x, i = i } },
-                          (x, i, y, j) => new { x = x, i = i, y = y.x, y_i = y.i, j = j })
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
-            
+
             res.Messages.AssertEqual(
-                OnNext(210, new { x = 5, i = 0, y = 6, y_i = 0, j = 0 }),
-                OnNext(210, new { x = 5, i = 0, y = -5, y_i = 0, j = 1 }),
-                OnNext(210, new { x = 5, i = 0, y = 25, y_i = 0, j = 2 }),
-                OnNext(340, new { x = 4, i = 1, y = 5, y_i = 1, j = 0 }),
-                OnNext(340, new { x = 4, i = 1, y = -4, y_i = 1, j = 1 }),
-                OnNext(340, new { x = 4, i = 1, y = 16, y_i = 1, j = 2 }),
-                OnNext(420, new { x = 3, i = 2, y = 4, y_i = 2, j = 0 }),
-                OnNext(420, new { x = 3, i = 2, y = -3, y_i = 2, j = 1 }),
-                OnNext(420, new { x = 3, i = 2, y = 9, y_i = 2, j = 2 }),
-                OnCompleted(new { x = default(int), i = default(int), y = default(int), y_i = default(int), j = default(int) }, 600)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnCompleted<string>(990)
             );
 
+            AssertDurations(xs, xsd, 990);
+            AssertDurations(ys, ysd, 990);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 600)
+                Subscribe(200, 990)
+            );
+
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 980)
+            );
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 990)
             );
+#endif
         }
 
         [TestMethod]
-        // Tests this overload:
-        // IObservable<TResult> SelectMany<TSource, TResult>(IObservable<TSource> source, Func<TSource, int, IObservable<TResult>> onNext, Func<Exception, int, IObservable<TResult>> onError, Func<int, IObservable<TResult>> onCompleted);
-        public void SelectMany_WithIndex_Triple_Complete()
+        public void GroupJoinOp_Normal_V()
         {
             var scheduler = new TestScheduler();
 
-            ITestableObservable<char> cs = scheduler.CreateHotObservable(
-                 OnNext(190, 'h'),   // Test scheduler starts pushing events at time 200, so this is ignored.
-                 OnNext(250, 'a'),
-                 OnNext(270, 'l'),
-                 OnNext(310, 'o'),
-                 OnCompleted<char>(410)
-                 );
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnCompleted<TimeInterval<int>>(990)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(900)
+            );
+
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                cs.SelectMany(
-                    (c, i) => Observable.Return(new { c = c, i = i }, scheduler),
-                    (ex, i) => { throw ex; },
-                    (i) => Observable.Repeat(new { c = 'x', i = -1 }, i, scheduler)
-                ));
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
+            );
 
             res.Messages.AssertEqual(
-                OnNext(251, new { c = 'a', i = 0 }),
-                OnNext(271, new { c = 'l', i = 1 }),
-                OnNext(311, new { c = 'o', i = 2 }),
-                OnCompleted(new { c = default(char), i = default(int) }, 410)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnCompleted<string>(990)
             );
 
-            cs.Subscriptions.AssertEqual(
-                Subscribe(200, 410));
-        }
-
+            AssertDurations(xs, xsd, 990);
+            AssertDurations(ys, ysd, 990);
 
-        [TestMethod]
-        public void SelectMany_Enumerable_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, IEnumerable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, IEnumerable<int>>)null));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IEnumerable<int>>.Instance).Subscribe(null));
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 990)
+            );
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, IEnumerable<int>>.Instance, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, IEnumerable<int>>)null, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IEnumerable<int>>.Instance, (Func<int, int, int>)null));
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
+            );
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 990)
+            );
+#endif
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_Complete()
+        public void GroupJoinOp_Normal_VI()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(30))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(200))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(850)
             );
 
-            var inners = new List<MockEnumerable<int>>();
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(20))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(900)
+            );
+
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(x =>
-                {
-                    var ys = new MockEnumerable<int>(scheduler, Enumerable.Repeat(x, x));
-                    inners.Add(ys);
-                    return ys;
-                })
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(210, 2),
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(420, 3),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
-            );
-
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 600)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnCompleted<string>(920)
             );
 
-            Assert.AreEqual(4, inners.Count);
+            AssertDurations(xs, xsd, 920);
+            AssertDurations(ys, ysd, 920);
 
-            inners[0].Subscriptions.AssertEqual(
-                Subscribe(210, 210)
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 850)
             );
-
-            inners[1].Subscriptions.AssertEqual(
-                Subscribe(340, 340)
+#else
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 920)
             );
+#endif
 
-            inners[2].Subscriptions.AssertEqual(
-                Subscribe(420, 420)
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
             );
-
-            inners[3].Subscriptions.AssertEqual(
-                Subscribe(510, 510)
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 920)
             );
+#endif
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_Complete_ResultSelector()
+        public void GroupJoinOp_Normal_VII()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnCompleted<TimeInterval<int>>(210)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(20))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(900)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => Enumerable.Repeat(x, x), (x, y) => x + y)
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(210, 4),
-                OnNext(210, 4),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(420, 6),
-                OnNext(420, 6),
-                OnNext(420, 6),
-                OnNext(510, 4),
-                OnNext(510, 4),
-                OnCompleted<int>(600)
+                OnCompleted<string>(210)
             );
 
+            AssertDurations(xs, xsd, 210);
+            AssertDurations(ys, ysd, 210);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 600)
+                Subscribe(200, 210)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_Error()
+        public void GroupJoinOp_Normal_VIII()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnError<int>(600, ex)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(200)))
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(220, new TimeInterval<string>("hat", TimeSpan.FromTicks(100))),
+                OnCompleted<TimeInterval<string>>(230)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => Enumerable.Repeat(x, x))
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(210, 2),
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(420, 3),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnNext(510, 2),
-                OnError<int>(600, ex)
+                OnNext(220, "0hat")
             );
 
+            AssertDurations(xs, xsd, 1000);
+            AssertDurations(ys, ysd, 1000);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 600)
+                Subscribe(200, 1000)
+            );
+
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 230)
+            );
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 1000)
             );
+#endif
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_Error_ResultSelector()
+        public void GroupJoinOp_Normal_IX()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnError<int>(600, ex)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x => Enumerable.Repeat(x, x), (x, y) => x + y)
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(210, 4),
-                OnNext(210, 4),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(420, 6),
-                OnNext(420, 6),
-                OnNext(420, 6),
-                OnNext(510, 4),
-                OnNext(510, 4),
-                OnError<int>(600, ex)
-            );
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 600)
+            var res = scheduler.Start(() =>
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge(),
+                713
             );
-        }
 
-        [TestMethod]
-        public void SelectMany_Enumerable_Dispose()
-        {
-            var scheduler = new TestScheduler();
-
-            var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+            res.Messages.AssertEqual(
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man")
             );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x => Enumerable.Repeat(x, x)),
-                350
-            );
+            AssertDurations(xs, xsd, 713);
+            AssertDurations(ys, ysd, 713);
 
-            res.Messages.AssertEqual(
-                OnNext(210, 2),
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(340, 4)
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 713)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 350)
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 713)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_Dispose_ResultSelector()
+        public void GroupJoinOp_Error_I()
         {
             var scheduler = new TestScheduler();
 
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnError<TimeInterval<int>>(310, ex)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => Enumerable.Repeat(x, x), (x, y) => x + y),
-                350
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(210, 4),
-                OnNext(210, 4),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnError<string>(310, ex)
             );
 
+            AssertDurations(xs, xsd, 310);
+            AssertDurations(ys, ysd, 310);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 350)
+                Subscribe(200, 310)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 310)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_SelectorThrows()
+        public void GroupJoinOp_Error_II()
         {
             var scheduler = new TestScheduler();
 
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            var invoked = 0;
-            var ex = new Exception();
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnError<TimeInterval<string>>(722, ex)
+            );
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x =>
-                {
-                    invoked++;
-                    if (invoked == 3)
-                        throw ex;
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
-                    return Enumerable.Repeat(x, x);
-                })
+            var res = scheduler.Start(() =>
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(210, 2),
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnNext(340, 4),
-                OnError<int>(420, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnError<string>(722, ex)
             );
 
+            AssertDurations(xs, xsd, 722);
+            AssertDurations(ys, ysd, 722);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 420)
+                Subscribe(200, 722)
             );
 
-            Assert.AreEqual(3, invoked);
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 722)
+            );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_ResultSelectorThrows()
+        public void GroupJoinOp_Error_III()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
             var ex = new Exception();
 
-            var inners = new List<MockEnumerable<int>>();
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x =>
-                    {
-                        var ys = new MockEnumerable<int>(scheduler, Enumerable.Repeat(x, x));
-                        inners.Add(ys);
-                        return ys;
-                    },
-                    (x, y) =>
-                    {
-                        if (x == 3)
-                            throw ex;
-
-                        return x + y;
-                    }
-                )
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler).SelectMany(x.Value == 6 ? Observable.Throw<long>(ex) : Observable.Empty<long>()), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(210, 4),
-                OnNext(210, 4),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnError<int>(420, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnError<string>(725, ex)
             );
 
+            AssertDurations(xs, xsd, 725);
+            AssertDurations(ys, ysd, 725);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 420)
+                Subscribe(200, 725)
             );
 
-            Assert.AreEqual(3, inners.Count);
-
-            inners[0].Subscriptions.AssertEqual(
-                Subscribe(210, 210)
-            );
-
-            inners[1].Subscriptions.AssertEqual(
-                Subscribe(340, 340)
-            );
-
-            inners[2].Subscriptions.AssertEqual(
-                Subscribe(420, 420)
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 725)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_ResultSelector_GetEnumeratorThrows()
+        public void GroupJoinOp_Error_IV()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(19))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
             var ex = new Exception();
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => new RogueEnumerable<int>(ex), (x, y) => x + y)
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler).SelectMany(y.Value == "tin" ? Observable.Throw<long>(ex) : Observable.Empty<long>()), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnError<int>(210, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnError<string>(721, ex)
             );
 
+            AssertDurations(xs, xsd, 721);
+            AssertDurations(ys, ysd, 721);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+                Subscribe(200, 721)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 721)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_SelectorThrows_ResultSelector()
+        public void GroupJoinOp_Error_V()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
-            var invoked = 0;
             var ex = new Exception();
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x =>
-                    {
-                        invoked++;
-                        if (invoked == 3)
-                            throw ex;
+            var ysd = new List<ITestableObservable<long>>();
 
-                        return Enumerable.Repeat(x, x);
-                    },
-                    (x, y) => x + y
-                )
+            var res = scheduler.Start(() =>
+                xs.GroupJoin(ys, x => { if (x.Value >= 0) throw ex; return Observable.Empty<long>(); }, y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnNext(210, 4),
-                OnNext(210, 4),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnNext(340, 8),
-                OnError<int>(420, ex)
+                OnError<string>(210, ex)
             );
 
+            AssertDurations(ys, ysd, 210);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 420)
+                Subscribe(200, 210)
             );
 
-            Assert.AreEqual(3, invoked);
-        }
-
-        class CurrentThrowsEnumerable<T> : IEnumerable<T>
-        {
-            IEnumerable<T> e;
-            Exception ex;
-
-            public CurrentThrowsEnumerable(IEnumerable<T> e, Exception ex)
-            {
-                this.e = e;
-                this.ex = ex;
-            }
-
-            public IEnumerator<T> GetEnumerator()
-            {
-                return new Enumerator(e.GetEnumerator(), ex);
-            }
-
-            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
-            {
-                return GetEnumerator();
-            }
-
-            class Enumerator : IEnumerator<T>
-            {
-                IEnumerator<T> e;
-                Exception ex;
-
-                public Enumerator(IEnumerator<T> e, Exception ex)
-                {
-                    this.e = e;
-                    this.ex = ex;
-                }
-
-                public T Current
-                {
-                    get { throw ex; }
-                }
-
-                public void Dispose()
-                {
-                    e.Dispose();
-                }
-
-                object System.Collections.IEnumerator.Current
-                {
-                    get { return Current; }
-                }
-
-                public bool MoveNext()
-                {
-                    return e.MoveNext();
-                }
-
-                public void Reset()
-                {
-                    e.Reset();
-                }
-            }
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_CurrentThrows()
+        public void GroupJoinOp_Error_VI()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
             var ex = new Exception();
 
+            var xsd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => new CurrentThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex))
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => { if (y.Value.Length >= 0) throw ex; return Observable.Empty<long>(); }, (x, yy) => yy.Select(y => x.Value + y.Value)).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnError<int>(210, ex)
+                OnError<string>(215, ex)
             );
 
+            AssertDurations(xs, xsd, 215);
+
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+                Subscribe(200, 215)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 215)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_CurrentThrows_ResultSelector()
+        public void GroupJoinOp_Error_VII()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
-            );
-
-            var ex = new Exception();
-
-            var res = scheduler.Start(() =>
-                xs.SelectMany(x => new CurrentThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex), (x, y) => x + y)
-            );
-
-            res.Messages.AssertEqual(
-                OnError<int>(210, ex)
+                OnNext(215, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+            var ys = scheduler.CreateHotObservable(
+                OnNext(210, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
-        }
-
-        class MoveNextThrowsEnumerable<T> : IEnumerable<T>
-        {
-            IEnumerable<T> e;
-            Exception ex;
-
-            public MoveNextThrowsEnumerable(IEnumerable<T> e, Exception ex)
-            {
-                this.e = e;
-                this.ex = ex;
-            }
-
-            public IEnumerator<T> GetEnumerator()
-            {
-                return new Enumerator(e.GetEnumerator(), ex);
-            }
-
-            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
-            {
-                return GetEnumerator();
-            }
 
-            class Enumerator : IEnumerator<T>
-            {
-                IEnumerator<T> e;
-                Exception ex;
+            var ex = new Exception();
 
-                public Enumerator(IEnumerator<T> e, Exception ex)
-                {
-                    this.e = e;
-                    this.ex = ex;
-                }
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
-                public T Current
-                {
-                    get { return e.Current; }
-                }
+            var res = scheduler.Start(() =>
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => { if (x.Value >= 0) throw ex; return yy.Select(y => x.Value + y.Value); }).Merge()
+            );
 
-                public void Dispose()
-                {
-                    e.Dispose();
-                }
+            res.Messages.AssertEqual(
+                OnError<string>(215, ex)
+            );
 
-                object System.Collections.IEnumerator.Current
-                {
-                    get { return Current; }
-                }
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x - Duration selector is now invoked before the result selector
+            AssertDurations(xs, xsd, 215);
+#endif
+            AssertDurations(ys, ysd, 215);
 
-                public bool MoveNext()
-                {
-                    throw ex;
-                }
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 215)
+            );
 
-                public void Reset()
-                {
-                    e.Reset();
-                }
-            }
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 215)
+            );
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_GetEnumeratorThrows()
+        public void GroupJoinOp_Error_VIII()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
             var ex = new Exception();
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => new RogueEnumerable<int>(ex))
+                xs.GroupJoin(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, yy) => { if (x.Value >= 0) throw ex; return yy.Select(y => x.Value + y.Value); }).Merge()
             );
 
             res.Messages.AssertEqual(
-                OnError<int>(210, ex)
+                OnError<string>(210, ex)
             );
 
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x - Duration selector is now invoked before the result selector
+            AssertDurations(xs, xsd, 210);
+#endif
+            AssertDurations(ys, ysd, 210);
+
             xs.Subscriptions.AssertEqual(
                 Subscribe(200, 210)
             );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
         }
 
+        #endregion
+
+        #region + Join +
+
         [TestMethod]
-        public void SelectMany_Enumerable_MoveNextThrows()
+        public void JoinOp_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(null, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, null, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, DummyObservable<int>.Instance, default(Func<int, IObservable<int>>), DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, default(Func<int, IObservable<int>>), DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, default(Func<int, int, int>)));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Join(DummyObservable<int>.Instance, DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void JoinOp_Normal_I()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            var ex = new Exception();
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
+            );
+
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => new MoveNextThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex))
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnError<int>(210, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnNext(830, "9rat"),
+                OnCompleted<string>(900)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+                Subscribe(200, 900)
+            );
+
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 800)
+            );
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
             );
+#endif
+
+            AssertDurations(xs, xsd, 900);
+            AssertDurations(ys, ysd, 900);
         }
 
         [TestMethod]
-        public void SelectMany_Enumerable_MoveNextThrows_ResultSelector()
+        public void JoinOp_Normal_II()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(210, 2),
-                OnNext(340, 4),
-                OnNext(420, 3),
-                OnNext(510, 2),
-                OnCompleted<int>(600)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnCompleted<TimeInterval<int>>(721)
             );
 
-            var ex = new Exception();
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(990)
+            );
+
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(x => new MoveNextThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex), (x, y) => x + y)
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnError<int>(210, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnCompleted<string>(910)
             );
 
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 210)
+                Subscribe(200, 721)
             );
-        }
-
-        [TestMethod]
-        public void SelectMany_QueryOperator_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, IObservable<int>>)null, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IObservable<int>>.Instance, ((Func<int, int, int>)null)));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance).Subscribe(null));
-
-#if !NO_TPL
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, Task<int>>.Instance, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, Task<int>>)null, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, Task<int>>.Instance, ((Func<int, int, int>)null)));
-
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, CancellationToken, Task<int>>.Instance, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, CancellationToken, Task<int>>)null, DummyFunc<int, int, int>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, CancellationToken, Task<int>>.Instance, ((Func<int, int, int>)null)));
+#else
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 910)
+            );
+#endif
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, Task<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, Task<int>>)null));
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 910)
+            );
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, CancellationToken, Task<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, CancellationToken, Task<int>>)null));
-#endif
+            AssertDurations(xs, xsd, 910);
+            AssertDurations(ys, ysd, 910);
         }
 
         [TestMethod]
-        public void SelectMany_QueryOperator_CompleteOuterFirst()
+        public void JoinOp_Normal_III()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(220, 4),
-                OnNext(221, 3),
-                OnNext(222, 2),
-                OnNext(223, 5),
-                OnCompleted<int>(224)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                from x in xs
-                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
-                select x * 10 + (int)y
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler).Where(_ => false), y => NewTimer(ysd, y.Interval, scheduler).Where(_ => false), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(221, 40),
-                OnNext(222, 30),
-                OnNext(222, 41),
-                OnNext(223, 20),
-                OnNext(223, 31),
-                OnNext(223, 42),
-                OnNext(224, 50),
-                OnNext(224, 21),
-                OnNext(224, 32),
-                OnNext(224, 43),
-                OnNext(225, 51),
-                OnNext(226, 52),
-                OnNext(227, 53),
-                OnNext(228, 54),
-                OnCompleted<int>(228)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnNext(830, "9rat"),
+                OnCompleted<string>(900)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 224)
+                Subscribe(200, 900)
+            );
+
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 800)
             );
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
+            );
+#endif
+
+            AssertDurations(xs, xsd, 900);
+            AssertDurations(ys, ysd, 900);
         }
 
         [TestMethod]
-        public void SelectMany_QueryOperator_CompleteInnerFirst()
+        public void JoinOp_Normal_IV()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(220, 4),
-                OnNext(221, 3),
-                OnNext(222, 2),
-                OnNext(223, 5),
-                OnCompleted<int>(300)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnCompleted<TimeInterval<int>>(990)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(980)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                from x in xs
-                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
-                select x * 10 + (int)y
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(221, 40),
-                OnNext(222, 30),
-                OnNext(222, 41),
-                OnNext(223, 20),
-                OnNext(223, 31),
-                OnNext(223, 42),
-                OnNext(224, 50),
-                OnNext(224, 21),
-                OnNext(224, 32),
-                OnNext(224, 43),
-                OnNext(225, 51),
-                OnNext(226, 52),
-                OnNext(227, 53),
-                OnNext(228, 54),
-                OnCompleted<int>(300)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnCompleted<string>(980)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 300)
+                Subscribe(200, 980)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 980)
             );
+
+            AssertDurations(xs, xsd, 980);
+            AssertDurations(ys, ysd, 980);
         }
 
         [TestMethod]
-        public void SelectMany_QueryOperator_ErrorOuter()
+        public void JoinOp_Normal_V()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(220, 4),
-                OnNext(221, 3),
-                OnNext(222, 2),
-                OnNext(223, 5),
-                OnError<int>(224, ex)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(200))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnCompleted<TimeInterval<int>>(990)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(900)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                from x in xs
-                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
-                select x * 10 + (int)y
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(221, 40),
-                OnNext(222, 30),
-                OnNext(222, 41),
-                OnNext(223, 20),
-                OnNext(223, 31),
-                OnNext(223, 42),
-                OnError<int>(224, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnCompleted<string>(922)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 224)
-            );
-        }
-
-        [TestMethod]
-        public void SelectMany_QueryOperator_ErrorInner()
-        {
-            var scheduler = new TestScheduler();
-
-            var xs = scheduler.CreateHotObservable(
-                OnNext(220, 4),
-                OnNext(221, 3),
-                OnNext(222, 2),
-                OnNext(223, 5),
-                OnCompleted<int>(224)
+                Subscribe(200, 922)
             );
 
-            var ex = new Exception();
-
-            var res = scheduler.Start(() =>
-                from x in xs
-                from y in x == 2 ? Observable.Throw<long>(ex, scheduler)
-                                 : Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
-                select x * 10 + (int)y
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
             );
-
-            res.Messages.AssertEqual(
-                OnNext(221, 40),
-                OnNext(222, 30),
-                OnNext(222, 41),
-                OnError<int>(223, ex)
+#else
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 922)
             );
+#endif
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 223)
-            );
+            AssertDurations(xs, xsd, 922);
+            AssertDurations(ys, ysd, 922);
         }
 
         [TestMethod]
-        public void SelectMany_QueryOperator_Dispose()
+        public void JoinOp_Normal_VI()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(220, 4),
-                OnNext(221, 3),
-                OnNext(222, 2),
-                OnNext(223, 5),
-                OnCompleted<int>(224)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(30))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(200))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(850)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(20))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(900)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                from x in xs
-                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
-                select x * 10 + (int)y,
-                223
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(221, 40),
-                OnNext(222, 30),
-                OnNext(222, 41)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnNext(732, "7wig"),
+                OnNext(732, "8wig"),
+                OnCompleted<string>(900)
             );
 
+#if !NO_PERF // BREAKING CHANGE v2 > v1.x -> More aggressive disposal behavior
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 223)
+                Subscribe(200, 850)
             );
-        }
+#else
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
+            );
+#endif
 
-        static T Throw<T>(Exception ex)
-        {
-            throw ex;
-        }
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
+            );
 
+            AssertDurations(xs, xsd, 900);
+            AssertDurations(ys, ysd, 900);
+        }
 
         [TestMethod]
-        public void SelectMany_QueryOperator_ThrowSelector()
+        public void JoinOp_Normal_VII()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(220, 4),
-                OnNext(221, 3),
-                OnNext(222, 2),
-                OnNext(223, 5),
-                OnCompleted<int>(224)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            var ex = new Exception();
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
+            );
+
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                from x in xs
-                from y in Throw<IObservable<long>>(ex)
-                select x * 10 + (int)y
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value),
+                713
             );
 
             res.Messages.AssertEqual(
-                OnError<int>(220, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man")
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 220)
+                Subscribe(200, 713)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 713)
             );
+
+            AssertDurations(xs, xsd, 713);
+            AssertDurations(ys, ysd, 713);
         }
 
         [TestMethod]
-        public void SelectMany_QueryOperator_ThrowResult()
+        public void JoinOp_Error_I()
         {
             var scheduler = new TestScheduler();
 
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(220, 4),
-                OnNext(221, 3),
-                OnNext(222, 2),
-                OnNext(223, 5),
-                OnCompleted<int>(224)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnError<TimeInterval<int>>(310, ex)
             );
 
-            var ex = new Exception();
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
+            );
+
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                from x in xs
-                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
-                select Throw<int>(ex)
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnError<int>(221, ex)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnError<string>(310, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 221)
+                Subscribe(200, 310)
             );
-        }
 
-        [TestMethod]
-        public void SelectMany_Triple_ArgumentChecking()
-        {
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(null, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, null, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, null, DummyFunc<IObservable<int>>.Instance));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, null));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance).Subscribe(null));
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 310)
+            );
+
+            AssertDurations(xs, xsd, 310);
+            AssertDurations(ys, ysd, 310);
         }
 
         [TestMethod]
-        public void SelectMany_Triple_Identity()
+        public void JoinOp_Error_II()
         {
             var scheduler = new TestScheduler();
 
+            var ex = new Exception();
+
             var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnError<TimeInterval<string>>(722, ex)
             );
 
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Return(x, scheduler),
-                    ex => Observable.Throw<int>(ex, scheduler),
-                    () => Observable.Empty<int>(scheduler)
-                )
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(301, 0),
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(305, 4),
-                OnCompleted<int>(306)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnError<string>(722, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
+                Subscribe(200, 722)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 722)
             );
+
+            AssertDurations(xs, xsd, 722);
+            AssertDurations(ys, ysd, 722);
         }
 
         [TestMethod]
-        public void SelectMany_Triple_InnersWithTiming1()
+        public void JoinOp_Error_III()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            var ysn = scheduler.CreateColdObservable(
-                OnNext(10, 10),
-                OnNext(20, 11),
-                OnNext(30, 12),
-                OnCompleted<int>(40)
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
-            var yse = scheduler.CreateColdObservable(
-                OnNext(0, 99),
-                OnCompleted<int>(10)
-            );
+            var ex = new Exception();
 
-            var ysc = scheduler.CreateColdObservable(
-                OnNext(10, 42),
-                OnCompleted<int>(20)
-            );
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => ysn,
-                    ex => yse,
-                    () => ysc
-                )
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler).SelectMany(x.Value == 6 ? Observable.Throw<long>(ex) : Observable.Empty<long>()), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(310, 10),
-                OnNext(311, 10),
-                OnNext(312, 10),
-                OnNext(313, 10),
-                OnNext(314, 10),
-                OnNext(315, 42),
-                OnNext(320, 11),
-                OnNext(321, 11),
-                OnNext(322, 11),
-                OnNext(323, 11),
-                OnNext(324, 11),
-                OnNext(330, 12),
-                OnNext(331, 12),
-                OnNext(332, 12),
-                OnNext(333, 12),
-                OnNext(334, 12),
-                OnCompleted<int>(344)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnNext(722, "7rat"),
+                OnNext(722, "6rat"),
+                OnNext(722, "8rat"),
+                OnError<string>(725, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
-            );
-
-            ysn.Subscriptions.AssertEqual(
-                Subscribe(300, 340),
-                Subscribe(301, 341),
-                Subscribe(302, 342),
-                Subscribe(303, 343),
-                Subscribe(304, 344)
+                Subscribe(200, 725)
             );
 
-            yse.Subscriptions.AssertEqual(
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 725)
             );
 
-            ysc.Subscriptions.AssertEqual(
-                Subscribe(305, 325)
-            );
+            AssertDurations(xs, xsd, 725);
+            AssertDurations(ys, ysd, 725);
         }
 
         [TestMethod]
-        public void SelectMany_Triple_InnersWithTiming2()
+        public void JoinOp_Error_IV()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            var ysn = scheduler.CreateColdObservable(
-                OnNext(10, 10),
-                OnNext(20, 11),
-                OnNext(30, 12),
-                OnCompleted<int>(40)
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(19))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
-            var yse = scheduler.CreateColdObservable(
-                OnNext(0, 99),
-                OnCompleted<int>(10)
-            );
+            var ex = new Exception();
 
-            var ysc = scheduler.CreateColdObservable(
-                OnNext(10, 42),
-                OnCompleted<int>(50)
-            );
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => ysn,
-                    ex => yse,
-                    () => ysc
-                )
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler).SelectMany(y.Value == "tin" ? Observable.Throw<long>(ex) : Observable.Empty<long>()), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(310, 10),
-                OnNext(311, 10),
-                OnNext(312, 10),
-                OnNext(313, 10),
-                OnNext(314, 10),
-                OnNext(315, 42),
-                OnNext(320, 11),
-                OnNext(321, 11),
-                OnNext(322, 11),
-                OnNext(323, 11),
-                OnNext(324, 11),
-                OnNext(330, 12),
-                OnNext(331, 12),
-                OnNext(332, 12),
-                OnNext(333, 12),
-                OnNext(334, 12),
-                OnCompleted<int>(355)
+                OnNext(215, "0hat"),
+                OnNext(217, "0bat"),
+                OnNext(219, "1hat"),
+                OnNext(300, "3wag"),
+                OnNext(300, "3pig"),
+                OnNext(305, "3cup"),
+                OnNext(310, "4wag"),
+                OnNext(310, "4pig"),
+                OnNext(310, "4cup"),
+                OnNext(702, "6tin"),
+                OnNext(710, "7tin"),
+                OnNext(712, "7man"),
+                OnNext(712, "6man"),
+                OnNext(720, "8tin"),
+                OnNext(720, "8man"),
+                OnError<string>(721, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
-            );
-
-            ysn.Subscriptions.AssertEqual(
-                Subscribe(300, 340),
-                Subscribe(301, 341),
-                Subscribe(302, 342),
-                Subscribe(303, 343),
-                Subscribe(304, 344)
+                Subscribe(200, 721)
             );
 
-            yse.Subscriptions.AssertEqual(
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 721)
             );
 
-            ysc.Subscriptions.AssertEqual(
-                Subscribe(305, 355)
-            );
+            AssertDurations(xs, xsd, 721);
+            AssertDurations(ys, ysd, 721);
         }
 
         [TestMethod]
-        public void SelectMany_Triple_InnersWithTiming3()
+        public void JoinOp_Error_V()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(400, 1),
-                OnNext(500, 2),
-                OnNext(600, 3),
-                OnNext(700, 4),
-                OnCompleted<int>(800)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            var ysn = scheduler.CreateColdObservable(
-                OnNext(10, 10),
-                OnNext(20, 11),
-                OnNext(30, 12),
-                OnCompleted<int>(40)
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
-            var yse = scheduler.CreateColdObservable(
-                OnNext(0, 99),
-                OnCompleted<int>(10)
-            );
+            var ex = new Exception();
 
-            var ysc = scheduler.CreateColdObservable(
-                OnNext(10, 42),
-                OnCompleted<int>(100)
-            );
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => ysn,
-                    ex => yse,
-                    () => ysc
-                )
+                xs.Join(ys, x => { if (x.Value >= 0) throw ex; return Observable.Empty<long>(); }, y => NewTimer(ysd, y.Interval, scheduler), (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(310, 10),
-                OnNext(320, 11),
-                OnNext(330, 12),
-                OnNext(410, 10),
-                OnNext(420, 11),
-                OnNext(430, 12),
-                OnNext(510, 10),
-                OnNext(520, 11),
-                OnNext(530, 12),
-                OnNext(610, 10),
-                OnNext(620, 11),
-                OnNext(630, 12),
-                OnNext(710, 10),
-                OnNext(720, 11),
-                OnNext(730, 12),
-                OnNext(810, 42),
-                OnCompleted<int>(900)
+                OnError<string>(210, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 800)
-            );
-
-            ysn.Subscriptions.AssertEqual(
-                Subscribe(300, 340),
-                Subscribe(400, 440),
-                Subscribe(500, 540),
-                Subscribe(600, 640),
-                Subscribe(700, 740)
+                Subscribe(200, 210)
             );
 
-            yse.Subscriptions.AssertEqual(
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
             );
 
-            ysc.Subscriptions.AssertEqual(
-                Subscribe(800, 900)
-            );
+            AssertDurations(ys, ysd, 210);
         }
 
         [TestMethod]
-        public void SelectMany_Triple_Error_Identity()
+        public void JoinOp_Error_VI()
         {
             var scheduler = new TestScheduler();
 
-            var ex = new Exception();
-
             var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnError<int>(305, ex)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
+            var ex = new Exception();
+
+            var xsd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Return(x, scheduler),
-                    ex1 => Observable.Throw<int>(ex1, scheduler),
-                    () => Observable.Empty<int>(scheduler)
-                )
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => { if (y.Value.Length >= 0) throw ex; return Observable.Empty<long>(); }, (x, y) => x.Value + y.Value)
             );
 
             res.Messages.AssertEqual(
-                OnNext(301, 0),
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(305, 4),
-                OnError<int>(306, ex)
+                OnError<string>(215, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
+                Subscribe(200, 215)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 215)
             );
+
+            AssertDurations(xs, xsd, 215);
         }
 
         [TestMethod]
-        public void SelectMany_Triple_SelectMany()
+        public void JoinOp_Error_VII()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
-            );
-
-            var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Repeat(x, x, scheduler),
-                    ex => Observable.Throw<int>(ex, scheduler),
-                    () => Observable.Empty<int>(scheduler)
-                )
+                OnNext(215, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
             );
 
-            res.Messages.AssertEqual(
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(304, 2),
-                OnNext(305, 4),
-                OnNext(305, 3),
-                OnNext(306, 4),
-                OnNext(306, 3),
-                OnNext(307, 4),
-                OnNext(308, 4),
-                OnCompleted<int>(308)
-            );
-
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
+            var ys = scheduler.CreateHotObservable(
+                OnNext(210, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
-        }
 
+            var ex = new Exception();
 
-        [TestMethod]
-        public void SelectMany_Triple_Concat()
-        {
-            var scheduler = new TestScheduler();
-
-            var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
-            );
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Return(x, scheduler),
-                    ex => Observable.Throw<int>(ex, scheduler),
-                    () => Observable.Range(1, 3, scheduler)
-                )
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => { if (x.Value >= 0) throw ex; return x.Value + y.Value; })
             );
 
             res.Messages.AssertEqual(
-                OnNext(301, 0),
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(305, 4),
-                OnNext(306, 1),
-                OnNext(307, 2),
-                OnNext(308, 3),
-                OnCompleted<int>(309)
+                OnError<string>(215, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
+                Subscribe(200, 215)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 215)
             );
+
+            AssertDurations(xs, xsd, 215);
+            AssertDurations(ys, ysd, 215);
         }
 
         [TestMethod]
-        public void SelectMany_Triple_Catch()
+        public void JoinOp_Error_VIII()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
+                OnNext(210, new TimeInterval<int>(0, TimeSpan.FromTicks(10))),
+                OnNext(219, new TimeInterval<int>(1, TimeSpan.FromTicks(5))),
+                OnNext(240, new TimeInterval<int>(2, TimeSpan.FromTicks(10))),
+                OnNext(300, new TimeInterval<int>(3, TimeSpan.FromTicks(100))),
+                OnNext(310, new TimeInterval<int>(4, TimeSpan.FromTicks(80))),
+                OnNext(500, new TimeInterval<int>(5, TimeSpan.FromTicks(90))),
+                OnNext(700, new TimeInterval<int>(6, TimeSpan.FromTicks(25))),
+                OnNext(710, new TimeInterval<int>(7, TimeSpan.FromTicks(300))),
+                OnNext(720, new TimeInterval<int>(8, TimeSpan.FromTicks(100))),
+                OnNext(830, new TimeInterval<int>(9, TimeSpan.FromTicks(10))),
+                OnCompleted<TimeInterval<int>>(900)
+            );
+
+            var ys = scheduler.CreateHotObservable(
+                OnNext(215, new TimeInterval<string>("hat", TimeSpan.FromTicks(20))),
+                OnNext(217, new TimeInterval<string>("bat", TimeSpan.FromTicks(1))),
+                OnNext(290, new TimeInterval<string>("wag", TimeSpan.FromTicks(200))),
+                OnNext(300, new TimeInterval<string>("pig", TimeSpan.FromTicks(10))),
+                OnNext(305, new TimeInterval<string>("cup", TimeSpan.FromTicks(50))),
+                OnNext(600, new TimeInterval<string>("yak", TimeSpan.FromTicks(90))),
+                OnNext(702, new TimeInterval<string>("tin", TimeSpan.FromTicks(20))),
+                OnNext(712, new TimeInterval<string>("man", TimeSpan.FromTicks(10))),
+                OnNext(722, new TimeInterval<string>("rat", TimeSpan.FromTicks(200))),
+                OnNext(732, new TimeInterval<string>("wig", TimeSpan.FromTicks(5))),
+                OnCompleted<TimeInterval<string>>(800)
             );
 
+            var ex = new Exception();
+
+            var xsd = new List<ITestableObservable<long>>();
+            var ysd = new List<ITestableObservable<long>>();
+
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Return(x, scheduler),
-                    ex => Observable.Range(1, 3, scheduler),
-                    () => Observable.Empty<int>(scheduler)
-                )
+                xs.Join(ys, x => NewTimer(xsd, x.Interval, scheduler), y => NewTimer(ysd, y.Interval, scheduler), (x, y) => { if (x.Value >= 0) throw ex; return x.Value + y.Value; })
             );
 
             res.Messages.AssertEqual(
-                OnNext(301, 0),
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(305, 4),
-                OnCompleted<int>(306)
+                OnError<string>(215, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
+                Subscribe(200, 215)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(200, 215)
             );
+
+            AssertDurations(xs, xsd, 215);
+            AssertDurations(ys, ysd, 215);
         }
 
-        [TestMethod]
-        public void SelectMany_Triple_Error_Catch()
+        private ITestableObservable<long> NewTimer(List<ITestableObservable<long>> l, TimeSpan t, TestScheduler scheduler)
         {
-            var scheduler = new TestScheduler();
+            var timer = scheduler.CreateColdObservable(OnNext(t.Ticks, 0L), OnCompleted<long>(t.Ticks));
+            l.Add(timer);
+            return timer;
+        }
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnError<int>(305, new Exception())
-            );
+        private void AssertDurations<T, U>(ITestableObservable<TimeInterval<T>> xs, List<ITestableObservable<U>> xsd, long lastEnd)
+        {
+            Assert.AreEqual(xs.Messages.Where(x => x.Value.Kind == NotificationKind.OnNext && x.Time <= lastEnd).Count(), xsd.Count);
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Return(x, scheduler),
-                    ex => Observable.Range(1, 3, scheduler),
-                    () => Observable.Empty<int>(scheduler)
-                )
-            );
+            foreach (var pair in xs.Messages.Zip(xsd, (x, y) => new { Item1 = x, Item2 = y }))
+            {
+                var start = pair.Item1.Time;
+                var end = Math.Min(start + pair.Item1.Value.Value.Interval.Ticks, lastEnd);
+                pair.Item2.Subscriptions.AssertEqual(
+                    Subscribe(start, end)
+                );
+            }
+        }
 
-            res.Messages.AssertEqual(
-                OnNext(301, 0),
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(305, 4),
-                OnNext(306, 1),
-                OnNext(307, 2),
-                OnNext(308, 3),
-                OnCompleted<int>(309)
-            );
+        #endregion
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
-            );
+        #region + OfType +
+
+        [TestMethod]
+        public void OfType_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OfType<bool>(default(IObservable<object>)));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.OfType<bool>(DummyObservable<object>.Instance).Subscribe(null));
         }
 
         [TestMethod]
-        public void SelectMany_Triple_All()
+        public void OfType_Complete()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
+            var xs = scheduler.CreateHotObservable<object>(
+                OnNext<object>(210, new B(0)),
+                OnNext<object>(220, new A(1)),
+                OnNext<object>(230, new E(2)),
+                OnNext<object>(240, new D(3)),
+                OnNext<object>(250, new C(4)),
+                OnNext<object>(260, new B(5)),
+                OnNext<object>(270, new B(6)),
+                OnNext<object>(280, new D(7)),
+                OnNext<object>(290, new A(8)),
+                OnNext<object>(300, new E(9)),
+                OnNext<object>(310, 3),
+                OnNext<object>(320, "foo"),
+                OnNext<object>(330, true),
+                OnNext<object>(340, new B(10)),
+                OnCompleted<object>(350)
             );
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Repeat(x, x, scheduler),
-                    ex => Observable.Repeat(0, 2, scheduler),
-                    () => Observable.Repeat(-1, 2, scheduler)
-                )
+                xs.OfType<B>()
             );
 
             res.Messages.AssertEqual(
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(304, 2),
-                OnNext(305, 4),
-                OnNext(305, 3),
-                OnNext(306, -1),
-                OnNext(306, 4),
-                OnNext(306, 3),
-                OnNext(307, -1),
-                OnNext(307, 4),
-                OnNext(308, 4),
-                OnCompleted<int>(308)
+                OnNext<B>(210, new B(0)),
+                OnNext<B>(240, new D(3)),
+                OnNext<B>(260, new B(5)),
+                OnNext<B>(270, new B(6)),
+                OnNext<B>(280, new D(7)),
+                OnNext<B>(340, new B(10)),
+                OnCompleted<B>(350)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
+                Subscribe(200, 350)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Triple_Error_All()
+        public void OfType_Error()
         {
             var scheduler = new TestScheduler();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnError<int>(305, new Exception())
-            );
+            var ex = new Exception();
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Repeat(x, x, scheduler),
-                    ex => Observable.Repeat(0, 2, scheduler),
-                    () => Observable.Repeat(-1, 2, scheduler)
-                )
+            var xs = scheduler.CreateHotObservable<object>(
+                OnNext<object>(210, new B(0)),
+                OnNext<object>(220, new A(1)),
+                OnNext<object>(230, new E(2)),
+                OnNext<object>(240, new D(3)),
+                OnNext<object>(250, new C(4)),
+                OnNext<object>(260, new B(5)),
+                OnNext<object>(270, new B(6)),
+                OnNext<object>(280, new D(7)),
+                OnNext<object>(290, new A(8)),
+                OnNext<object>(300, new E(9)),
+                OnNext<object>(310, 3),
+                OnNext<object>(320, "foo"),
+                OnNext<object>(330, true),
+                OnNext<object>(340, new B(10)),
+                OnError<object>(350, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.OfType<B>()
             );
 
             res.Messages.AssertEqual(
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(304, 2),
-                OnNext(305, 4),
-                OnNext(305, 3),
-                OnNext(306, 0),
-                OnNext(306, 4),
-                OnNext(306, 3),
-                OnNext(307, 0),
-                OnNext(307, 4),
-                OnNext(308, 4),
-                OnCompleted<int>(308)
+                OnNext<B>(210, new B(0)),
+                OnNext<B>(240, new D(3)),
+                OnNext<B>(260, new B(5)),
+                OnNext<B>(270, new B(6)),
+                OnNext<B>(280, new D(7)),
+                OnNext<B>(340, new B(10)),
+                OnError<B>(350, ex)
             );
 
             xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
+                Subscribe(200, 350)
             );
         }
 
         [TestMethod]
-        public void SelectMany_Triple_All_Dispose()
+        public void OfType_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable<object>(
+                OnNext<object>(210, new B(0)),
+                OnNext<object>(220, new A(1)),
+                OnNext<object>(230, new E(2)),
+                OnNext<object>(240, new D(3)),
+                OnNext<object>(250, new C(4)),
+                OnNext<object>(260, new B(5)),
+                OnNext<object>(270, new B(6)),
+                OnNext<object>(280, new D(7)),
+                OnNext<object>(290, new A(8)),
+                OnNext<object>(300, new E(9)),
+                OnNext<object>(310, 3),
+                OnNext<object>(320, "foo"),
+                OnNext<object>(330, true),
+                OnNext<object>(340, new B(10)),
+                OnError<object>(350, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.OfType<B>(),
+                275
+            );
+
+            res.Messages.AssertEqual(
+                OnNext<B>(210, new B(0)),
+                OnNext<B>(240, new D(3)),
+                OnNext<B>(260, new B(5)),
+                OnNext<B>(270, new B(6))
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 275)
+            );
+        }
+
+        #endregion
+
+        #region + Select +
+
+        [TestMethod]
+        public void Select_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).Select<int, int>(DummyFunc<int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Select<int, int>((Func<int, int>)null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Select<int, int>(DummyFunc<int, int>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void Select_Throws()
+        {
+            ReactiveAssert.Throws<InvalidOperationException>(() =>
+                Observable.Return(1).Select<int, int>(x => x).Subscribe(
+                 x =>
+                 {
+                     throw new InvalidOperationException();
+                 }));
+            ReactiveAssert.Throws<InvalidOperationException>(() =>
+                Observable.Throw<int>(new Exception()).Select<int, int>(x => x).Subscribe(
+                 x => { },
+                 exception =>
+                 {
+                     throw new InvalidOperationException();
+                 }));
+            ReactiveAssert.Throws<InvalidOperationException>(() =>
+                 Observable.Empty<int>().Select<int, int>(x => x).Subscribe(
+                 x => { },
+                 exception => { },
+                 () =>
+                 {
+                     throw new InvalidOperationException();
+                 }));
+            ReactiveAssert.Throws<InvalidOperationException>(() => Observable.Create<int>(new Func<IObserver<int>, Action>(o => { throw new InvalidOperationException(); })).Select(x => x).Subscribe());
+        }
+
+        [TestMethod]
+        public void Select_DisposeInsideSelector()
         {
             var scheduler = new TestScheduler();
 
             var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
+                OnNext(100, 1),
+                OnNext(200, 2),
+                OnNext(500, 3),
+                OnNext(600, 4)
+            );
+
+            var invoked = 0;
+
+            var res = scheduler.CreateObserver<int>();
+
+            var d = new SerialDisposable();
+            d.Disposable = xs.Select(x =>
+            {
+                invoked++;
+                if (scheduler.Clock > 400)
+                    d.Dispose();
+                return x;
+            }).Subscribe(res);
+
+            scheduler.ScheduleAbsolute(Disposed, d.Dispose);
+
+            scheduler.Start();
+
+            res.Messages.AssertEqual(
+                OnNext(100, 1),
+                OnNext(200, 2)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(0, 500)
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void Select_Completed()
+        {
+            var scheduler = new TestScheduler();
+
+            var invoked = 0;
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 1),
+                OnNext(210, 2),
+                OnNext(240, 3),
+                OnNext(290, 4),
+                OnNext(350, 5),
+                OnCompleted<int>(400),
+                OnNext(410, -1),
+                OnCompleted<int>(420),
+                OnError<int>(430, new Exception())
             );
 
             var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Repeat(x, x, scheduler),
-                    ex => Observable.Repeat(0, 2, scheduler),
-                    () => Observable.Repeat(-1, 2, scheduler)
-                ),
-                307
+                xs.Select(x =>
+                {
+                    invoked++;
+                    return x + 1;
+                })
             );
 
             res.Messages.AssertEqual(
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(304, 2),
-                OnNext(305, 4),
-                OnNext(305, 3),
-                OnNext(306, -1),
-                OnNext(306, 4),
-                OnNext(306, 3)
+                OnNext(210, 3),
+                OnNext(240, 4),
+                OnNext(290, 5),
+                OnNext(350, 6),
+                OnCompleted<int>(400)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
+            );
+
+            Assert.AreEqual(4, invoked);
+        }
+
+        [TestMethod]
+        public void Select_NotCompleted()
+        {
+            var scheduler = new TestScheduler();
+
+            var invoked = 0;
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 1),
+                OnNext(210, 2),
+                OnNext(240, 3),
+                OnNext(290, 4),
+                OnNext(350, 5)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select(x =>
+                {
+                    invoked++;
+                    return x + 1;
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 3),
+                OnNext(240, 4),
+                OnNext(290, 5),
+                OnNext(350, 6)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 1000)
             );
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
-            );
-        }
+            Assert.AreEqual(4, invoked);
+        }
+
+        [TestMethod]
+        public void Select_Error()
+        {
+            var scheduler = new TestScheduler();
+
+            var invoked = 0;
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 1),
+                OnNext(210, 2),
+                OnNext(240, 3),
+                OnNext(290, 4),
+                OnNext(350, 5),
+                OnError<int>(400, ex),
+                OnNext(410, -1),
+                OnCompleted<int>(420),
+                OnError<int>(430, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select(x =>
+                {
+                    invoked++;
+                    return x + 1;
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 3),
+                OnNext(240, 4),
+                OnNext(290, 5),
+                OnNext(350, 6),
+                OnError<int>(400, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
+            );
+
+            Assert.AreEqual(4, invoked);
+        }
+
+        [TestMethod]
+        public void Select_SelectorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var invoked = 0;
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 1),
+                OnNext(210, 2),
+                OnNext(240, 3),
+                OnNext(290, 4),
+                OnNext(350, 5),
+                OnCompleted<int>(400),
+                OnNext(410, -1),
+                OnCompleted<int>(420),
+                OnError<int>(430, new Exception())
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.Select(x =>
+                {
+                    invoked++;
+                    if (invoked == 3)
+                        throw ex;
+                    return x + 1;
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 3),
+                OnNext(240, 4),
+                OnError<int>(290, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void SelectWithIndex_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).Select<int, int>(DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Select<int, int>((Func<int, int, int>)null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.Select<int, int>(DummyFunc<int, int, int>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void SelectWithIndex_Throws()
+        {
+            ReactiveAssert.Throws<InvalidOperationException>(() =>
+                Observable.Return(1).Select<int, int>((x, index) => x).Subscribe(
+                 x =>
+                 {
+                     throw new InvalidOperationException();
+                 }));
+            ReactiveAssert.Throws<InvalidOperationException>(() =>
+                Observable.Throw<int>(new Exception()).Select<int, int>((x, index) => x).Subscribe(
+                 x => { },
+                 exception =>
+                 {
+                     throw new InvalidOperationException();
+                 }));
+            ReactiveAssert.Throws<InvalidOperationException>(() =>
+                 Observable.Empty<int>().Select<int, int>((x, index) => x).Subscribe(
+                 x => { },
+                 exception => { },
+                 () =>
+                 {
+                     throw new InvalidOperationException();
+                 }));
+            ReactiveAssert.Throws<InvalidOperationException>(() => Observable.Create<int>(new Func<IObserver<int>, Action>(o => { throw new InvalidOperationException(); })).Select((x, index) => x).Subscribe());
+        }
+
+        [TestMethod]
+        public void SelectWithIndex_DisposeInsideSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(100, 4),
+                OnNext(200, 3),
+                OnNext(500, 2),
+                OnNext(600, 1)
+            );
+
+            var invoked = 0;
+
+            var res = scheduler.CreateObserver<int>();
+
+            var d = new SerialDisposable();
+            d.Disposable = xs.Select((x, index) =>
+            {
+                invoked++;
+                if (scheduler.Clock > 400)
+                    d.Dispose();
+                return x + index * 10;
+            }).Subscribe(res);
+
+            scheduler.ScheduleAbsolute(Disposed, d.Dispose);
+
+            scheduler.Start();
+
+            res.Messages.AssertEqual(
+                OnNext(100, 4),
+                OnNext(200, 13)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(0, 500)
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void SelectWithIndex_Completed()
+        {
+            var scheduler = new TestScheduler();
+
+            var invoked = 0;
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 5),
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1),
+                OnCompleted<int>(400),
+                OnNext(410, -1),
+                OnCompleted<int>(420),
+                OnError<int>(430, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select((x, index) =>
+                {
+                    invoked++;
+                    return (x + 1) + (index * 10);
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 5),
+                OnNext(240, 14),
+                OnNext(290, 23),
+                OnNext(350, 32),
+                OnCompleted<int>(400)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
+            );
+
+            Assert.AreEqual(4, invoked);
+        }
+
+        [TestMethod]
+        public void SelectWithIndex_NotCompleted()
+        {
+            var scheduler = new TestScheduler();
+
+            var invoked = 0;
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 5),
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select((x, index) =>
+                {
+                    invoked++;
+                    return (x + 1) + (index * 10);
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 5),
+                OnNext(240, 14),
+                OnNext(290, 23),
+                OnNext(350, 32)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 1000)
+            );
+
+            Assert.AreEqual(4, invoked);
+        }
+
+        [TestMethod]
+        public void SelectWithIndex_Error()
+        {
+            var scheduler = new TestScheduler();
+
+            var invoked = 0;
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 5),
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1),
+                OnError<int>(400, ex),
+                OnNext(410, -1),
+                OnCompleted<int>(420),
+                OnError<int>(430, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select((x, index) =>
+                {
+                    invoked++;
+                    return (x + 1) + (index * 10);
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 5),
+                OnNext(240, 14),
+                OnNext(290, 23),
+                OnNext(350, 32),
+                OnError<int>(400, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
+            );
+
+            Assert.AreEqual(4, invoked);
+        }
+
+        [TestMethod]
+        public void SelectWithIndex_SelectorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var invoked = 0;
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 5),
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1),
+                OnCompleted<int>(400),
+                OnNext(410, -1),
+                OnCompleted<int>(420),
+                OnError<int>(430, new Exception())
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.Select((x, index) =>
+                {
+                    invoked++;
+                    if (invoked == 3)
+                        throw ex;
+                    return (x + 1) + (index * 10);
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 5),
+                OnNext(240, 14),
+                OnError<int>(290, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void Select_Select1()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 5),
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1),
+                OnCompleted<int>(400)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select(x => x + 1).Select(x => x - 2)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4 + 1 - 2),
+                OnNext(240, 3 + 1 - 2),
+                OnNext(290, 2 + 1 - 2),
+                OnNext(350, 1 + 1 - 2),
+                OnCompleted<int>(400)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
+            );
+        }
+
+        [TestMethod]
+        public void Select_Select2()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 5),
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1),
+                OnCompleted<int>(400)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select((x, i) => x + i).Select(x => x - 2)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4 + 0 - 2),
+                OnNext(240, 3 + 1 - 2),
+                OnNext(290, 2 + 2 - 2),
+                OnNext(350, 1 + 3 - 2),
+                OnCompleted<int>(400)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
+            );
+        }
+
+        [TestMethod]
+        public void Select_Select3()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 5),
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1),
+                OnCompleted<int>(400)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select(x => x + 1).Select((x, i) => x - i)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4 + 1 - 0),
+                OnNext(240, 3 + 1 - 1),
+                OnNext(290, 2 + 1 - 2),
+                OnNext(350, 1 + 1 - 3),
+                OnCompleted<int>(400)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
+            );
+        }
+
+        [TestMethod]
+        public void Select_Select4()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(180, 5),
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1),
+                OnCompleted<int>(400)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.Select((x, i) => x + i).Select((x, i) => x - i)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(240, 3),
+                OnNext(290, 2),
+                OnNext(350, 1),
+                OnCompleted<int>(400)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 400)
+            );
+        }
+
+        #endregion
+
+        #region + SelectMany +
+
+        [TestMethod]
+        public void SelectMany_Then_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany(DummyObservable<string>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(((IObservable<string>)null)));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyObservable<string>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void SelectMany_Then_Complete_Complete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateColdObservable(
+                OnNext(100, 4),
+                OnNext(200, 2),
+                OnNext(300, 3),
+                OnNext(400, 1),
+                OnCompleted<int>(500)
+            );
+
+            var ys = scheduler.CreateColdObservable(
+                OnNext(50, "foo"),
+                OnNext(100, "bar"),
+                OnNext(150, "baz"),
+                OnNext(200, "qux"),
+                OnCompleted<string>(250)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(ys)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(350, "foo"),
+                OnNext(400, "bar"),
+                OnNext(450, "baz"),
+                OnNext(450, "foo"),
+                OnNext(500, "qux"),
+                OnNext(500, "bar"),
+                OnNext(550, "baz"),
+                OnNext(550, "foo"),
+                OnNext(600, "qux"),
+                OnNext(600, "bar"),
+                OnNext(650, "baz"),
+                OnNext(650, "foo"),
+                OnNext(700, "qux"),
+                OnNext(700, "bar"),
+                OnNext(750, "baz"),
+                OnNext(800, "qux"),
+                OnCompleted<string>(850)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 700)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(300, 550),
+                Subscribe(400, 650),
+                Subscribe(500, 750),
+                Subscribe(600, 850)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Then_Complete_Complete_2()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateColdObservable(
+                OnNext(100, 4),
+                OnNext(200, 2),
+                OnNext(300, 3),
+                OnNext(400, 1),
+                OnCompleted<int>(700)
+            );
+
+            var ys = scheduler.CreateColdObservable(
+                OnNext(50, "foo"),
+                OnNext(100, "bar"),
+                OnNext(150, "baz"),
+                OnNext(200, "qux"),
+                OnCompleted<string>(250)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(ys)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(350, "foo"),
+                OnNext(400, "bar"),
+                OnNext(450, "baz"),
+                OnNext(450, "foo"),
+                OnNext(500, "qux"),
+                OnNext(500, "bar"),
+                OnNext(550, "baz"),
+                OnNext(550, "foo"),
+                OnNext(600, "qux"),
+                OnNext(600, "bar"),
+                OnNext(650, "baz"),
+                OnNext(650, "foo"),
+                OnNext(700, "qux"),
+                OnNext(700, "bar"),
+                OnNext(750, "baz"),
+                OnNext(800, "qux"),
+                OnCompleted<string>(900)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(300, 550),
+                Subscribe(400, 650),
+                Subscribe(500, 750),
+                Subscribe(600, 850)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Then_Never_Complete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateColdObservable(
+                OnNext(100, 4),
+                OnNext(200, 2),
+                OnNext(300, 3),
+                OnNext(400, 1),
+                OnNext(500, 5),
+                OnNext(700, 0)
+            );
+
+            var ys = scheduler.CreateColdObservable(
+                OnNext(50, "foo"),
+                OnNext(100, "bar"),
+                OnNext(150, "baz"),
+                OnNext(200, "qux"),
+                OnCompleted<string>(250)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(ys)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(350, "foo"),
+                OnNext(400, "bar"),
+                OnNext(450, "baz"),
+                OnNext(450, "foo"),
+                OnNext(500, "qux"),
+                OnNext(500, "bar"),
+                OnNext(550, "baz"),
+                OnNext(550, "foo"),
+                OnNext(600, "qux"),
+                OnNext(600, "bar"),
+                OnNext(650, "baz"),
+                OnNext(650, "foo"),
+                OnNext(700, "qux"),
+                OnNext(700, "bar"),
+                OnNext(750, "baz"),
+                OnNext(750, "foo"),
+                OnNext(800, "qux"),
+                OnNext(800, "bar"),
+                OnNext(850, "baz"),
+                OnNext(900, "qux"),
+                OnNext(950, "foo")
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 1000)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(300, 550),
+                Subscribe(400, 650),
+                Subscribe(500, 750),
+                Subscribe(600, 850),
+                Subscribe(700, 950),
+                Subscribe(900, 1000)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Then_Complete_Never()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateColdObservable(
+                OnNext(100, 4),
+                OnNext(200, 2),
+                OnNext(300, 3),
+                OnNext(400, 1),
+                OnCompleted<int>(500)
+            );
+
+            var ys = scheduler.CreateColdObservable(
+                OnNext(50, "foo"),
+                OnNext(100, "bar"),
+                OnNext(150, "baz"),
+                OnNext(200, "qux")
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(ys)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(350, "foo"),
+                OnNext(400, "bar"),
+                OnNext(450, "baz"),
+                OnNext(450, "foo"),
+                OnNext(500, "qux"),
+                OnNext(500, "bar"),
+                OnNext(550, "baz"),
+                OnNext(550, "foo"),
+                OnNext(600, "qux"),
+                OnNext(600, "bar"),
+                OnNext(650, "baz"),
+                OnNext(650, "foo"),
+                OnNext(700, "qux"),
+                OnNext(700, "bar"),
+                OnNext(750, "baz"),
+                OnNext(800, "qux")
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 700)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(300, 1000),
+                Subscribe(400, 1000),
+                Subscribe(500, 1000),
+                Subscribe(600, 1000)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Then_Complete_Error()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateColdObservable(
+                OnNext(100, 4),
+                OnNext(200, 2),
+                OnNext(300, 3),
+                OnNext(400, 1),
+                OnCompleted<int>(500)
+            );
+
+            var ys = scheduler.CreateColdObservable(
+                OnNext(50, "foo"),
+                OnNext(100, "bar"),
+                OnNext(150, "baz"),
+                OnNext(200, "qux"),
+                OnError<string>(300, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(ys)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(350, "foo"),
+                OnNext(400, "bar"),
+                OnNext(450, "baz"),
+                OnNext(450, "foo"),
+                OnNext(500, "qux"),
+                OnNext(500, "bar"),
+                OnNext(550, "baz"),
+                OnNext(550, "foo"),
+                OnError<string>(600, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(300, 600),
+                Subscribe(400, 600),
+                Subscribe(500, 600),
+                Subscribe(600, 600)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Then_Error_Complete()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateColdObservable(
+                OnNext(100, 4),
+                OnNext(200, 2),
+                OnNext(300, 3),
+                OnNext(400, 1),
+                OnError<int>(500, ex)
+            );
+
+            var ys = scheduler.CreateColdObservable(
+                OnNext(50, "foo"),
+                OnNext(100, "bar"),
+                OnNext(150, "baz"),
+                OnNext(200, "qux"),
+                OnCompleted<string>(250)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(ys)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(350, "foo"),
+                OnNext(400, "bar"),
+                OnNext(450, "baz"),
+                OnNext(450, "foo"),
+                OnNext(500, "qux"),
+                OnNext(500, "bar"),
+                OnNext(550, "baz"),
+                OnNext(550, "foo"),
+                OnNext(600, "qux"),
+                OnNext(600, "bar"),
+                OnNext(650, "baz"),
+                OnNext(650, "foo"),
+                OnError<string>(700, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 700)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(300, 550),
+                Subscribe(400, 650),
+                Subscribe(500, 700),
+                Subscribe(600, 700)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Then_Error_Error()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateColdObservable(
+                OnNext(100, 4),
+                OnNext(200, 2),
+                OnNext(300, 3),
+                OnNext(400, 1),
+                OnError<int>(500, new Exception())
+            );
+
+            var ys = scheduler.CreateColdObservable(
+                OnNext(50, "foo"),
+                OnNext(100, "bar"),
+                OnNext(150, "baz"),
+                OnNext(200, "qux"),
+                OnError<string>(250, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(ys)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(350, "foo"),
+                OnNext(400, "bar"),
+                OnNext(450, "baz"),
+                OnNext(450, "foo"),
+                OnNext(500, "qux"),
+                OnNext(500, "bar"),
+                OnError<string>(550, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 550)
+            );
+
+            ys.Subscriptions.AssertEqual(
+                Subscribe(300, 550),
+                Subscribe(400, 550),
+                Subscribe(500, 550)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, IObservable<int>>)null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IObservable<int>>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void SelectMany_Complete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnNext(810, 304),
+                OnNext(860, 305),
+                OnNext(930, 401),
+                OnNext(940, 402),
+                OnCompleted<int>(960)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 960));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 790));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(850, 950));
+        }
+
+        [TestMethod]
+        public void SelectMany_Complete_InnerNotComplete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnNext(810, 304),
+                OnNext(860, 305),
+                OnNext(930, 401),
+                OnNext(940, 402)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 1000));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 960));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 790));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(850, 950));
+        }
+
+        [TestMethod]
+        public void SelectMany_Complete_OuterNotComplete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100)))
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnNext(810, 304),
+                OnNext(860, 305),
+                OnNext(930, 401),
+                OnNext(940, 402)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 1000));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 960));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 790));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(850, 950));
+        }
+
+        [TestMethod]
+        public void SelectMany_Error_Outer()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnError<ITestableObservable<int>>(900, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnNext(810, 304),
+                OnNext(860, 305),
+                OnError<int>(900, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 900));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 790));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(850, 900));
+        }
+
+        [TestMethod]
+        public void SelectMany_Error_Inner()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnError<int>(460, ex))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnError<int>(760, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 760));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 760));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 760));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => x),
+                700
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 700));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 700));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 700));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+            );
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Throw()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var invoked = 0;
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x =>
+                {
+                    invoked++;
+                    if (invoked == 3)
+                        throw ex;
+                    return x;
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnError<int>(550, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 550));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 550));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 550));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+            );
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+            );
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void SelectMany_UseFunction()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 4),
+                OnNext(220, 3),
+                OnNext(250, 5),
+                OnNext(270, 1),
+                OnCompleted<int>(290)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => Observable.Interval(TimeSpan.FromTicks(10), scheduler).Select(_ => x).Take(x))
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(220, 4),
+                OnNext(230, 3),
+                OnNext(230, 4),
+                OnNext(240, 3),
+                OnNext(240, 4),
+                OnNext(250, 3),
+                OnNext(250, 4),
+                OnNext(260, 5),
+                OnNext(270, 5),
+                OnNext(280, 1),
+                OnNext(280, 5),
+                OnNext(290, 5),
+                OnNext(300, 5),
+                OnCompleted<int>(300)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, int, IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, int, IObservable<int>>)null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, int, IObservable<int>>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Index()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 4),
+                OnNext(220, 3),
+                OnNext(250, 5),
+                OnNext(270, 1),
+                OnCompleted<int>(290)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, i) => Observable.Return(new { x, i }))
+            );
+
+            var witness = new { x = 0, i = 0 };
+
+            res.Messages.AssertEqual(
+                OnNext(210, new { x = 4, i = 0 }),
+                OnNext(220, new { x = 3, i = 1 }),
+                OnNext(250, new { x = 5, i = 2 }),
+                OnNext(270, new { x = 1, i = 3 }),
+                OnCompleted(290, witness)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Complete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnNext(810, 304),
+                OnNext(860, 305),
+                OnNext(930, 401),
+                OnNext(940, 402),
+                OnCompleted<int>(960)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 960));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 790));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(850, 950));
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Complete_InnerNotComplete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnNext(810, 304),
+                OnNext(860, 305),
+                OnNext(930, 401),
+                OnNext(940, 402)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 1000));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 960));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 790));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(850, 950));
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Complete_OuterNotComplete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100)))
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnNext(810, 304),
+                OnNext(860, 305),
+                OnNext(930, 401),
+                OnNext(940, 402)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 1000));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 960));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 790));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(850, 950));
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Error_Outer()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnError<ITestableObservable<int>>(900, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnNext(810, 304),
+                OnNext(860, 305),
+                OnError<int>(900, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 900));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 900));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 790));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(850, 900));
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Error_Inner()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnError<int>(460, ex))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => x)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303),
+                OnNext(740, 106),
+                OnError<int>(760, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 760));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 760));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 760));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(750, 760));
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => x),
+                700
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnNext(560, 301),
+                OnNext(580, 202),
+                OnNext(590, 203),
+                OnNext(600, 302),
+                OnNext(620, 303)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 700));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 700));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 605));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(550, 700));
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+            );
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Throw()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                    OnNext(5, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(105, scheduler.CreateColdObservable(
+                        OnError<int>(1, new InvalidOperationException()))),
+                    OnNext(300, scheduler.CreateColdObservable(
+                        OnNext(10, 102),
+                        OnNext(90, 103),
+                        OnNext(110, 104),
+                        OnNext(190, 105),
+                        OnNext(440, 106),
+                        OnCompleted<int>(460))),
+                    OnNext(400, scheduler.CreateColdObservable(
+                        OnNext(180, 202),
+                        OnNext(190, 203),
+                        OnCompleted<int>(205))),
+                    OnNext(550, scheduler.CreateColdObservable(
+                        OnNext(10, 301),
+                        OnNext(50, 302),
+                        OnNext(70, 303),
+                        OnNext(260, 304),
+                        OnNext(310, 305),
+                        OnCompleted<int>(410))),
+                    OnNext(750, scheduler.CreateColdObservable(
+                        OnCompleted<int>(40))),
+                    OnNext(850, scheduler.CreateColdObservable(
+                        OnNext(80, 401),
+                        OnNext(90, 402),
+                        OnCompleted<int>(100))),
+                    OnCompleted<ITestableObservable<int>>(900)
+            );
+
+            var invoked = 0;
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) =>
+                {
+                    invoked++;
+                    if (invoked == 3)
+                        throw ex;
+                    return x;
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 102),
+                OnNext(390, 103),
+                OnNext(410, 104),
+                OnNext(490, 105),
+                OnError<int>(550, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 550));
+
+            xs.Messages[2].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(300, 550));
+
+            xs.Messages[3].Value.Value.Subscriptions.AssertEqual(
+                Subscribe(400, 550));
+
+            xs.Messages[4].Value.Value.Subscriptions.AssertEqual(
+            );
+
+            xs.Messages[5].Value.Value.Subscriptions.AssertEqual(
+            );
+
+            xs.Messages[6].Value.Value.Subscriptions.AssertEqual(
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_UseFunction()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 4),
+                OnNext(220, 3),
+                OnNext(250, 5),
+                OnNext(270, 1),
+                OnCompleted<int>(290)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Observable.Interval(TimeSpan.FromTicks(10), scheduler).Select(__ => x).Take(x))
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(220, 4),
+                OnNext(230, 3),
+                OnNext(230, 4),
+                OnNext(240, 3),
+                OnNext(240, 4),
+                OnNext(250, 3),
+                OnNext(250, 4),
+                OnNext(260, 5),
+                OnNext(270, 5),
+                OnNext(280, 1),
+                OnNext(280, 5),
+                OnNext(290, 5),
+                OnNext(300, 5),
+                OnCompleted<int>(300)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, IEnumerable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, IEnumerable<int>>)null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IEnumerable<int>>.Instance).Subscribe(null));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, IEnumerable<int>>.Instance, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, IEnumerable<int>>)null, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IEnumerable<int>>.Instance, (Func<int, int, int>)null));
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_Complete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var inners = new List<MockEnumerable<int>>();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x =>
+                {
+                    var ys = new MockEnumerable<int>(scheduler, Enumerable.Repeat(x, x));
+                    inners.Add(ys);
+                    return ys;
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 2),
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(420, 3),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+
+            Assert.AreEqual(4, inners.Count);
+
+            inners[0].Subscriptions.AssertEqual(
+                Subscribe(210, 210)
+            );
+
+            inners[1].Subscriptions.AssertEqual(
+                Subscribe(340, 340)
+            );
+
+            inners[2].Subscriptions.AssertEqual(
+                Subscribe(420, 420)
+            );
+
+            inners[3].Subscriptions.AssertEqual(
+                Subscribe(510, 510)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_Complete_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => Enumerable.Repeat(x, x), (x, y) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(420, 6),
+                OnNext(420, 6),
+                OnNext(420, 6),
+                OnNext(510, 4),
+                OnNext(510, 4),
+                OnCompleted<int>(600)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_Error()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnError<int>(600, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => Enumerable.Repeat(x, x))
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 2),
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(420, 3),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnNext(510, 2),
+                OnError<int>(600, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_Error_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnError<int>(600, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => Enumerable.Repeat(x, x), (x, y) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(420, 6),
+                OnNext(420, 6),
+                OnNext(420, 6),
+                OnNext(510, 4),
+                OnNext(510, 4),
+                OnError<int>(600, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => Enumerable.Repeat(x, x)),
+                350
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 2),
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 350)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_Dispose_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => Enumerable.Repeat(x, x), (x, y) => x + y),
+                350
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 350)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_SelectorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var invoked = 0;
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x =>
+                {
+                    invoked++;
+                    if (invoked == 3)
+                        throw ex;
+
+                    return Enumerable.Repeat(x, x);
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 2),
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnError<int>(420, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_ResultSelectorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var inners = new List<MockEnumerable<int>>();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x =>
+                    {
+                        var ys = new MockEnumerable<int>(scheduler, Enumerable.Repeat(x, x));
+                        inners.Add(ys);
+                        return ys;
+                    },
+                    (x, y) =>
+                    {
+                        if (x == 3)
+                            throw ex;
+
+                        return x + y;
+                    }
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnError<int>(420, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
+            );
+
+            Assert.AreEqual(3, inners.Count);
+
+            inners[0].Subscriptions.AssertEqual(
+                Subscribe(210, 210)
+            );
+
+            inners[1].Subscriptions.AssertEqual(
+                Subscribe(340, 340)
+            );
+
+            inners[2].Subscriptions.AssertEqual(
+                Subscribe(420, 420)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_ResultSelector_GetEnumeratorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => new RogueEnumerable<int>(ex), (x, y) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_SelectorThrows_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var invoked = 0;
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x =>
+                    {
+                        invoked++;
+                        if (invoked == 3)
+                            throw ex;
+
+                        return Enumerable.Repeat(x, x);
+                    },
+                    (x, y) => x + y
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnError<int>(420, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        class CurrentThrowsEnumerable<T> : IEnumerable<T>
+        {
+            IEnumerable<T> e;
+            Exception ex;
+
+            public CurrentThrowsEnumerable(IEnumerable<T> e, Exception ex)
+            {
+                this.e = e;
+                this.ex = ex;
+            }
+
+            public IEnumerator<T> GetEnumerator()
+            {
+                return new Enumerator(e.GetEnumerator(), ex);
+            }
+
+            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+            {
+                return GetEnumerator();
+            }
+
+            class Enumerator : IEnumerator<T>
+            {
+                IEnumerator<T> e;
+                Exception ex;
+
+                public Enumerator(IEnumerator<T> e, Exception ex)
+                {
+                    this.e = e;
+                    this.ex = ex;
+                }
+
+                public T Current
+                {
+                    get { throw ex; }
+                }
+
+                public void Dispose()
+                {
+                    e.Dispose();
+                }
+
+                object System.Collections.IEnumerator.Current
+                {
+                    get { return Current; }
+                }
+
+                public bool MoveNext()
+                {
+                    return e.MoveNext();
+                }
+
+                public void Reset()
+                {
+                    e.Reset();
+                }
+            }
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_CurrentThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => new CurrentThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex))
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_CurrentThrows_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => new CurrentThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex), (x, y) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        class MoveNextThrowsEnumerable<T> : IEnumerable<T>
+        {
+            IEnumerable<T> e;
+            Exception ex;
+
+            public MoveNextThrowsEnumerable(IEnumerable<T> e, Exception ex)
+            {
+                this.e = e;
+                this.ex = ex;
+            }
+
+            public IEnumerator<T> GetEnumerator()
+            {
+                return new Enumerator(e.GetEnumerator(), ex);
+            }
+
+            System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+            {
+                return GetEnumerator();
+            }
+
+            class Enumerator : IEnumerator<T>
+            {
+                IEnumerator<T> e;
+                Exception ex;
+
+                public Enumerator(IEnumerator<T> e, Exception ex)
+                {
+                    this.e = e;
+                    this.ex = ex;
+                }
+
+                public T Current
+                {
+                    get { return e.Current; }
+                }
+
+                public void Dispose()
+                {
+                    e.Dispose();
+                }
+
+                object System.Collections.IEnumerator.Current
+                {
+                    get { return Current; }
+                }
+
+                public bool MoveNext()
+                {
+                    throw ex;
+                }
+
+                public void Reset()
+                {
+                    e.Reset();
+                }
+            }
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_GetEnumeratorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => new RogueEnumerable<int>(ex))
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_MoveNextThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => new MoveNextThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex))
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Enumerable_MoveNextThrows_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(x => new MoveNextThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex), (x, y) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, int, IEnumerable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, int, IEnumerable<int>>)null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, int, IEnumerable<int>>.Instance).Subscribe(null));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, int, IEnumerable<int>>.Instance, DummyFunc<int, int, int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, int, IEnumerable<int>>)null, DummyFunc<int, int, int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, int, IEnumerable<int>>.Instance, (Func<int, int, int, int, int>)null));
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_Index()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 4),
+                OnNext(220, 3),
+                OnNext(250, 5),
+                OnNext(270, 1),
+                OnCompleted<int>(290)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, i) => new[] { new { x, i } })
+            );
+
+            var witness = new { x = 0, i = 0 };
+
+            res.Messages.AssertEqual(
+                OnNext(210, new { x = 4, i = 0 }),
+                OnNext(220, new { x = 3, i = 1 }),
+                OnNext(250, new { x = 5, i = 2 }),
+                OnNext(270, new { x = 1, i = 3 }),
+                OnCompleted(290, witness)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_ResultSelector_Index()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 4),
+                OnNext(220, 3),
+                OnNext(250, 5),
+                OnNext(270, 1),
+                OnCompleted<int>(290)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, i) => Enumerable.Range(10, i + 1), (x, i, y, j) => new { x, i, y, j })
+            );
+
+            var witness = new { x = 0, i = 0, y = 0, j = 0 };
+
+            res.Messages.AssertEqual(
+                OnNext(210, new { x = 4, i = 0, y = 10, j = 0 }),
+                OnNext(220, new { x = 3, i = 1, y = 10, j = 0 }),
+                OnNext(220, new { x = 3, i = 1, y = 11, j = 1 }),
+                OnNext(250, new { x = 5, i = 2, y = 10, j = 0 }),
+                OnNext(250, new { x = 5, i = 2, y = 11, j = 1 }),
+                OnNext(250, new { x = 5, i = 2, y = 12, j = 2 }),
+                OnNext(270, new { x = 1, i = 3, y = 10, j = 0 }),
+                OnNext(270, new { x = 1, i = 3, y = 11, j = 1 }),
+                OnNext(270, new { x = 1, i = 3, y = 12, j = 2 }),
+                OnNext(270, new { x = 1, i = 3, y = 13, j = 3 }),
+                OnCompleted(290, witness)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_Complete()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var inners = new List<MockEnumerable<int>>();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) =>
+                {
+                    var ys = new MockEnumerable<int>(scheduler, Enumerable.Repeat(x, x));
+                    inners.Add(ys);
+                    return ys;
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 2),
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(420, 3),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+
+            Assert.AreEqual(4, inners.Count);
+
+            inners[0].Subscriptions.AssertEqual(
+                Subscribe(210, 210)
+            );
+
+            inners[1].Subscriptions.AssertEqual(
+                Subscribe(340, 340)
+            );
+
+            inners[2].Subscriptions.AssertEqual(
+                Subscribe(420, 420)
+            );
+
+            inners[3].Subscriptions.AssertEqual(
+                Subscribe(510, 510)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_Complete_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Enumerable.Repeat(x, x), (x, _, y, __) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(420, 6),
+                OnNext(420, 6),
+                OnNext(420, 6),
+                OnNext(510, 4),
+                OnNext(510, 4),
+                OnCompleted<int>(600)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_Error()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnError<int>(600, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Enumerable.Repeat(x, x))
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 2),
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(420, 3),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnNext(510, 2),
+                OnError<int>(600, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_Error_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnError<int>(600, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Enumerable.Repeat(x, x), (x, _, y, __) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(420, 6),
+                OnNext(420, 6),
+                OnNext(420, 6),
+                OnNext(510, 4),
+                OnNext(510, 4),
+                OnError<int>(600, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 600)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Enumerable.Repeat(x, x)),
+                350
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 2),
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 350)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_Dispose_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Enumerable.Repeat(x, x), (x, _, y, __) => x + y),
+                350
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 350)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_SelectorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var invoked = 0;
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) =>
+                {
+                    invoked++;
+                    if (invoked == 3)
+                        throw ex;
+
+                    return Enumerable.Repeat(x, x);
+                })
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 2),
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnNext(340, 4),
+                OnError<int>(420, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_ResultSelectorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var inners = new List<MockEnumerable<int>>();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) =>
+                    {
+                        var ys = new MockEnumerable<int>(scheduler, Enumerable.Repeat(x, x));
+                        inners.Add(ys);
+                        return ys;
+                    },
+                    (x, _, y, __) =>
+                    {
+                        if (x == 3)
+                            throw ex;
+
+                        return x + y;
+                    }
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnError<int>(420, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
+            );
+
+            Assert.AreEqual(3, inners.Count);
+
+            inners[0].Subscriptions.AssertEqual(
+                Subscribe(210, 210)
+            );
+
+            inners[1].Subscriptions.AssertEqual(
+                Subscribe(340, 340)
+            );
+
+            inners[2].Subscriptions.AssertEqual(
+                Subscribe(420, 420)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_ResultSelector_GetEnumeratorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => new RogueEnumerable<int>(ex), (x, _, y, __) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_SelectorThrows_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var invoked = 0;
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) =>
+                    {
+                        invoked++;
+                        if (invoked == 3)
+                            throw ex;
+
+                        return Enumerable.Repeat(x, x);
+                    },
+                    (x, _, y, __) => x + y
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(210, 4),
+                OnNext(210, 4),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnNext(340, 8),
+                OnError<int>(420, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 420)
+            );
+
+            Assert.AreEqual(3, invoked);
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_CurrentThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => new CurrentThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex))
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_CurrentThrows_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => new CurrentThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex), (x, _, y, __) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_GetEnumeratorThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => new RogueEnumerable<int>(ex))
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_MoveNextThrows()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => new MoveNextThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex))
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Enumerable_MoveNextThrows_ResultSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 2),
+                OnNext(340, 4),
+                OnNext(420, 3),
+                OnNext(510, 2),
+                OnCompleted<int>(600)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => new MoveNextThrowsEnumerable<int>(Enumerable.Repeat(x, x), ex), (x, _, y, __) => x + y)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(210, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 210)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_QueryOperator_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, IObservable<int>>)null, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IObservable<int>>.Instance, ((Func<int, int, int>)null)));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, IObservable<int>>.Instance, DummyFunc<int, int, int>.Instance).Subscribe(null));
+
+#if !NO_TPL
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, Task<int>>.Instance, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, Task<int>>)null, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, Task<int>>.Instance, ((Func<int, int, int>)null)));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, CancellationToken, Task<int>>.Instance, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, CancellationToken, Task<int>>)null, DummyFunc<int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, CancellationToken, Task<int>>.Instance, ((Func<int, int, int>)null)));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, Task<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, Task<int>>)null));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, CancellationToken, Task<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, CancellationToken, Task<int>>)null));
+#endif
+        }
+
+        [TestMethod]
+        public void SelectMany_QueryOperator_CompleteOuterFirst()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var res = scheduler.Start(() =>
+                from x in xs
+                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
+                select x * 10 + (int)y
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41),
+                OnNext(223, 20),
+                OnNext(223, 31),
+                OnNext(223, 42),
+                OnNext(224, 50),
+                OnNext(224, 21),
+                OnNext(224, 32),
+                OnNext(224, 43),
+                OnNext(225, 51),
+                OnNext(226, 52),
+                OnNext(227, 53),
+                OnNext(228, 54),
+                OnCompleted<int>(228)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 224)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_QueryOperator_CompleteInnerFirst()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(300)
+            );
+
+            var res = scheduler.Start(() =>
+                from x in xs
+                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
+                select x * 10 + (int)y
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41),
+                OnNext(223, 20),
+                OnNext(223, 31),
+                OnNext(223, 42),
+                OnNext(224, 50),
+                OnNext(224, 21),
+                OnNext(224, 32),
+                OnNext(224, 43),
+                OnNext(225, 51),
+                OnNext(226, 52),
+                OnNext(227, 53),
+                OnNext(228, 54),
+                OnCompleted<int>(300)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 300)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_QueryOperator_ErrorOuter()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnError<int>(224, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                from x in xs
+                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
+                select x * 10 + (int)y
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41),
+                OnNext(223, 20),
+                OnNext(223, 31),
+                OnNext(223, 42),
+                OnError<int>(224, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 224)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_QueryOperator_ErrorInner()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                from x in xs
+                from y in x == 2 ? Observable.Throw<long>(ex, scheduler)
+                                 : Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
+                select x * 10 + (int)y
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41),
+                OnError<int>(223, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 223)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_QueryOperator_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var res = scheduler.Start(() =>
+                from x in xs
+                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
+                select x * 10 + (int)y,
+                223
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 223)
+            );
+        }
+
+        static T Throw<T>(Exception ex)
+        {
+            throw ex;
+        }
+
+
+        [TestMethod]
+        public void SelectMany_QueryOperator_ThrowSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                from x in xs
+                from y in Throw<IObservable<long>>(ex)
+                select x * 10 + (int)y
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(220, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 220)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_QueryOperator_ThrowResult()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                from x in xs
+                from y in Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x)
+                select Throw<int>(ex)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(221, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 221)
+            );
+        }
+        
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, int, IObservable<int>>.Instance, DummyFunc<int, int, int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, int, IObservable<int>>)null, DummyFunc<int, int, int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, int, IObservable<int>>.Instance, ((Func<int, int, int, int, int>)null)));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, int, IObservable<int>>.Instance, DummyFunc<int, int, int, int, int>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_Index()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(210, 4),
+                OnNext(220, 3),
+                OnNext(250, 5),
+                OnNext(270, 1),
+                OnCompleted<int>(290)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, i) => Observable.Range(10, i + 1), (x, i, y, j) => new { x, i, y, j })
+            );
+
+            var witness = new { x = 0, i = 0, y = 0, j = 0 };
+
+            res.Messages.AssertEqual(
+                OnNext(210, new { x = 4, i = 0, y = 10, j = 0 }),
+                OnNext(220, new { x = 3, i = 1, y = 10, j = 0 }),
+                OnNext(220, new { x = 3, i = 1, y = 11, j = 1 }),
+                OnNext(250, new { x = 5, i = 2, y = 10, j = 0 }),
+                OnNext(250, new { x = 5, i = 2, y = 11, j = 1 }),
+                OnNext(250, new { x = 5, i = 2, y = 12, j = 2 }),
+                OnNext(270, new { x = 1, i = 3, y = 10, j = 0 }),
+                OnNext(270, new { x = 1, i = 3, y = 11, j = 1 }),
+                OnNext(270, new { x = 1, i = 3, y = 12, j = 2 }),
+                OnNext(270, new { x = 1, i = 3, y = 13, j = 3 }),
+                OnCompleted(290, witness)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 290)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_CompleteOuterFirst()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x), (x, _, y, __) => x * 10 + (int)y)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41),
+                OnNext(223, 20),
+                OnNext(223, 31),
+                OnNext(223, 42),
+                OnNext(224, 50),
+                OnNext(224, 21),
+                OnNext(224, 32),
+                OnNext(224, 43),
+                OnNext(225, 51),
+                OnNext(226, 52),
+                OnNext(227, 53),
+                OnNext(228, 54),
+                OnCompleted<int>(228)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 224)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_CompleteInnerFirst()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(300)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x), (x, _, y, __) => x * 10 + (int)y)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41),
+                OnNext(223, 20),
+                OnNext(223, 31),
+                OnNext(223, 42),
+                OnNext(224, 50),
+                OnNext(224, 21),
+                OnNext(224, 32),
+                OnNext(224, 43),
+                OnNext(225, 51),
+                OnNext(226, 52),
+                OnNext(227, 53),
+                OnNext(228, 54),
+                OnCompleted<int>(300)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 300)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_ErrorOuter()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnError<int>(224, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x), (x, _, y, __) => x * 10 + (int)y)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41),
+                OnNext(223, 20),
+                OnNext(223, 31),
+                OnNext(223, 42),
+                OnError<int>(224, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 224)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_ErrorInner()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => x == 2
+                            ? Observable.Throw<long>(ex, scheduler)
+                            : Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x),
+                    (x, _, y, __) => x * 10 + (int)y)
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41),
+                OnError<int>(223, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 223)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x), (x, _, y, __) => x * 10 + (int)y),
+                223
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(221, 40),
+                OnNext(222, 30),
+                OnNext(222, 41)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 223)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_ThrowSelector()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Throw<IObservable<long>>(ex), (x, _, y, __) => x * 10 + (int)y)
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(220, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 220)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_QueryOperator_ThrowResult()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(220, 4),
+                OnNext(221, 3),
+                OnNext(222, 2),
+                OnNext(223, 5),
+                OnCompleted<int>(224)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany((x, _) => Observable.Interval(TimeSpan.FromTicks(1), scheduler).Take(x), (x, _, y, __) => Throw<int>(ex))
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(221, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 221)
+            );
+        }
+
+
+        [TestMethod]
+        public void SelectMany_Triple_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(null, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, (Func<int, IObservable<int>>)null, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, null, DummyFunc<IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_Identity()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Return(x, scheduler),
+                    ex => Observable.Throw<int>(ex, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnCompleted<int>(306)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_InnersWithTiming1()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var ysn = scheduler.CreateColdObservable(
+                OnNext(10, 10),
+                OnNext(20, 11),
+                OnNext(30, 12),
+                OnCompleted<int>(40)
+            );
+
+            var yse = scheduler.CreateColdObservable(
+                OnNext(0, 99),
+                OnCompleted<int>(10)
+            );
+
+            var ysc = scheduler.CreateColdObservable(
+                OnNext(10, 42),
+                OnCompleted<int>(20)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => ysn,
+                    ex => yse,
+                    () => ysc
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 10),
+                OnNext(311, 10),
+                OnNext(312, 10),
+                OnNext(313, 10),
+                OnNext(314, 10),
+                OnNext(315, 42),
+                OnNext(320, 11),
+                OnNext(321, 11),
+                OnNext(322, 11),
+                OnNext(323, 11),
+                OnNext(324, 11),
+                OnNext(330, 12),
+                OnNext(331, 12),
+                OnNext(332, 12),
+                OnNext(333, 12),
+                OnNext(334, 12),
+                OnCompleted<int>(344)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+
+            ysn.Subscriptions.AssertEqual(
+                Subscribe(300, 340),
+                Subscribe(301, 341),
+                Subscribe(302, 342),
+                Subscribe(303, 343),
+                Subscribe(304, 344)
+            );
+
+            yse.Subscriptions.AssertEqual(
+            );
+
+            ysc.Subscriptions.AssertEqual(
+                Subscribe(305, 325)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_InnersWithTiming2()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var ysn = scheduler.CreateColdObservable(
+                OnNext(10, 10),
+                OnNext(20, 11),
+                OnNext(30, 12),
+                OnCompleted<int>(40)
+            );
+
+            var yse = scheduler.CreateColdObservable(
+                OnNext(0, 99),
+                OnCompleted<int>(10)
+            );
+
+            var ysc = scheduler.CreateColdObservable(
+                OnNext(10, 42),
+                OnCompleted<int>(50)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => ysn,
+                    ex => yse,
+                    () => ysc
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 10),
+                OnNext(311, 10),
+                OnNext(312, 10),
+                OnNext(313, 10),
+                OnNext(314, 10),
+                OnNext(315, 42),
+                OnNext(320, 11),
+                OnNext(321, 11),
+                OnNext(322, 11),
+                OnNext(323, 11),
+                OnNext(324, 11),
+                OnNext(330, 12),
+                OnNext(331, 12),
+                OnNext(332, 12),
+                OnNext(333, 12),
+                OnNext(334, 12),
+                OnCompleted<int>(355)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+
+            ysn.Subscriptions.AssertEqual(
+                Subscribe(300, 340),
+                Subscribe(301, 341),
+                Subscribe(302, 342),
+                Subscribe(303, 343),
+                Subscribe(304, 344)
+            );
+
+            yse.Subscriptions.AssertEqual(
+            );
+
+            ysc.Subscriptions.AssertEqual(
+                Subscribe(305, 355)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_InnersWithTiming3()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(400, 1),
+                OnNext(500, 2),
+                OnNext(600, 3),
+                OnNext(700, 4),
+                OnCompleted<int>(800)
+            );
+
+            var ysn = scheduler.CreateColdObservable(
+                OnNext(10, 10),
+                OnNext(20, 11),
+                OnNext(30, 12),
+                OnCompleted<int>(40)
+            );
+
+            var yse = scheduler.CreateColdObservable(
+                OnNext(0, 99),
+                OnCompleted<int>(10)
+            );
+
+            var ysc = scheduler.CreateColdObservable(
+                OnNext(10, 42),
+                OnCompleted<int>(100)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => ysn,
+                    ex => yse,
+                    () => ysc
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 10),
+                OnNext(320, 11),
+                OnNext(330, 12),
+                OnNext(410, 10),
+                OnNext(420, 11),
+                OnNext(430, 12),
+                OnNext(510, 10),
+                OnNext(520, 11),
+                OnNext(530, 12),
+                OnNext(610, 10),
+                OnNext(620, 11),
+                OnNext(630, 12),
+                OnNext(710, 10),
+                OnNext(720, 11),
+                OnNext(730, 12),
+                OnNext(810, 42),
+                OnCompleted<int>(900)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 800)
+            );
+
+            ysn.Subscriptions.AssertEqual(
+                Subscribe(300, 340),
+                Subscribe(400, 440),
+                Subscribe(500, 540),
+                Subscribe(600, 640),
+                Subscribe(700, 740)
+            );
+
+            yse.Subscriptions.AssertEqual(
+            );
+
+            ysc.Subscriptions.AssertEqual(
+                Subscribe(800, 900)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_Error_Identity()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnError<int>(305, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Return(x, scheduler),
+                    ex1 => Observable.Throw<int>(ex1, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnError<int>(306, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_SelectMany()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Throw<int>(ex, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnNext(305, 4),
+                OnNext(305, 3),
+                OnNext(306, 4),
+                OnNext(306, 3),
+                OnNext(307, 4),
+                OnNext(308, 4),
+                OnCompleted<int>(308)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+
+        [TestMethod]
+        public void SelectMany_Triple_Concat()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Return(x, scheduler),
+                    ex => Observable.Throw<int>(ex, scheduler),
+                    () => Observable.Range(1, 3, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnNext(306, 1),
+                OnNext(307, 2),
+                OnNext(308, 3),
+                OnCompleted<int>(309)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_Catch()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Return(x, scheduler),
+                    ex => Observable.Range(1, 3, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnCompleted<int>(306)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_Error_Catch()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnError<int>(305, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Return(x, scheduler),
+                    ex => Observable.Range(1, 3, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnNext(306, 1),
+                OnNext(307, 2),
+                OnNext(308, 3),
+                OnCompleted<int>(309)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_All()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnNext(305, 4),
+                OnNext(305, 3),
+                OnNext(306, -1),
+                OnNext(306, 4),
+                OnNext(306, 3),
+                OnNext(307, -1),
+                OnNext(307, 4),
+                OnNext(308, 4),
+                OnCompleted<int>(308)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_Error_All()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnError<int>(305, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnNext(305, 4),
+                OnNext(305, 3),
+                OnNext(306, 0),
+                OnNext(306, 4),
+                OnNext(306, 3),
+                OnNext(307, 0),
+                OnNext(307, 4),
+                OnNext(308, 4),
+                OnCompleted<int>(308)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_All_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                ),
+                307
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnNext(305, 4),
+                OnNext(305, 3),
+                OnNext(306, -1),
+                OnNext(306, 4),
+                OnNext(306, 3)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_All_Dispose_Before_First()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                ),
+                304
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 304)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_OnNextThrow()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Throw<IObservable<int>>(ex),
+                    ex1 => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(300, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 300)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_OnErrorThrow()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnError<int>(305, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Repeat(x, x, scheduler),
+                    ex1 => Throw<IObservable<int>>(ex),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnError<int>(305, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectMany_Triple_OnCompletedThrow()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    x => Observable.Repeat(x, x, scheduler),
+                    ex1 => Observable.Repeat(0, 2, scheduler),
+                    () => Throw<IObservable<int>>(ex)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnError<int>(305, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_ArgumentChecking()
+        {
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(null, DummyFunc<int, int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, (Func<int, int, IObservable<int>>)null, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, int, IObservable<int>>.Instance, null, DummyFunc<IObservable<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, null));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, DummyFunc<int, int, IObservable<int>>.Instance, DummyFunc<Exception, IObservable<int>>.Instance, DummyFunc<IObservable<int>>.Instance).Subscribe(null));
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_Index()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var witness = new { x = 0, i = 0 };
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, i) => Observable.Return(new { x, i }, scheduler),
+                    ex => Observable.Throw(ex, scheduler, witness),
+                    () => Observable.Empty(scheduler, witness)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, new { x = 0, i = 0 }),
+                OnNext(302, new { x = 1, i = 1 }),
+                OnNext(303, new { x = 2, i = 2 }),
+                OnNext(304, new { x = 3, i = 3 }),
+                OnNext(305, new { x = 4, i = 4 }),
+                OnCompleted(306, witness)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_Identity()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Return(x, scheduler),
+                    ex => Observable.Throw<int>(ex, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnCompleted<int>(306)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_InnersWithTiming1()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var ysn = scheduler.CreateColdObservable(
+                OnNext(10, 10),
+                OnNext(20, 11),
+                OnNext(30, 12),
+                OnCompleted<int>(40)
+            );
+
+            var yse = scheduler.CreateColdObservable(
+                OnNext(0, 99),
+                OnCompleted<int>(10)
+            );
+
+            var ysc = scheduler.CreateColdObservable(
+                OnNext(10, 42),
+                OnCompleted<int>(20)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => ysn,
+                    ex => yse,
+                    () => ysc
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 10),
+                OnNext(311, 10),
+                OnNext(312, 10),
+                OnNext(313, 10),
+                OnNext(314, 10),
+                OnNext(315, 42),
+                OnNext(320, 11),
+                OnNext(321, 11),
+                OnNext(322, 11),
+                OnNext(323, 11),
+                OnNext(324, 11),
+                OnNext(330, 12),
+                OnNext(331, 12),
+                OnNext(332, 12),
+                OnNext(333, 12),
+                OnNext(334, 12),
+                OnCompleted<int>(344)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+
+            ysn.Subscriptions.AssertEqual(
+                Subscribe(300, 340),
+                Subscribe(301, 341),
+                Subscribe(302, 342),
+                Subscribe(303, 343),
+                Subscribe(304, 344)
+            );
+
+            yse.Subscriptions.AssertEqual(
+            );
+
+            ysc.Subscriptions.AssertEqual(
+                Subscribe(305, 325)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_InnersWithTiming2()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var ysn = scheduler.CreateColdObservable(
+                OnNext(10, 10),
+                OnNext(20, 11),
+                OnNext(30, 12),
+                OnCompleted<int>(40)
+            );
+
+            var yse = scheduler.CreateColdObservable(
+                OnNext(0, 99),
+                OnCompleted<int>(10)
+            );
+
+            var ysc = scheduler.CreateColdObservable(
+                OnNext(10, 42),
+                OnCompleted<int>(50)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => ysn,
+                    ex => yse,
+                    () => ysc
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 10),
+                OnNext(311, 10),
+                OnNext(312, 10),
+                OnNext(313, 10),
+                OnNext(314, 10),
+                OnNext(315, 42),
+                OnNext(320, 11),
+                OnNext(321, 11),
+                OnNext(322, 11),
+                OnNext(323, 11),
+                OnNext(324, 11),
+                OnNext(330, 12),
+                OnNext(331, 12),
+                OnNext(332, 12),
+                OnNext(333, 12),
+                OnNext(334, 12),
+                OnCompleted<int>(355)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+
+            ysn.Subscriptions.AssertEqual(
+                Subscribe(300, 340),
+                Subscribe(301, 341),
+                Subscribe(302, 342),
+                Subscribe(303, 343),
+                Subscribe(304, 344)
+            );
+
+            yse.Subscriptions.AssertEqual(
+            );
+
+            ysc.Subscriptions.AssertEqual(
+                Subscribe(305, 355)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_InnersWithTiming3()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(400, 1),
+                OnNext(500, 2),
+                OnNext(600, 3),
+                OnNext(700, 4),
+                OnCompleted<int>(800)
+            );
+
+            var ysn = scheduler.CreateColdObservable(
+                OnNext(10, 10),
+                OnNext(20, 11),
+                OnNext(30, 12),
+                OnCompleted<int>(40)
+            );
+
+            var yse = scheduler.CreateColdObservable(
+                OnNext(0, 99),
+                OnCompleted<int>(10)
+            );
+
+            var ysc = scheduler.CreateColdObservable(
+                OnNext(10, 42),
+                OnCompleted<int>(100)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => ysn,
+                    ex => yse,
+                    () => ysc
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(310, 10),
+                OnNext(320, 11),
+                OnNext(330, 12),
+                OnNext(410, 10),
+                OnNext(420, 11),
+                OnNext(430, 12),
+                OnNext(510, 10),
+                OnNext(520, 11),
+                OnNext(530, 12),
+                OnNext(610, 10),
+                OnNext(620, 11),
+                OnNext(630, 12),
+                OnNext(710, 10),
+                OnNext(720, 11),
+                OnNext(730, 12),
+                OnNext(810, 42),
+                OnCompleted<int>(900)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 800)
+            );
+
+            ysn.Subscriptions.AssertEqual(
+                Subscribe(300, 340),
+                Subscribe(400, 440),
+                Subscribe(500, 540),
+                Subscribe(600, 640),
+                Subscribe(700, 740)
+            );
+
+            yse.Subscriptions.AssertEqual(
+            );
+
+            ysc.Subscriptions.AssertEqual(
+                Subscribe(800, 900)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_Error_Identity()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnError<int>(305, ex)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Return(x, scheduler),
+                    ex1 => Observable.Throw<int>(ex1, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnError<int>(306, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_SelectMany()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Throw<int>(ex, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnNext(305, 4),
+                OnNext(305, 3),
+                OnNext(306, 4),
+                OnNext(306, 3),
+                OnNext(307, 4),
+                OnNext(308, 4),
+                OnCompleted<int>(308)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_Concat()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Return(x, scheduler),
+                    ex => Observable.Throw<int>(ex, scheduler),
+                    () => Observable.Range(1, 3, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnNext(306, 1),
+                OnNext(307, 2),
+                OnNext(308, 3),
+                OnCompleted<int>(309)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_Catch()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Return(x, scheduler),
+                    ex => Observable.Range(1, 3, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnCompleted<int>(306)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_Error_Catch()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnError<int>(305, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Return(x, scheduler),
+                    ex => Observable.Range(1, 3, scheduler),
+                    () => Observable.Empty<int>(scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(301, 0),
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(305, 4),
+                OnNext(306, 1),
+                OnNext(307, 2),
+                OnNext(308, 3),
+                OnCompleted<int>(309)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_All()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnNext(305, 4),
+                OnNext(305, 3),
+                OnNext(306, -1),
+                OnNext(306, 4),
+                OnNext(306, 3),
+                OnNext(307, -1),
+                OnNext(307, 4),
+                OnNext(308, 4),
+                OnCompleted<int>(308)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_Error_All()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnError<int>(305, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnNext(305, 4),
+                OnNext(305, 3),
+                OnNext(306, 0),
+                OnNext(306, 4),
+                OnNext(306, 3),
+                OnNext(307, 0),
+                OnNext(307, 4),
+                OnNext(308, 4),
+                OnCompleted<int>(308)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_All_Dispose()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                ),
+                307
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnNext(305, 4),
+                OnNext(305, 3),
+                OnNext(306, -1),
+                OnNext(306, 4),
+                OnNext(306, 3)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_All_Dispose_Before_First()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Repeat(x, x, scheduler),
+                    ex => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                ),
+                304
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 304)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_OnNextThrow()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Throw<IObservable<int>>(ex),
+                    ex1 => Observable.Repeat(0, 2, scheduler),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnError<int>(300, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 300)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_OnErrorThrow()
+        {
+            var scheduler = new TestScheduler();
+
+            var ex = new Exception();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnError<int>(305, new Exception())
+            );
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Repeat(x, x, scheduler),
+                    ex1 => Throw<IObservable<int>>(ex),
+                    () => Observable.Repeat(-1, 2, scheduler)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnError<int>(305, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+        [TestMethod]
+        public void SelectManyWithIndex_Triple_OnCompletedThrow()
+        {
+            var scheduler = new TestScheduler();
+
+            var xs = scheduler.CreateHotObservable(
+                OnNext(300, 0),
+                OnNext(301, 1),
+                OnNext(302, 2),
+                OnNext(303, 3),
+                OnNext(304, 4),
+                OnCompleted<int>(305)
+            );
+
+            var ex = new Exception();
+
+            var res = scheduler.Start(() =>
+                xs.SelectMany(
+                    (x, _) => Observable.Repeat(x, x, scheduler),
+                    ex1 => Observable.Repeat(0, 2, scheduler),
+                    () => Throw<IObservable<int>>(ex)
+                )
+            );
+
+            res.Messages.AssertEqual(
+                OnNext(302, 1),
+                OnNext(303, 2),
+                OnNext(304, 3),
+                OnNext(304, 2),
+                OnError<int>(305, ex)
+            );
+
+            xs.Subscriptions.AssertEqual(
+                Subscribe(200, 305)
+            );
+        }
+
+#if !NO_TPL
+
+        [TestMethod]
+        public void SelectMany_Task_ArgumentChecking()
+        {
+            var t = new Task<int>(() => 42);
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(default(IObservable<int>), x => t));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, default(Func<int, Task<int>>)));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(default(IObservable<int>), (int x, CancellationToken ct) => t));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, default(Func<int, CancellationToken, Task<int>>)));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(default(IObservable<int>), x => t, (x, y) => x));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, default(Func<int, Task<int>>), (x, y) => x));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, x => t, default(Func<int, int, int>)));
+
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(default(IObservable<int>), (x, ct) => t, (x, y) => x));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, default(Func<int, CancellationToken, Task<int>>), (x, y) => x));
+            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, (x, ct) => t, default(Func<int, int, int>)));
+        }
+
+        [TestMethod]
+        public void SelectMany_Task1()
+        {
+            var res = Observable.Range(0, 10).SelectMany(x => Task.Factory.StartNew(() => x + 1)).ToEnumerable();
+            Assert.IsTrue(Enumerable.Range(0, 10).SelectMany(x => new[] { x + 1 }).SequenceEqual(res.OrderBy(x => x)));
+        }
+
+        [TestMethod]
+        public void SelectMany_Task2()
+        {
+            var res = Observable.Range(0, 10).SelectMany((x, ct) => Task.Factory.StartNew(() => x + 1, ct)).ToEnumerable();
+            Assert.IsTrue(Enumerable.Range(0, 10).SelectMany(x => new[] { x + 1 }).SequenceEqual(res.OrderBy(x => x)));
+        }
+
+        [TestMethod]
+        public void SelectMany_Task_TaskThrows()
+        {
+            var ex = new Exception();
+
+            var res = Observable.Range(0, 10).SelectMany(x => Task.Factory.StartNew(() =>
+            {
+                if (x > 5)
+                    throw ex;
+                return x + 1;
+            })).ToEnumerable();
+
+            ReactiveAssert.Throws(ex, () =>
+            {
+                foreach (var x in res)
+                    ;
+            });
+        }
+
+        [TestMethod]
+        public void SelectMany_Task_SelectorThrows()
+        {
+            var ex = new Exception();
+
+            var res = Observable.Range(0, 10).SelectMany(x =>
+            {
+                if (x > 5)
+                    throw ex;
+                return Task.Factory.StartNew(() => x + 1);
+            }).ToEnumerable();
+
+            ReactiveAssert.Throws(ex, () =>
+            {
+                foreach (var x in res)
+                    ;
+            });
+        }
+
+        [TestMethod]
+        public void SelectMany_Task_ResultSelector1()
+        {
+            var res = Observable.Range(0, 10).SelectMany(x => Task.Factory.StartNew(() => x + 1), (x, y) => x + y).ToEnumerable();
+            Assert.IsTrue(Enumerable.Range(0, 10).SelectMany(x => new[] { 2 * x + 1 }).SequenceEqual(res.OrderBy(x => x)));
+        }
+
+        [TestMethod]
+        public void SelectMany_Task_ResultSelector2()
+        {
+            var res = Observable.Range(0, 10).SelectMany((x, ct) => Task.Factory.StartNew(() => x + 1, ct), (x, y) => x + y).ToEnumerable();
+            Assert.IsTrue(Enumerable.Range(0, 10).SelectMany(x => new[] { 2 * x + 1 }).SequenceEqual(res.OrderBy(x => x)));
+        }
+
+        [TestMethod]
+        public void SelectMany_Task_ResultSelectorThrows()
+        {
+            var ex = new Exception();
+
+            var res = Observable.Range(0, 10).SelectMany(x => Task.Factory.StartNew(() => x + 1), (x, y) =>
+            {
+                if (x > 5)
+                    throw ex;
+                return x + y;
+            }).ToEnumerable();
+
+            ReactiveAssert.Throws(ex, () =>
+            {
+                foreach (var x in res)
+                    ;
+            });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_RanToCompletion_Async()
+        {
+            var tcss = new TaskCompletionSource<int>[2];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(Observable.Range(0, 2), x => tcss[x].Task);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, () => done.Set());
+
+            tcss[0].SetResult(42);
+            tcss[1].SetResult(43);
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42, 43 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_RanToCompletion_Sync()
+        {
+            var tcss = new TaskCompletionSource<int>[2];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+
+            tcss[0].SetResult(42);
+            tcss[1].SetResult(43);
+
+            var res = Observable.SelectMany(Observable.Range(0, 2), x => tcss[x].Task);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, () => done.Set());
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42, 43 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_Faulted_Async()
+        {
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task);
+
+            var lst = new List<int>();
+
+            var err = default(Exception);
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
+
+            var ex = new Exception();
+            tcss[1].SetException(ex);
+
+            done.WaitOne();
+
+            lst.AssertEqual(new int[0]);
+            Assert.AreSame(ex, err);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_Faulted_Sync()
+        {
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var ex = new Exception();
+            tcss[1].SetException(ex);
+
+            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task);
+
+            var lst = new List<int>();
+
+            var err = default(Exception);
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
+
+            done.WaitOne();
+
+            lst.AssertEqual(new int[0]);
+            Assert.AreSame(ex, err);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_Canceled_Async()
+        {
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task);
+
+            var lst = new List<int>();
+
+            var err = default(Exception);
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
+
+            tcss[1].SetCanceled();
+
+            done.WaitOne();
+
+            lst.AssertEqual(new int[0]);
+            Assert.IsTrue(err is TaskCanceledException && ((TaskCanceledException)err).Task == tcss[1].Task);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_Canceled_Sync()
+        {
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            tcss[1].SetCanceled();
+
+            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task);
+
+            var lst = new List<int>();
+
+            var err = default(Exception);
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
+
+            done.WaitOne();
+
+            lst.AssertEqual(new int[0]);
+            Assert.IsTrue(err is TaskCanceledException && ((TaskCanceledException)err).Task == tcss[1].Task);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_InnerCompleteBeforeOuter()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(xs, x => tcss[x].Task);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, () => done.Set());
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+            xs.OnNext(2);
+
+            tcss[0].SetResult(43);
+            tcss[2].SetResult(44);
+
+            xs.OnCompleted();
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42, 43, 44 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_OuterCompleteBeforeInner()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(xs, x => tcss[x].Task);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, () => done.Set());
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+            xs.OnNext(2);
+            xs.OnCompleted();
+
+            tcss[0].SetResult(43);
+            tcss[2].SetResult(44);
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42, 43, 44 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_Cancellation_NeverInvoked()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(xs, (x, token) =>
+            {
+                var tcs = tcss[x];
+
+                token.Register(() => tcs.SetCanceled());
+
+                return tcs.Task;
+            });
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            var d = res.Subscribe(lst.Add, () => done.Set());
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+            xs.OnNext(2);
+            xs.OnCompleted();
+
+            tcss[0].SetResult(43);
+            tcss[2].SetResult(44);
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42, 43, 44 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_Cancellation_Invoked()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var n = 0;
+            var m = 0;
+
+            var res = Observable.SelectMany(xs, (x, token) =>
+            {
+                var tcs = tcss[x];
+
+                token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
+
+                return tcs.Task;
+            });
+
+            var lst = new List<int>();
+
+            var done = false;
+            var d = res.Subscribe(lst.Add, () => done = true);
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+
+            d.Dispose();
+
+            xs.OnNext(2);
+            xs.OnCompleted();
+
+            Assert.IsFalse(tcss[0].TrySetResult(43));
+            tcss[2].SetResult(44); // never observed because xs.OnNext(2) happened after dispose
+
+            lst.AssertEqual(new[] { 42 });
+            Assert.IsFalse(done);
+            Assert.AreEqual(2, n);
+            Assert.AreEqual(1, m); // tcss[1] was already finished
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_Cancellation_AfterOuterError()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var n = 0;
+            var m = 0;
+
+            var res = Observable.SelectMany(xs, (x, token) =>
+            {
+                var tcs = tcss[x];
+
+                token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
+
+                return tcs.Task;
+            });
+
+            var lst = new List<int>();
+
+            var done = false;
+            var err = default(Exception);
+            res.Subscribe(lst.Add, ex_ => err = ex_, () => done = true);
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+
+            var ex = new Exception();
+            xs.OnError(ex);
+
+            Assert.IsFalse(tcss[0].TrySetResult(43));
+            tcss[2].SetResult(44); // no-op
+
+            lst.AssertEqual(new[] { 42 });
+            Assert.AreSame(ex, err);
+            Assert.IsFalse(done);
+            Assert.AreEqual(2, n);
+            Assert.AreEqual(1, m); // tcss[1] was already finished
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_Simple_Cancellation_AfterSelectorThrows()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[4];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+            tcss[3] = new TaskCompletionSource<int>();
+
+            var n = 0;
+            var m = 0;
+
+            var ex = new Exception();
+
+            var res = Observable.SelectMany(xs, (x, token) =>
+            {
+                if (x == 2)
+                    throw ex;
+
+                var tcs = tcss[x];
+
+                token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
+
+                return tcs.Task;
+            });
+
+            var lst = new List<int>();
+
+            var done = false;
+            var evt = new ManualResetEvent(false);
+            var err = default(Exception);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; evt.Set(); }, () => { done = true; evt.Set(); });
+
+            tcss[1].SetResult(43);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+
+            tcss[0].SetResult(42);
+
+            xs.OnNext(2); // causes error
+            xs.OnCompleted();
+
+            evt.WaitOne();
+
+            Assert.IsFalse(done);
+            Assert.AreSame(ex, err);
+            Assert.AreEqual(2, n);
+            Assert.AreEqual(0, m);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_RanToCompletion_Async()
+        {
+            var tcss = new TaskCompletionSource<int>[2];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(Observable.Range(0, 2), x => tcss[x].Task, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, () => done.Set());
+
+            tcss[0].SetResult(42);
+            tcss[1].SetResult(43);
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42 + 0, 43 + 1 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_RanToCompletion_Sync()
+        {
+            var tcss = new TaskCompletionSource<int>[2];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+
+            tcss[0].SetResult(42);
+            tcss[1].SetResult(43);
+
+            var res = Observable.SelectMany(Observable.Range(0, 2), x => tcss[x].Task, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, () => done.Set());
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42 + 0, 43 + 1 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Faulted_Async()
+        {
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var err = default(Exception);
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
+
+            var ex = new Exception();
+            tcss[1].SetException(ex);
+
+            done.WaitOne();
+
+            lst.AssertEqual(new int[0]);
+            Assert.AreSame(ex, err);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Faulted_Sync()
+        {
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var ex = new Exception();
+            tcss[1].SetException(ex);
+
+            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var err = default(Exception);
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
+
+            done.WaitOne();
+
+            lst.AssertEqual(new int[0]);
+            Assert.AreSame(ex, err);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Canceled_Async()
+        {
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var err = default(Exception);
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
+
+            tcss[1].SetCanceled();
+
+            done.WaitOne();
+
+            lst.AssertEqual(new int[0]);
+            Assert.IsTrue(err is TaskCanceledException && ((TaskCanceledException)err).Task == tcss[1].Task);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Canceled_Sync()
+        {
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            tcss[1].SetCanceled();
+
+            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var err = default(Exception);
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; done.Set(); }, () => done.Set());
+
+            done.WaitOne();
+
+            lst.AssertEqual(new int[0]);
+            Assert.IsTrue(err is TaskCanceledException && ((TaskCanceledException)err).Task == tcss[1].Task);
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_InnerCompleteBeforeOuter()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(xs, x => tcss[x].Task, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, () => done.Set());
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+            xs.OnNext(2);
+
+            tcss[0].SetResult(43);
+            tcss[2].SetResult(44);
+
+            xs.OnCompleted();
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42 + 1, 43 + 0, 44 + 2 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_OuterCompleteBeforeInner()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(xs, x => tcss[x].Task, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            res.Subscribe(lst.Add, () => done.Set());
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+            xs.OnNext(2);
+            xs.OnCompleted();
+
+            tcss[0].SetResult(43);
+            tcss[2].SetResult(44);
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42 + 1, 43 + 0, 44 + 2 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Cancellation_NeverInvoked()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var res = Observable.SelectMany(xs, (x, token) =>
+            {
+                var tcs = tcss[x];
+
+                token.Register(() => tcs.SetCanceled());
+
+                return tcs.Task;
+            }, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var done = new ManualResetEvent(false);
+            var d = res.Subscribe(lst.Add, () => done.Set());
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+            xs.OnNext(2);
+            xs.OnCompleted();
+
+            tcss[0].SetResult(43);
+            tcss[2].SetResult(44);
+
+            done.WaitOne();
+
+            lst.OrderBy(x => x).AssertEqual(new[] { 42 + 1, 43 + 0, 44 + 2 });
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Cancellation_Invoked()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var n = 0;
+            var m = 0;
+
+            var res = Observable.SelectMany(xs, (x, token) =>
+            {
+                var tcs = tcss[x];
+
+                token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
+
+                return tcs.Task;
+            }, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var done = false;
+            var d = res.Subscribe(lst.Add, () => done = true);
+
+            tcss[1].SetResult(42);
+
+            xs.OnNext(0);
+            xs.OnNext(1);
+
+            d.Dispose();
+
+            xs.OnNext(2);
+            xs.OnCompleted();
+
+            Assert.IsFalse(tcss[0].TrySetResult(43));
+            tcss[2].SetResult(44); // never observed because xs.OnNext(2) happened after dispose
+
+            lst.AssertEqual(new[] { 42 + 1 });
+            Assert.IsFalse(done);
+            Assert.AreEqual(2, n);
+            Assert.AreEqual(1, m); // tcss[1] was already finished
+        }
+
+        [TestMethod]
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Cancellation_AfterOuterError()
+        {
+            var xs = new Subject<int>();
+
+            var tcss = new TaskCompletionSource<int>[3];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+
+            var n = 0;
+            var m = 0;
+
+            var res = Observable.SelectMany(xs, (x, token) =>
+            {
+                var tcs = tcss[x];
+
+                token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
+
+                return tcs.Task;
+            }, (x, y) => x + y);
+
+            var lst = new List<int>();
+
+            var done = false;
+            var err = default(Exception);
+            res.Subscribe(lst.Add, ex_ => err = ex_, () => done = true);
 
-        [TestMethod]
-        public void SelectMany_Triple_All_Dispose_Before_First()
-        {
-            var scheduler = new TestScheduler();
+            tcss[1].SetResult(42);
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
-            );
+            xs.OnNext(0);
+            xs.OnNext(1);
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Repeat(x, x, scheduler),
-                    ex => Observable.Repeat(0, 2, scheduler),
-                    () => Observable.Repeat(-1, 2, scheduler)
-                ),
-                304
-            );
+            var ex = new Exception();
+            xs.OnError(ex);
 
-            res.Messages.AssertEqual(
-                OnNext(302, 1),
-                OnNext(303, 2)
-            );
+            Assert.IsFalse(tcss[0].TrySetResult(43));
+            tcss[2].SetResult(44); // no-op
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 304)
-            );
+            lst.AssertEqual(new[] { 42 + 1 });
+            Assert.AreSame(ex, err);
+            Assert.IsFalse(done);
+            Assert.AreEqual(2, n);
+            Assert.AreEqual(1, m); // tcss[1] was already finished
         }
 
         [TestMethod]
-        public void SelectMany_Triple_OnNextThrow()
+        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Cancellation_AfterSelectorThrows()
         {
-            var scheduler = new TestScheduler();
+            var xs = new Subject<int>();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
-            );
+            var tcss = new TaskCompletionSource<int>[4];
+            tcss[0] = new TaskCompletionSource<int>();
+            tcss[1] = new TaskCompletionSource<int>();
+            tcss[2] = new TaskCompletionSource<int>();
+            tcss[3] = new TaskCompletionSource<int>();
+
+            var n = 0;
+            var m = 0;
 
             var ex = new Exception();
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Throw<IObservable<int>>(ex),
-                    ex1 => Observable.Repeat(0, 2, scheduler),
-                    () => Observable.Repeat(-1, 2, scheduler)
-                )
-            );
+            var res = Observable.SelectMany(xs, (x, token) =>
+            {
+                if (x == 2)
+                    throw ex;
 
-            res.Messages.AssertEqual(
-                OnError<int>(300, ex)
-            );
+                var tcs = tcss[x];
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 300)
-            );
-        }
+                token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
 
-        [TestMethod]
-        public void SelectMany_Triple_OnErrorThrow()
-        {
-            var scheduler = new TestScheduler();
+                return tcs.Task;
+            }, (x, y) => x + y);
 
-            var ex = new Exception();
+            var lst = new List<int>();
 
-            var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnError<int>(305, new Exception())
-            );
+            var done = false;
+            var evt = new ManualResetEvent(false);
+            var err = default(Exception);
+            res.Subscribe(lst.Add, ex_ => { err = ex_; evt.Set(); }, () => { done = true; evt.Set(); });
 
-            var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Repeat(x, x, scheduler),
-                    ex1 => Throw<IObservable<int>>(ex),
-                    () => Observable.Repeat(-1, 2, scheduler)
-                )
-            );
+            tcss[1].SetResult(43);
 
-            res.Messages.AssertEqual(
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(304, 2),
-                OnError<int>(305, ex)
-            );
+            xs.OnNext(0);
+            xs.OnNext(1);
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
-            );
+            tcss[0].SetResult(42);
+
+            xs.OnNext(2); // causes error
+            xs.OnCompleted();
+
+            evt.WaitOne();
+
+            Assert.IsFalse(done);
+            Assert.AreSame(ex, err);
+            Assert.AreEqual(2, n);
+            Assert.AreEqual(0, m);
         }
 
         [TestMethod]
-        public void SelectMany_Triple_OnCompletedThrow()
+        public void SelectManyWithIndex_Task_ArgumentChecking()
         {
-            var scheduler = new TestScheduler();
-
-            var xs = scheduler.CreateHotObservable(
-                OnNext(300, 0),
-                OnNext(301, 1),
-                OnNext(302, 2),
-                OnNext(303, 3),
-                OnNext(304, 4),
-                OnCompleted<int>(305)
-            );
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, int, Task<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, int, Task<int>>)null));
 
-            var ex = new Exception();
-
-            var res = scheduler.Start(() =>
-                xs.SelectMany(
-                    x => Observable.Repeat(x, x, scheduler),
-                    ex1 => Observable.Repeat(0, 2, scheduler),
-                    () => Throw<IObservable<int>>(ex)
-                )
-            );
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int>(DummyFunc<int, int, CancellationToken, Task<int>>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, int, CancellationToken, Task<int>>)null));
 
-            res.Messages.AssertEqual(
-                OnNext(302, 1),
-                OnNext(303, 2),
-                OnNext(304, 3),
-                OnNext(304, 2),
-                OnError<int>(305, ex)
-            );
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, int, Task<int>>.Instance, DummyFunc<int, int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, int, Task<int>>)null, DummyFunc<int, int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, int, Task<int>>.Instance, ((Func<int, int, int, int>)null)));
 
-            xs.Subscriptions.AssertEqual(
-                Subscribe(200, 305)
-            );
+            ReactiveAssert.Throws<ArgumentNullException>(() => ((IObservable<int>)null).SelectMany<int, int, int>(DummyFunc<int, int, CancellationToken, Task<int>>.Instance, DummyFunc<int, int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany((Func<int, int, CancellationToken, Task<int>>)null, DummyFunc<int, int, int, int>.Instance));
+            ReactiveAssert.Throws<ArgumentNullException>(() => DummyObservable<int>.Instance.SelectMany(DummyFunc<int, int, CancellationToken, Task<int>>.Instance, ((Func<int, int, int, int>)null)));
         }
 
-#if !NO_TPL
-
         [TestMethod]
-        public void SelectMany_Task_ArgumentChecking()
+        public void SelectManyWithIndex_Task_Index()
         {
-            var t = new Task<int>(() => 42);
-
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(default(IObservable<int>), x => t));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, default(Func<int, Task<int>>)));
+            var res = Observable.Range(0, 10).SelectMany((int x, int i) => Task.Factory.StartNew(() => new { x, i })).ToEnumerable();
+            Assert.IsTrue(Enumerable.Range(0, 10).SelectMany((x, i) => new[] { new { x, i } }).SequenceEqual(res.OrderBy(v => v.i)));
+        }
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(default(IObservable<int>), (x, ct) => t));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, default(Func<int, CancellationToken, Task<int>>)));
+        [TestMethod]
+        public void SelectManyWithIndex_Task_Cancellation_Index()
+        {
+            var res = Observable.Range(0, 10).SelectMany((x, i, ctx) => Task.Factory.StartNew(() => new { x, i }, ctx)).ToEnumerable();
+            Assert.IsTrue(Enumerable.Range(0, 10).SelectMany((x, i) => new[] { new { x, i } }).SequenceEqual(res.OrderBy(v => v.i)));
+        }
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(default(IObservable<int>), x => t, (x, y) => x));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, default(Func<int, Task<int>>), (x, y) => x));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, x => t, default(Func<int, int, int>)));
+        [TestMethod]
+        public void SelectManyWithIndex_Task_ResultSelector_Index()
+        {
+            var res = Observable.Range(0, 10).SelectMany((int x, int i) => Task.Factory.StartNew(() => new { x, i }), (x, i, r) => r).ToEnumerable();
+            Assert.IsTrue(Enumerable.Range(0, 10).SelectMany((x, i) => new[] { new { x, i } }).SequenceEqual(res.OrderBy(v => v.i)));
+        }
 
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(default(IObservable<int>), (x, ct) => t, (x, y) => x));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, default(Func<int, CancellationToken, Task<int>>), (x, y) => x));
-            ReactiveAssert.Throws<ArgumentNullException>(() => Observable.SelectMany(DummyObservable<int>.Instance, (x, ct) => t, default(Func<int, int, int>)));
+        [TestMethod]
+        public void SelectManyWithIndex_Task_ResultSelector_Cancellation_Index()
+        {
+            var res = Observable.Range(0, 10).SelectMany((x, i, ctx) => Task.Factory.StartNew(() => new { x, i }, ctx), (x, i, r) => r).ToEnumerable();
+            Assert.IsTrue(Enumerable.Range(0, 10).SelectMany((x, i) => new[] { new { x, i } }).SequenceEqual(res.OrderBy(v => v.i)));
         }
 
         [TestMethod]
-        public void SelectMany_Task1()
+        public void SelectManyWithIndex_Task1()
         {
-            var res = Observable.Range(0, 10).SelectMany(x => Task.Factory.StartNew(() => x + 1)).ToEnumerable();
+            var res = Observable.Range(0, 10).SelectMany((int x, int _) => Task.Factory.StartNew(() => x + 1)).ToEnumerable();
             Assert.IsTrue(Enumerable.Range(0, 10).SelectMany(x => new[] { x + 1 }).SequenceEqual(res.OrderBy(x => x)));
         }
 
         [TestMethod]
-        public void SelectMany_Task2()
+        public void SelectManyWithIndex_Task2()
         {
-            var res = Observable.Range(0, 10).SelectMany((x, ct) => Task.Factory.StartNew(() => x + 1, ct)).ToEnumerable();
+            var res = Observable.Range(0, 10).SelectMany((x, _, ct) => Task.Factory.StartNew(() => x + 1, ct)).ToEnumerable();
             Assert.IsTrue(Enumerable.Range(0, 10).SelectMany(x => new[] { x + 1 }).SequenceEqual(res.OrderBy(x => x)));
         }
 
         [TestMethod]
-        public void SelectMany_Task_TaskThrows()
+        public void SelectManyWithIndex_Task_TaskThrows()
         {
             var ex = new Exception();
 
-            var res = Observable.Range(0, 10).SelectMany(x => Task.Factory.StartNew(() =>
+            var res = Observable.Range(0, 10).SelectMany((int x, int _) => Task.Factory.StartNew(() =>
             {
                 if (x > 5)
                     throw ex;
@@ -10392,11 +17004,11 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_Task_SelectorThrows()
+        public void SelectManyWithIndex_Task_SelectorThrows()
         {
             var ex = new Exception();
 
-            var res = Observable.Range(0, 10).SelectMany(x =>
+            var res = Observable.Range(0, 10).SelectMany((int x, int _) =>
             {
                 if (x > 5)
                     throw ex;
@@ -10411,25 +17023,25 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_Task_ResultSelector1()
+        public void SelectManyWithIndex_Task_ResultSelector1()
         {
-            var res = Observable.Range(0, 10).SelectMany(x => Task.Factory.StartNew(() => x + 1), (x, y) => x + y).ToEnumerable();
+            var res = Observable.Range(0, 10).SelectMany((x, _) => Task.Factory.StartNew(() => x + 1), (x, _, y) => x + y).ToEnumerable();
             Assert.IsTrue(Enumerable.Range(0, 10).SelectMany(x => new[] { 2 * x + 1 }).SequenceEqual(res.OrderBy(x => x)));
         }
 
         [TestMethod]
-        public void SelectMany_Task_ResultSelector2()
+        public void SelectManyWithIndex_Task_ResultSelector2()
         {
-            var res = Observable.Range(0, 10).SelectMany((x, ct) => Task.Factory.StartNew(() => x + 1, ct), (x, y) => x + y).ToEnumerable();
+            var res = Observable.Range(0, 10).SelectMany((x, _, ct) => Task.Factory.StartNew(() => x + 1, ct), (x, _, y) => x + y).ToEnumerable();
             Assert.IsTrue(Enumerable.Range(0, 10).SelectMany(x => new[] { 2 * x + 1 }).SequenceEqual(res.OrderBy(x => x)));
         }
 
         [TestMethod]
-        public void SelectMany_Task_ResultSelectorThrows()
+        public void SelectManyWithIndex_Task_ResultSelectorThrows()
         {
             var ex = new Exception();
 
-            var res = Observable.Range(0, 10).SelectMany(x => Task.Factory.StartNew(() => x + 1), (x, y) =>
+            var res = Observable.Range(0, 10).SelectMany((x, _) => Task.Factory.StartNew(() => x + 1), (x, _, y) =>
             {
                 if (x > 5)
                     throw ex;
@@ -10444,13 +17056,13 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_RanToCompletion_Async()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_RanToCompletion_Async()
         {
             var tcss = new TaskCompletionSource<int>[2];
             tcss[0] = new TaskCompletionSource<int>();
             tcss[1] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(Observable.Range(0, 2), x => tcss[x].Task);
+            var res = Observable.SelectMany(Observable.Range(0, 2), (int x, int _) => tcss[x].Task);
 
             var lst = new List<int>();
 
@@ -10466,7 +17078,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_RanToCompletion_Sync()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_RanToCompletion_Sync()
         {
             var tcss = new TaskCompletionSource<int>[2];
             tcss[0] = new TaskCompletionSource<int>();
@@ -10475,7 +17087,7 @@ namespace ReactiveTests.Tests
             tcss[0].SetResult(42);
             tcss[1].SetResult(43);
 
-            var res = Observable.SelectMany(Observable.Range(0, 2), x => tcss[x].Task);
+            var res = Observable.SelectMany(Observable.Range(0, 2), (int x, int _) => tcss[x].Task);
 
             var lst = new List<int>();
 
@@ -10488,14 +17100,14 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_Faulted_Async()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_Faulted_Async()
         {
             var tcss = new TaskCompletionSource<int>[3];
             tcss[0] = new TaskCompletionSource<int>();
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task);
+            var res = Observable.SelectMany(Observable.Range(0, 3), (int x, int _) => tcss[x].Task);
 
             var lst = new List<int>();
 
@@ -10513,7 +17125,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_Faulted_Sync()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_Faulted_Sync()
         {
             var tcss = new TaskCompletionSource<int>[3];
             tcss[0] = new TaskCompletionSource<int>();
@@ -10523,7 +17135,7 @@ namespace ReactiveTests.Tests
             var ex = new Exception();
             tcss[1].SetException(ex);
 
-            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task);
+            var res = Observable.SelectMany(Observable.Range(0, 3), (int x, int _) => tcss[x].Task);
 
             var lst = new List<int>();
 
@@ -10538,14 +17150,14 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_Canceled_Async()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_Canceled_Async()
         {
             var tcss = new TaskCompletionSource<int>[3];
             tcss[0] = new TaskCompletionSource<int>();
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task);
+            var res = Observable.SelectMany(Observable.Range(0, 3), (int x, int _) => tcss[x].Task);
 
             var lst = new List<int>();
 
@@ -10562,7 +17174,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_Canceled_Sync()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_Canceled_Sync()
         {
             var tcss = new TaskCompletionSource<int>[3];
             tcss[0] = new TaskCompletionSource<int>();
@@ -10571,7 +17183,7 @@ namespace ReactiveTests.Tests
 
             tcss[1].SetCanceled();
 
-            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task);
+            var res = Observable.SelectMany(Observable.Range(0, 3), (int x, int _) => tcss[x].Task);
 
             var lst = new List<int>();
 
@@ -10586,7 +17198,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_InnerCompleteBeforeOuter()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_InnerCompleteBeforeOuter()
         {
             var xs = new Subject<int>();
 
@@ -10595,7 +17207,7 @@ namespace ReactiveTests.Tests
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(xs, x => tcss[x].Task);
+            var res = Observable.SelectMany(xs, (int x, int _) => tcss[x].Task);
 
             var lst = new List<int>();
 
@@ -10619,7 +17231,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_OuterCompleteBeforeInner()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_OuterCompleteBeforeInner()
         {
             var xs = new Subject<int>();
 
@@ -10628,7 +17240,7 @@ namespace ReactiveTests.Tests
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(xs, x => tcss[x].Task);
+            var res = Observable.SelectMany(xs, (int x, int _) => tcss[x].Task);
 
             var lst = new List<int>();
 
@@ -10651,7 +17263,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_Cancellation_NeverInvoked()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_Cancellation_NeverInvoked()
         {
             var xs = new Subject<int>();
 
@@ -10660,7 +17272,7 @@ namespace ReactiveTests.Tests
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(xs, (x, token) =>
+            var res = Observable.SelectMany(xs, (x, _, token) =>
             {
                 var tcs = tcss[x];
 
@@ -10690,7 +17302,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_Cancellation_Invoked()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_Cancellation_Invoked()
         {
             var xs = new Subject<int>();
 
@@ -10702,7 +17314,7 @@ namespace ReactiveTests.Tests
             var n = 0;
             var m = 0;
 
-            var res = Observable.SelectMany(xs, (x, token) =>
+            var res = Observable.SelectMany(xs, (x, _, token) =>
             {
                 var tcs = tcss[x];
 
@@ -10736,7 +17348,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_Cancellation_AfterOuterError()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_Cancellation_AfterOuterError()
         {
             var xs = new Subject<int>();
 
@@ -10748,7 +17360,7 @@ namespace ReactiveTests.Tests
             var n = 0;
             var m = 0;
 
-            var res = Observable.SelectMany(xs, (x, token) =>
+            var res = Observable.SelectMany(xs, (x, _, token) =>
             {
                 var tcs = tcss[x];
 
@@ -10782,7 +17394,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_Simple_Cancellation_AfterSelectorThrows()
+        public void SelectManyWithIndex_TaskWithCompletionSource_Simple_Cancellation_AfterSelectorThrows()
         {
             var xs = new Subject<int>();
 
@@ -10797,7 +17409,7 @@ namespace ReactiveTests.Tests
 
             var ex = new Exception();
 
-            var res = Observable.SelectMany(xs, (x, token) =>
+            var res = Observable.SelectMany(xs, (x, _, token) =>
             {
                 if (x == 2)
                     throw ex;
@@ -10835,13 +17447,13 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_RanToCompletion_Async()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_RanToCompletion_Async()
         {
             var tcss = new TaskCompletionSource<int>[2];
             tcss[0] = new TaskCompletionSource<int>();
             tcss[1] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(Observable.Range(0, 2), x => tcss[x].Task, (x, y) => x + y);
+            var res = Observable.SelectMany(Observable.Range(0, 2), (x, _) => tcss[x].Task, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -10857,7 +17469,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_RanToCompletion_Sync()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_RanToCompletion_Sync()
         {
             var tcss = new TaskCompletionSource<int>[2];
             tcss[0] = new TaskCompletionSource<int>();
@@ -10866,7 +17478,7 @@ namespace ReactiveTests.Tests
             tcss[0].SetResult(42);
             tcss[1].SetResult(43);
 
-            var res = Observable.SelectMany(Observable.Range(0, 2), x => tcss[x].Task, (x, y) => x + y);
+            var res = Observable.SelectMany(Observable.Range(0, 2), (x, _) => tcss[x].Task, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -10879,14 +17491,14 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Faulted_Async()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_Faulted_Async()
         {
             var tcss = new TaskCompletionSource<int>[3];
             tcss[0] = new TaskCompletionSource<int>();
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task, (x, y) => x + y);
+            var res = Observable.SelectMany(Observable.Range(0, 3), (x, _) => tcss[x].Task, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -10904,7 +17516,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Faulted_Sync()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_Faulted_Sync()
         {
             var tcss = new TaskCompletionSource<int>[3];
             tcss[0] = new TaskCompletionSource<int>();
@@ -10914,7 +17526,7 @@ namespace ReactiveTests.Tests
             var ex = new Exception();
             tcss[1].SetException(ex);
 
-            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task, (x, y) => x + y);
+            var res = Observable.SelectMany(Observable.Range(0, 3), (x, _) => tcss[x].Task, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -10929,14 +17541,14 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Canceled_Async()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_Canceled_Async()
         {
             var tcss = new TaskCompletionSource<int>[3];
             tcss[0] = new TaskCompletionSource<int>();
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task, (x, y) => x + y);
+            var res = Observable.SelectMany(Observable.Range(0, 3), (x, _) => tcss[x].Task, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -10953,7 +17565,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Canceled_Sync()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_Canceled_Sync()
         {
             var tcss = new TaskCompletionSource<int>[3];
             tcss[0] = new TaskCompletionSource<int>();
@@ -10962,7 +17574,7 @@ namespace ReactiveTests.Tests
 
             tcss[1].SetCanceled();
 
-            var res = Observable.SelectMany(Observable.Range(0, 3), x => tcss[x].Task, (x, y) => x + y);
+            var res = Observable.SelectMany(Observable.Range(0, 3), (x, _) => tcss[x].Task, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -10977,7 +17589,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_InnerCompleteBeforeOuter()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_InnerCompleteBeforeOuter()
         {
             var xs = new Subject<int>();
 
@@ -10986,7 +17598,7 @@ namespace ReactiveTests.Tests
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(xs, x => tcss[x].Task, (x, y) => x + y);
+            var res = Observable.SelectMany(xs, (x, _) => tcss[x].Task, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -11010,7 +17622,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_OuterCompleteBeforeInner()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_OuterCompleteBeforeInner()
         {
             var xs = new Subject<int>();
 
@@ -11019,7 +17631,7 @@ namespace ReactiveTests.Tests
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(xs, x => tcss[x].Task, (x, y) => x + y);
+            var res = Observable.SelectMany(xs, (x, _) => tcss[x].Task, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -11042,7 +17654,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Cancellation_NeverInvoked()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_Cancellation_NeverInvoked()
         {
             var xs = new Subject<int>();
 
@@ -11051,14 +17663,14 @@ namespace ReactiveTests.Tests
             tcss[1] = new TaskCompletionSource<int>();
             tcss[2] = new TaskCompletionSource<int>();
 
-            var res = Observable.SelectMany(xs, (x, token) =>
+            var res = Observable.SelectMany(xs, (x, _, token) =>
             {
                 var tcs = tcss[x];
 
                 token.Register(() => tcs.SetCanceled());
 
                 return tcs.Task;
-            }, (x, y) => x + y);
+            }, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -11081,7 +17693,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Cancellation_Invoked()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_Cancellation_Invoked()
         {
             var xs = new Subject<int>();
 
@@ -11093,14 +17705,14 @@ namespace ReactiveTests.Tests
             var n = 0;
             var m = 0;
 
-            var res = Observable.SelectMany(xs, (x, token) =>
+            var res = Observable.SelectMany(xs, (x, _, token) =>
             {
                 var tcs = tcss[x];
 
                 token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
 
                 return tcs.Task;
-            }, (x, y) => x + y);
+            }, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -11127,7 +17739,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Cancellation_AfterOuterError()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_Cancellation_AfterOuterError()
         {
             var xs = new Subject<int>();
 
@@ -11139,14 +17751,14 @@ namespace ReactiveTests.Tests
             var n = 0;
             var m = 0;
 
-            var res = Observable.SelectMany(xs, (x, token) =>
+            var res = Observable.SelectMany(xs, (x, _, token) =>
             {
                 var tcs = tcss[x];
 
                 token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
 
                 return tcs.Task;
-            }, (x, y) => x + y);
+            }, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
@@ -11173,7 +17785,7 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
-        public void SelectMany_TaskWithCompletionSource_WithResultSelector_Cancellation_AfterSelectorThrows()
+        public void SelectManyWithIndex_TaskWithCompletionSource_WithResultSelector_Cancellation_AfterSelectorThrows()
         {
             var xs = new Subject<int>();
 
@@ -11188,7 +17800,7 @@ namespace ReactiveTests.Tests
 
             var ex = new Exception();
 
-            var res = Observable.SelectMany(xs, (x, token) =>
+            var res = Observable.SelectMany(xs, (x, _, token) =>
             {
                 if (x == 2)
                     throw ex;
@@ -11198,7 +17810,7 @@ namespace ReactiveTests.Tests
                 token.Register(() => { n++; m += tcs.TrySetCanceled() ? 1 : 0; });
 
                 return tcs.Task;
-            }, (x, y) => x + y);
+            }, (x, _, y) => x + y);
 
             var lst = new List<int>();
 
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableTimeTest.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableTimeTest.cs
index 2c3e3e6..3796ed1 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableTimeTest.cs
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/ObservableTimeTest.cs
@@ -2720,6 +2720,20 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
+        public void Interval_TimeSpan_Zero_DefaultScheduler()
+        {
+            var scheduler = new TestScheduler();
+            var observer = scheduler.CreateObserver<long>();
+            var completed = new ManualResetEventSlim();
+
+            Observable.Interval(TimeSpan.Zero).TakeWhile(i => i < 10).Subscribe(observer.OnNext, completed.Set);
+
+            completed.Wait();
+            
+            Assert.AreEqual(10, observer.Messages.Count);
+        }
+
+        [TestMethod]
         public void Interval_TimeSpan_Disposed()
         {
             var scheduler = new TestScheduler();
@@ -7457,6 +7471,20 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
+        public void OneShotTimer_TimeSpan_Zero_DefaultScheduler()
+        {
+            var scheduler = new TestScheduler();
+            var observer = scheduler.CreateObserver<long>();
+            var completed = new ManualResetEventSlim();
+
+            Observable.Timer(TimeSpan.Zero).Subscribe(observer.OnNext, completed.Set);
+
+            completed.Wait();
+            
+            Assert.AreEqual(1, observer.Messages.Count);
+        }
+
+        [TestMethod]
         public void OneShotTimer_TimeSpan_Negative()
         {
             var scheduler = new TestScheduler();
@@ -7574,6 +7602,20 @@ namespace ReactiveTests.Tests
         }
 
         [TestMethod]
+        public void RepeatingTimer_TimeSpan_Zero_DefaultScheduler()
+        {
+            var scheduler = new TestScheduler();
+            var observer = scheduler.CreateObserver<long>();
+            var completed = new ManualResetEventSlim();
+
+            Observable.Timer(TimeSpan.Zero, TimeSpan.Zero).TakeWhile(i => i < 10).Subscribe(observer.OnNext, completed.Set);
+
+            completed.Wait();
+
+            Assert.AreEqual(10, observer.Messages.Count);
+        }
+
+        [TestMethod]
         public void RepeatingTimer_DateTimeOffset_TimeSpan_Simple()
         {
             var scheduler = new TestScheduler();
diff --git a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/BehaviorSubjectTest.cs b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/BehaviorSubjectTest.cs
index 3fd5f95..3cfcb7f 100644
--- a/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/BehaviorSubjectTest.cs
+++ b/external/rx/Rx/NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/BehaviorSubjectTest.cs
@@ -438,5 +438,76 @@ namespace ReactiveTests.Tests
             s.OnError(new Exception());
             Assert.IsFalse(s.HasObservers);
         }
+
+        [TestMethod]
+        public void Value_Initial()
+        {
+            var s = new BehaviorSubject<int>(42);
+            Assert.AreEqual(42, s.Value);
+        }
+
+        [TestMethod]
+        public void Value_First()
+        {
+            var s = new BehaviorSubject<int>(42);
+            Assert.AreEqual(42, s.Value);
+
+            s.OnNext(43);
+            Assert.AreEqual(43, s.Value);
+        }
+
+        [TestMethod]
+        public void Value_Second()
+        {
+            var s = new BehaviorSubject<int>(42);
+            Assert.AreEqual(42, s.Value);
+
+            s.OnNext(43);
+            Assert.AreEqual(43, s.Value);
+
+            s.OnNext(44);
+            Assert.AreEqual(44, s.Value);
+        }
+
+        [TestMethod]
+        public void Value_FrozenAfterOnCompleted()
+        {
+            var s = new BehaviorSubject<int>(42);
+            Assert.AreEqual(42, s.Value);
+
+            s.OnNext(43);
+            Assert.AreEqual(43, s.Value);
+
+            s.OnNext(44);
+            Assert.AreEqual(44, s.Value);
+
+            s.OnCompleted();
+            Assert.AreEqual(44, s.Value);
+
+            s.OnNext(1234);
+            Assert.AreEqual(44, s.Value);
+        }
+
+        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
+        public void Value_ThrowsAfterOnError()
+        {
+            var s = new BehaviorSubject<int>(42);
+            Assert.AreEqual(42, s.Value);
+
+            s.OnError(new InvalidOperationException());
+            
+            Assert.Fail("Should not be able to read Value: {0}", s.Value);
+        }
+
+        [TestMethod, ExpectedException(typeof(ObjectDisposedException))]
+        public void Value_ThrowsOnDispose()
+        {
+            var s = new BehaviorSubject<int>(42);
+            Assert.AreEqual(42, s.Value);
+
+            s.Dispose();
+
+            Assert.Fail("Should not be able to read Value: {0}", s.Value);
+        }
     }
 }
diff --git a/external/rx/Rx/NET/Source/packages.config b/external/rx/Rx/NET/Source/packages.config
new file mode 100644
index 0000000..e005221
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.Bcl" version="1.0.19" targetFramework="net40" />
+  <package id="Microsoft.Bcl.Async" version="1.0.16" targetFramework="net40" />
+  <package id="Microsoft.Bcl.Build" version="1.0.4" targetFramework="net40" />
+</packages>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/License.rtf b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/License.rtf
new file mode 100644
index 0000000..2fb0cf4
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/License.rtf
@@ -0,0 +1,505 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff40\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
+{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}
+{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????\'a8\'ac??};}
+{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Trebuchet MS{\*\falt Arial};}
+{\f40\fbidi \fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Tahoma{\*\falt ?? ??};}{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f42\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}
+{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
+{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f44\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
+{\f45\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f47\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f48\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f49\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
+{\f50\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f51\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f52\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f64\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}
+{\f65\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}{\f67\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f68\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f69\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}
+{\f70\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f71\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f72\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}
+{\f156\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f154\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f155\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}
+{\f157\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f158\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f161\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}
+{\f176\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ????\'a8\'ac??};}{\f384\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f385\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f387\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}
+{\f388\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f391\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f392\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f434\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}
+{\f435\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f437\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};}{\f438\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}
+{\f441\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\f444\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?? ??};}{\f445\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?? ??};}
+{\f447\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?? ??};}{\f448\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?? ??};}{\f449\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?? ??};}
+{\f450\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?? ??};}{\f451\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?? ??};}{\f452\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?? ??};}
+{\f453\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?? ??};}{\f456\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\f466\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western;}{\f464\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE;}
+{\f465\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f467\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f468\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f471\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic;}
+{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
+{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
+{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
+{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}
+{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}
+{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
+{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
+{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
+{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
+{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
+{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
+{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
+{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}
+{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}
+{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;
+\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;
+\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \f31506\fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 \styrsid15686224 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls5\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext1 \slink15 \sqformat \styrsid15686224 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 
+\ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat \styrsid15686224 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar
+\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext3 \slink17 \sqformat \styrsid15686224 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 
+\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat \styrsid15686224 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar
+\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext5 \slink19 \sqformat \styrsid15686224 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 
+\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat \styrsid15686224 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
+\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext7 \slink21 \sqformat \styrsid15686224 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 
+\af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat \styrsid15686224 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar
+\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext9 \slink23 \sqformat \styrsid15686224 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\*\cs15 \additive 
+\rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink1 \slocked \styrsid15686224 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 
+\sbasedon10 \slink2 \slocked \styrsid15686224 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink3 \slocked \styrsid15686224 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 
+\af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink4 \slocked \styrsid15686224 Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 
+\sbasedon10 \slink5 \slocked \styrsid15686224 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink6 \slocked \styrsid15686224 Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 
+\af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink7 \slocked \styrsid15686224 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 
+\sbasedon10 \slink8 \slocked \styrsid15686224 Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink9 \slocked \styrsid15686224 Heading 9 Char;}{
+\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext24 \styrsid15686224 Body 1;}{\s25\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 \styrsid15686224 Bullet 2;}{\s26\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
+\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext26 \styrsid15686224 Bullet 4;}{\s27\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext27 \styrsid15686224 Bullet 5;}{\s28\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af40\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid15686224 Heading EULA;}{\s29\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid15686224 
+Heading Software Title;}{\s30\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext30 \styrsid15686224 Preamble;}{\s31\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar
+\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls4\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon3 \snext31 \slink38 \styrsid15686224 Heading 3 Bold;}{\s32\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 
+\fs19\ul\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon26 \snext32 \styrsid15686224 Bullet 4 Underline;}{\*\cs33 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 
+\sbasedon10 \styrsid15686224 Body 2 Char;}{\*\cs34 \additive \rtlch\fcs1 \af40 \ltrch\fcs0 \f40\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid15686224 Body 3 Char;}{\s35\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon30 \snext35 \styrsid15686224 
+Preamble Border Above;}{\*\cs36 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 \styrsid15686224 Hyperlink,Char Char7;}{\s37\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \slink39 \styrsid15686224 Body 0 Bold;}{\*\cs38 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 
+\b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink31 \slocked \styrsid15686224 Heading 3 Bold Char;}{\*\cs39 \additive \rtlch\fcs1 \ab\af40\afs19 \ltrch\fcs0 \b\fs19\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink37 \slocked \styrsid15686224 
+Body 0 Bold Char;}{\*\cs40 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \f40\fs20 \sbasedon10 \slink41 \slocked \styrsid15686224 Bullet 3 Char1;}{\s41\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar
+\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0 \f40\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext41 \slink40 \styrsid15686224 Bullet 3;}{
+\s42\ql \fi-357\li357\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0 \f40\fs20\ul\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 
+\sbasedon41 \snext42 \sautoupd \styrsid15686224 Bullet 3 Underline;}{\s43\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext43 \slink44 \ssemihidden \sunhideused \styrsid3699522 Balloon Text;}{\*\cs44 \additive \rtlch\fcs1 \af40\afs16 \ltrch\fcs0 
+\fs16\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink43 \slocked \ssemihidden \styrsid3699522 Balloon Text Char;}{\*\cs45 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \sunhideused \styrsid3699522 annotation reference;}{
+\s46\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext46 \slink47 \ssemihidden \sunhideused \styrsid3699522 annotation text;}{\*\cs47 \additive \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\f40\hich\af40\dbch\af11 \sbasedon10 \slink46 \slocked \ssemihidden \styrsid3699522 
+Comment Text Char;}{\s48\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af40\afs20\alang1025 \ltrch\fcs0 
+\b\fs20\lang1033\langfe1033\loch\f40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon46 \snext46 \slink49 \ssemihidden \sunhideused \styrsid3699522 annotation subject;}{\*\cs49 \additive \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 
+\b\fs20\loch\f40\hich\af40\dbch\af11 \sbasedon47 \slink48 \slocked \ssemihidden \styrsid3699522 Comment Subject Char;}}{\*\listtable{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s31\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}
+{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s25\fi-363\li720
+\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
+\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
+\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}{\list\listtemplateid1904874988{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers
+\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\cf0\fbias0 \s1\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers
+\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s2\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers
+\'01;}\rtlch\fcs1 \ab\ai0\af40\afs20 \ltrch\fcs0 \b\i0\f40\fs20\fbias0 \s3\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers
+\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid285099256
+\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-308626962\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s42\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
+\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480
+\jclisttab\tx6480\lin6480 }{\listname ;}\listid1121073746}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812
+\'01\u-3913 ?;}{\levelnumbers;}\f3\cf17\fbias0 \s26\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 
+\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 
+\fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
+\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
+\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760
+\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }
+{\listname ;}\listid1567649130}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}
+\f3\fbias0 \s27\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440
+\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
+\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271}}{\*\listoverridetable{\listoverride\listid477573462\listoverridecount0\ls1}{\listoverride\listid1559511898\listoverridecount0\ls2}
+{\listoverride\listid1848404271\listoverridecount0\ls3}{\listoverride\listid398796681\listoverridecount0\ls4}{\listoverride\listid752163927\listoverridecount0\ls5}{\listoverride\listid398796681\listoverridecount9{\lfolevel\listoverridestartat
+\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel
+\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}{\lfolevel\listoverridestartat\levelstartat1}\ls6}{\listoverride\listid1567649130\listoverridecount0\ls7}{\listoverride\listid1559511898\listoverridecount0\ls8}
+{\listoverride\listid1121073746\listoverridecount0\ls9}{\listoverride\listid752163927\listoverridecount0\ls10}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp5\itap0\li0\ri0\sb0\sa300}{\pgp\ipgp2\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0
+\sa0}{\pgp\ipgp7\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp1\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp6\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid874403\rsid1473980\rsid2177578\rsid2693076\rsid3699522\rsid4000782\rsid4423363\rsid6097754\rsid7214391\rsid8995160\rsid10246973
+\rsid12062545\rsid13846008\rsid14566738\rsid14751308\rsid15014299\rsid15467703\rsid15686224\rsid15928942\rsid15934954}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info
+{\author kathan}{\operator Alok Shriram}{\creatim\yr2013\mo3\dy20\hr15\min24}{\revtim\yr2013\mo4\dy3\hr11\min6}{\version5}{\edmins3}{\nofpages4}{\nofwords1342}{\nofchars7656}{\*\company Microsoft Corporation}{\nofcharsws8981}{\vern57427}}
+{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect 
+\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
+\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1
+\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct
+\asianbrkrule\rsidroot15686224\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0
+{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang 
+{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang 
+{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
+\pard\plain \ltrpar\s28\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 MICROSOFT SOFTWARE LICENSE TERMS
+\par }\pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14566738 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid15686224\charrsid7214391 \hich\af40\dbch\af13\loch\f40 MICROSOFT }{\rtlch\fcs1 \ab\af40\afs20 
+\ltrch\fcs0 \b\fs20\dbch\af13\insrsid13846008 \hich\af40\dbch\af13\loch\f40 BCL }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid10246973 \hich\af40\dbch\af13\loch\f40 Portability Pack for .Net \hich\af40\dbch\af13\loch\f40 P
+\hich\af40\dbch\af13\loch\f40 latforms }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid7214391\charrsid7214391 \hich\af40\dbch\af13\loch\f40 PACKAGE}{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 
+\b\fs20\dbch\af13\insrsid15686224\charrsid7214391 \hich\af40\dbch\af13\loch\f40  }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid14751308\charrsid7214391 
+\par }\pard\plain \ltrpar\s29\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 
+\par }\pard\plain \ltrpar\s30\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 
+These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms 
+\hich\af40\dbch\af13\loch\f40 a\hich\af40\dbch\af13\loch\f40 lso apply to any Microsoft
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 updates,
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 supplements,
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 Internet-based services, and
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 support services
+\par }\pard\plain \ltrpar\s30\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 
+for this software, unless other terms accompany those items. If so, those terms apply.
+\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEP\hich\af40\dbch\af13\loch\f40 T THEM, DO NOT USE THE SOFTWARE.
+\par }\pard\plain \ltrpar\s35\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\insrsid15686224 \hich\af40\dbch\af11\loch\f40 IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.}{
+\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls5\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid14566738 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14566738 \hich\af40\dbch\af13\loch\f40   You}{\rtlch\fcs1 
+\ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14566738\charrsid15934954 \hich\af40\dbch\af13\loch\f40  may install and use any number of copies of the software on your devices to design, develop and test your pr\hich\af40\dbch\af13\loch\f40 ograms
+}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid14566738 .}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224\charrsid14566738 \hich\af40\dbch\af13\loch\f40 2.\tab}}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 
+\fs20\dbch\af13\insrsid15686224\charrsid14566738 \hich\af40\dbch\af13\loch\f40 DISTRIBUTABLE CODE. }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid14566738 \hich\af40\dbch\af13\loch\f40  }{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 
+\b0\fs20\dbch\af13\insrsid15686224\charrsid14566738 \hich\af40\dbch\af13\loch\f40 \hich\f40 The software is comprised of Distributable Code. \'93\loch\f40 \hich\f40 Distributable Code\'94\loch\f40 
+ is code that you are permitted to distribute in programs you develop if you comply with the terms below.
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid15686224 \hich\af39\dbch\af13\loch\f39 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls6\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 Right to Use and Distribute. 
+\par {\listtext\pard\plain\ltrpar \s42 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s42\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin1077\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0 \f40\fs20\ul\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 
+\ulnone\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 Yo\hich\af40\dbch\af13\loch\f40 u may copy and distribute the object code form of the software.
+\par {\listtext\pard\plain\ltrpar \s42 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af40 \ltrch\fcs0 \dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 
+Third Party Distribution}{\rtlch\fcs1 \af40 \ltrch\fcs0 \ulnone\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 . You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid15686224 \hich\af39\dbch\af13\loch\f39 b.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls6\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 Distribution Requirements. For any Distribu\hich\af40\dbch\af13\loch\f40 
+table Code you distribute, you must
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s41\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin1077\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0 \f40\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 
+\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 add significant primary functionality to it in your programs;
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+for any Distributable Code having a filename extension of .lib, distribute only the results of running such Distributable Code through a linker with your \hich\af40\dbch\af13\loch\f40 program;
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+distribute Distributable Code included in a setup program only as part of that setup program without modification; 
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+require distributors and external end users to agree to terms that protect it at least as much as this agreement;
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 display your valid copyright notice on your programs; and
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\hich\f40 \rquote \loch\f40  fees, related to the distribution or use of your programs.
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af39\afs20 \ltrch\fcs0 \b\fs20\loch\af39\hich\af39\dbch\af13\insrsid15686224 \hich\af39\dbch\af13\loch\f39 c.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls6\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 \dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 Distribution Restrictions. You may not
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s41\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin1077\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs20\alang1025 \ltrch\fcs0 \f40\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40 \ltrch\fcs0 
+\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 alter an\hich\af40\dbch\af13\loch\f40 y copyright, trademark or patent notice in the Distributable Code;
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 use Microsoft\hich\f40 \rquote \loch\f40 
+s trademarks in your programs\hich\f40 \rquote \loch\f40  names or in a way that suggests your programs come from or are endorsed by Microsoft;
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 distribute Distributable Code to run on a platform oth
+\hich\af40\dbch\af13\loch\f40 er than the Windows platform;
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+include Distributable Code in malicious, deceptive or unlawful programs; or
+\par {\listtext\pard\plain\ltrpar \s41 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License \hich\af40\dbch\af13\loch\f40 is one that requires, as a condition of use, modification or distribution, that
+
+\par {\listtext\pard\plain\ltrpar \s26 \rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \fs19\cf17\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s26\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin1435\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af40 \ltrch\fcs0 \dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 the code be disclosed or distributed in source code form; or
+\par {\listtext\pard\plain\ltrpar \s27 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s27\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1792\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 others have the right to modify it.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls5\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 SCOPE OF LICENSE.}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 
+ The software is licensed, not sold. This agreement onl\hich\af40\dbch\af13\loch\f40 
+y gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply wit
+\hich\af40\dbch\af13\loch\f40 h\hich\af40\dbch\af13\loch\f40  any technical limitations in the software that only allow you to use it in certain ways. You may not
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 work around any technical limitations in the software;
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+reverse engineer, decompile or disassemble the software, except and only to the extent that app\hich\af40\dbch\af13\loch\f40 licable law expressly permits, despite this limitation;
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+make more copies of the software than specified in this agreement or allowed by applicable law, despite this limitation;
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 publish the software for others to copy;
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 rent, lease or lend the software\hich\af40\dbch\af13\loch\f40 ;
+
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 transfer the software or this agreement to any third party; or
+
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 use the software for commercial software hosting services.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 4.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls5\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 BACKUP COPY.}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 
+ You may make one backup copy of the software. You may use it only to reinstall the software.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 5.\tab}}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 
+\hich\af40\dbch\af13\loch\f40 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40  A\hich\af40\dbch\af13\loch\f40 
+ny person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 6.\tab}}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 
+\hich\af40\dbch\af13\loch\f40 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40  The software is subject to United States export laws and regulations. You must comply wit
+\hich\af40\dbch\af13\loch\f40 h all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{\rtlch\fcs1 \ab0\af0\afs20 
+\ltrch\fcs0 \cs36\b0\fs20\ul\cf2\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 www.microsoft.com/exporting}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 .}{\rtlch\fcs1 \ab0\af0\afs20 \ltrch\fcs0 
+\cs36\b0\fs20\ul\cf2\dbch\af13\insrsid15686224 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 7.\tab}}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 
+\hich\af40\dbch\af13\loch\f40 SUPPORT SERVICES. }{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 Because this \hich\af40\dbch\af13\loch\f40 \hich\f40 software is \'93\loch\f40 \hich\f40 as is,\'94
+\loch\f40  we may not provide support services for it.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 8.\tab}}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 
+\hich\af40\dbch\af13\loch\f40 ENTIRE AGREEMENT.}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 
+ This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support s\hich\af40\dbch\af13\loch\f40 ervices.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 9.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls5\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid15686224 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 APPLICABLE LAW.
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls5\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 United States.}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 
+\b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 
+ If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws\hich\af40\dbch\af13\loch\f40 
+ of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 b.\tab}}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 
+\hich\af40\dbch\af13\loch\f40 Outside the United States.}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40  If you acquired the software in any other country, the laws of that country app
+\hich\af40\dbch\af13\loch\f40 ly.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 10.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls5\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 LEGAL EFFECT.}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 
+ This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your right
+\hich\af40\dbch\af13\loch\f40 s under the laws of your country if the laws of your country do not permit it to do so.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 11.\tab}}\pard \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls5\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15686224 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 \hich\f40 
+DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93\loch\f40 \hich\f40 AS-IS.\'94\loch\f40  YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HA\hich\af40\dbch\af13\loch\f40 
+VE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE A
+\hich\af40\dbch\af13\loch\f40 N\hich\af40\dbch\af13\loch\f40 D NON-INFRINGEMENT.
+\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 FOR AUSTRALIA \hich\f40 \endash \loch\f40 
+ YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\loch\af40\hich\af40\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 12.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls5\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid15686224 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\insrsid15686224 \hich\af40\dbch\af11\loch\f40 
+. YOU CAN RECOVER FROM MICROSOFT AND I\hich\af40\dbch\af11\loch\f40 TS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.
+\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 This limitation applies to
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 anything related to the software, services, content (inclu\hich\af40\dbch\af13\loch\f40 ding code) on third party Internet sites, or third party programs; and
+\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid15686224 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 
+claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.
+\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid15686224 \rtlch\fcs1 \af40\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15686224 \hich\af40\dbch\af13\loch\f40 It also applies even \hich\af40\dbch\af13\loch\f40 
+if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.
+\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15014299 {\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\dbch\af13\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 
+Please note: A\hich\af40\dbch\af13\loch\f40 s this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French.
+\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299 
+\par 
+\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 \hich\f40 Remarque : Ce logiciel \'e9\loch\f40 \hich\f40 tant distribu\'e9\loch\f40 \hich\f40  au Qu
+\'e9\loch\f40 \hich\f40 bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7\loch\f40 ais.
+\par \hich\af40\dbch\af13\loch\f40 EX\hich\af40\dbch\af13\loch\f40 \hich\f40 ON\'c9\loch\f40 RATION DE GARANTIE.}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 
+\hich\f40  Le logiciel vis\'e9\loch\f40 \hich\f40  par une licence est offert \'ab\loch\f40 \hich\f40  tel quel \'bb\loch\f40 \hich\f40 . Toute utilisation de ce logiciel est \'e0\loch\f40 \hich\f40  votre seule risque et p\'e9\loch\f40 ril. Microsoft n
+\hich\f40 \rquote \loch\f40 \hich\f40 accorde aucune autre garantie expresse. Vous pouvez b\'e9\loch\f40 \hich\f40 n\'e9\loch\f40 ficier de droits additionnels en vertu \hich\af40\dbch\af13\loch\f40 \hich\f40 
+du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9\loch\f40  marchande, d\hich\f40 \rquote \loch\f40 \hich\f40 ad\'e9\loch\f40 
+\hich\f40 quation \'e0\loch\f40  un usage particulier et d\hich\f40 \rquote \loch\f40 \hich\f40 absence de contrefa\'e7\loch\f40 on sont exclues.
+\par }{\rtlch\fcs1 \ab\af40\afs20 \ltrch\fcs0 \b\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 \hich\f40 LIMITATION DES DOMMAGES-INT\'c9\loch\f40 \hich\f40 R\'ca\loch\f40 \hich\f40 
+TS ET EXCLUSION DE RESPONSABILIT\'c9\loch\f40  POUR LES DOMMAGES.}{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 \hich\f40 
+ Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0\loch\f40 \hich\f40  hauteur de 5,00 $ US. Vous ne pouvez pr\'e9\loch\f40 \hich\f40 tendre \'e0\loch\f40  aucune in
+\hich\af40\dbch\af13\loch\f40 \hich\f40 demnisation pour les autres dommages, y compris les dommages sp\'e9\loch\f40 \hich\f40 ciaux, indirects ou accessoires et pertes de b\'e9\loch\f40 \hich\f40 n\'e9\loch\f40 fices.
+\par }{\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 Cette limitation concerne :
+\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\loch\af3\hich\af3\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard \ltrpar
+\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin360\itap0\pararsid15014299 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 
+\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 \hich\f40 tout ce qui est reli\'e9\loch\f40  au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites I
+\hich\af40\dbch\af13\loch\f40 nternet tiers ou dans des programmes tiers ; et
+\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\loch\af3\hich\af3\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \loch\af3\dbch\af13\hich\f3 \'b7\tab}\hich\af40\dbch\af13\loch\f40 \hich\f40 les r\'e9
+\loch\f40 \hich\f40 clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9\loch\f40 \hich\f40  stricte, de n\'e9\loch\f40 gligence ou d\hich\f40 \rquote \loch\f40 \hich\f40 une autre faute dans la limite autoris\'e9
+\loch\f40 e par la loi en vigueur.
+\par }\pard \ltrpar\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15014299 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 
+\hich\af40\dbch\af13\loch\f40 Elle s\hich\f40 \rquote \loch\f40 \hich\f40 applique \'e9\loch\f40 g\hich\af40\dbch\af13\loch\f40 \hich\f40 alement, m\'ea\loch\f40 \hich\f40 me si Microsoft connaissait ou devrait conna\'ee\loch\f40 tre l\hich\f40 \rquote 
+\'e9\loch\f40 \hich\f40 ventualit\'e9\loch\f40  d\hich\f40 \rquote \loch\f40 un tel dommage. Si votre pays n\hich\f40 \rquote \loch\f40 autorise pas l\hich\f40 \rquote \loch\f40 \hich\f40 exclusion ou la limitation de responsabilit\'e9\loch\f40 
+ pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut q\hich\af40\dbch\af13\loch\f40 u\hich\af40\dbch\af13\loch\f40 e la limitation ou l\hich\f40 \rquote \loch\f40 exclusion ci-dessus ne s\hich\f40 \rquote \loch\f40 
+\hich\f40 appliquera pas \'e0\loch\f40 \hich\f40  votre \'e9\loch\f40 gard.
+\par }\pard\plain \ltrpar\s37\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15014299 \rtlch\fcs1 \ab\af40\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af40\hich\af40\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af40\afs20 \ltrch\fcs0 \fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 EFFET JURIDIQUE.}{
+\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299\charrsid15014299 \hich\af40\dbch\af13\loch\f40 \hich\f40  Le pr\'e9\loch\f40 \hich\f40 sent contrat d\'e9\loch\f40 
+crit certains droits juridiques. Vous pourriez avoir d\hich\f40 \rquote \loch\f40 \hich\f40 autres droits pr\'e9\loch\f40 \hich\f40 vus par les lois de votre pays. Le pr\'e9\loch\f40 sent contrat ne modif\hich\af40\dbch\af13\loch\f40 \hich\f40 
+ie pas les droits que vous conf\'e8\loch\f40 rent les lois de votre pays si celles-ci ne le permettent pas}{\rtlch\fcs1 \ab0\af40\afs20 \ltrch\fcs0 \b0\fs20\lang1036\langfe1033\dbch\af13\langnp1036\insrsid15014299 .}{\rtlch\fcs1 \af40 \ltrch\fcs0 
+\insrsid4000782 
+\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
+9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
+5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
+b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
+0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
+a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
+c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
+0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
+a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
+6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
+4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
+4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f
+7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87
+615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad
+79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b
+5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab
+999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9
+699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586
+8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6
+0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f
+9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be
+15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979
+3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d
+32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a
+f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86
+e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90
+fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2
+ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae
+a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1
+399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5
+4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84
+0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b
+c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7
+689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20
+5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0
+aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d
+316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840
+545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a
+c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100
+0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7
+8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89
+d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500
+1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f
+bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6
+a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a
+0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021
+0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008
+00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000}
+{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
+617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
+6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
+656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
+{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 4;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 7;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;
+\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;
+\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;
+\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;
+\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;
+\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority59 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;
+\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;
+\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;
+\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;
+\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;
+\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;
+\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;
+\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;
+\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;
+\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;
+\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;
+\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;
+\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;
+\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;
+\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
+\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5;
+\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
+\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
+\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;
+\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
+\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;
+\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
+\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;
+\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;
+\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;
+\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;
+\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;
+\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;
+\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;
+\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;
+\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;
+\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;
+\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;
+\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;
+\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;
+\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;
+\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;
+\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;
+\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;
+\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;
+\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;
+\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;
+\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;
+\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;
+\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;
+\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;
+\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;
+\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000
+4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
+d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000008082
+82f39530ce01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000105000000000000}}
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/Microsoft.Bcl.1.0.19.nupkg b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/Microsoft.Bcl.1.0.19.nupkg
new file mode 100644
index 0000000..8383f69
Binary files /dev/null and b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/Microsoft.Bcl.1.0.19.nupkg differ
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/Microsoft.Bcl.1.0.19.nuspec b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/Microsoft.Bcl.1.0.19.nuspec
new file mode 100644
index 0000000..75e2625
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/Microsoft.Bcl.1.0.19.nuspec
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>Microsoft.Bcl</id>
+    <version>1.0.19</version>
+    <title>BCL Portability Pack for .NET Framework 4, Silverlight 4 and 5, and Windows Phone 7.5</title>
+    <authors>Microsoft</authors>
+    <owners>Microsoft</owners>
+    <licenseUrl>http://go.microsoft.com/fwlink/?LinkID=296435</licenseUrl>
+    <projectUrl>http://go.microsoft.com/fwlink/?LinkID=280057</projectUrl>
+    <iconUrl>http://go.microsoft.com/fwlink/?LinkID=288859</iconUrl>
+    <requireLicenseAcceptance>true</requireLicenseAcceptance>
+    <description>This packages enables projects targeting .NET Framework 4, Silverlight 4 and 5, and Windows Phone 7.5 (including any portable library combinations) to use new types from later versions of .NET including:
+
+CallerMemberNameAttribute
+CallerLineNumberAttribute
+CallerFilePathAttribute
+Tuple<T1, T2, ...>
+IProgress<T>
+IStructuralComparable
+IStructuralEquatable
+Task
+
+These types are "unified" to their later version equivalent. For example, when running on .NET Framework 4.5, IProgress<T> from this package will be seen by the runtime as the same type as the one already in the platform.
+
+This package is not required for projects targeting .NET Framework 4.5 or .NET for Windows Store apps. For known issues, please see: http://blogs.msdn.com/b/bclteam/p/asynctargetingpackkb.aspx.</description>
+    <summary>Adds support for types from later versions to .NET Framework 4, Silverlight 4 and 5, and Windows Phone 7.5.</summary>
+    <copyright>Copyright © Microsoft Corporation</copyright>
+    <tags>BCL Microsoft System Task IProgress</tags>
+    <dependencies>
+      <dependency id="Microsoft.Bcl.Build" version="1.0.4" />
+    </dependencies>
+    <references>
+      <reference file="System.Runtime.dll" />
+      <reference file="System.Threading.Tasks.dll" />
+      <reference file="_._" />
+    </references>
+  </metadata>
+</package>
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/ReleaseNotes.txt b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/ReleaseNotes.txt
new file mode 100644
index 0000000..1bb9317
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/ReleaseNotes.txt
@@ -0,0 +1,24 @@
+Changes in 1.0.16-rc
+- Fixed: Adding empty content to .NET 4.5, Windows Phone 8, Windows 8 and portable combinations, so that app.config transforms
+  are not applied to projects targeting them.
+
+Changes in 1.0.15-rc
+
+- Fixed: System.Runtime is missing a type forward for Tuple<T1, T2>
+
+Changes in 1.0.14-rc
+
+- Fixed: System.Runtime now has a fixed version for Phone 7.x due to the lack of a way to redirect them to a later version.
+
+Changes in 1.0.13-rc
+
+- Fixed: First-chance exceptions when running on Phone 7.x
+
+Changes in 1.0.12-rc
+
+- Fixed: Microsoft.Bcl.targets are not imported when using NuGet 2.0 to install Microsoft.Bcl
+- Changed: Pulled build targets into a separate package (Microsoft.Bcl.Build) so other BCL packages can depend on it.
+
+Changes in 1.0.11-beta
+
+- Initial release
\ No newline at end of file
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/net45/_._ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/net45/_._
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/portable-net45+win8+wp8/_._ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/portable-net45+win8+wp8/_._
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/sl4/_._ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/sl4/_._
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/sl5/_._ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/sl5/_._
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/win8/_._ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/win8/_._
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/wp8/_._ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/content/wp8/_._
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net40/System.Runtime.xml b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net40/System.Runtime.xml
new file mode 100644
index 0000000..93cb00d
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net40/System.Runtime.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Runtime</name>
+    </assembly>
+    <members>
+        <member name="T:System.IProgress`1">
+            <summary>Defines a provider for progress updates.</summary>
+            <typeparam name="T">The type of progress update value.</typeparam>
+        </member>
+        <member name="M:System.IProgress`1.Report(`0)">
+            <summary>Reports a progress update.</summary>
+            <param name="value">The value of the updated progress.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncStateMachineAttribute">
+            <summary>Identities the async state machine type for this method.</summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.StateMachineAttribute">
+            <summary>Identities the state machine type for this method.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.StateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.StateMachineAttribute.StateMachineType">
+            <summary>Gets the type that implements the state machine.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncStateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerMemberNameAttribute">
+            <summary>
+            Allows you to obtain the method or property name of the caller to the method.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerLineNumberAttribute">
+            <summary>
+            Allows you to obtain the line number in the source file at which the method is called.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerFilePathAttribute">
+            <summary>
+            Allows you to obtain the full path of the source file that contains the caller.
+            This is the file path at the time of compile.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IteratorStateMachineAttribute">
+            <summary>Identities the iterator state machine type for this method.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IteratorStateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+    </members>
+</doc>
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net40/System.Threading.Tasks.xml b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net40/System.Threading.Tasks.xml
new file mode 100644
index 0000000..b47921e
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net40/System.Threading.Tasks.xml
@@ -0,0 +1,475 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Threading.Tasks</name>
+    </assembly>
+    <members>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodBuilderCore">
+            <summary>Holds state related to the builder's IAsyncStateMachine.</summary>
+            <remarks>This is a mutable struct.  Be very delicate with it.</remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.m_stateMachine">
+            <summary>A reference to the heap-allocated state machine object associated with this builder.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument is null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.GetCompletionAction``2(``0@,``1@)">
+            <summary>
+            Gets the Action to use with an awaiter's OnCompleted or UnsafeOnCompleted method.
+            On first invocation, the supplied state machine will be boxed.
+            </summary>
+            <typeparam name="TMethodBuilder">Specifies the type of the method builder used.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine used.</typeparam>
+            <param name="builder">The builder.</param>
+            <param name="stateMachine">The state machine.</param>
+            <returns>An Action to provide to the awaiter.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner">
+            <summary>Provides the ability to invoke a state machine's MoveNext method under a supplied ExecutionContext.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.m_context">
+            <summary>The context with which to run MoveNext.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.m_stateMachine">
+            <summary>The state machine whose MoveNext method should be invoked.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.#ctor(System.ExecutionContextLightup)">
+            <summary>Initializes the runner.</summary>
+            <param name="context">The context with which to run MoveNext.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.Run">
+            <summary>Invokes MoveNext under the provided context.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.s_invokeMoveNext">
+            <summary>Cached delegate used with ExecutionContext.Run.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.InvokeMoveNext(System.Object)">
+            <summary>Invokes the MoveNext method on the supplied IAsyncStateMachine.</summary>
+            <param name="stateMachine">The IAsyncStateMachine machine instance.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1">
+            <summary>Provides a base class used to cache tasks of a specific return type.</summary>
+            <typeparam name="TResult">Specifies the type of results the cached tasks return.</typeparam>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.Singleton">
+            <summary>
+            A singleton cache for this result type.
+            This may be null if there are no cached tasks for this TResult.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.CreateCompleted(`0)">
+            <summary>Creates a non-disposable task.</summary>
+            <param name="result">The result for the task.</param>
+            <returns>The cacheable task.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.CreateCache">
+            <summary>Creates a cache.</summary>
+            <returns>A task cache for this result type.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.FromResult(`0)">
+            <summary>Gets a cached task if one exists.</summary>
+            <param name="result">The result for which we want a cached task.</param>
+            <returns>A cached task if one exists; otherwise, null.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache">
+            <summary>Provides a cache for Boolean tasks.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.m_true">
+            <summary>A true task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.m_false">
+            <summary>A false task.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.FromResult(System.Boolean)">
+            <summary>Gets a cached task for the Boolean result.</summary>
+            <param name="result">true or false</param>
+            <returns>A cached task for the Boolean result.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache">
+            <summary>Provides a cache for zero Int32 tasks.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.INCLUSIVE_INT32_MIN">
+            <summary>The minimum value, inclusive, for which we want a cached task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.EXCLUSIVE_INT32_MAX">
+            <summary>The maximum value, exclusive, for which we want a cached task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.Int32Tasks">
+            <summary>The cache of Task{Int32}.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.CreateInt32Tasks">
+            <summary>Creates an array of cached tasks for the values in the range [INCLUSIVE_MIN,EXCLUSIVE_MAX).</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.FromResult(System.Int32)">
+            <summary>Gets a cached task for the zero Int32 result.</summary>
+            <param name="result">The integer value</param>
+            <returns>A cached task for the Int32 result or null if not cached.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncServices.ThrowAsync(System.Exception,System.Threading.SynchronizationContext)">
+            <summary>Throws the exception on the ThreadPool.</summary>
+            <param name="exception">The exception to propagate.</param>
+            <param name="targetContext">The target context on which to propagate the exception.  Null to use the ThreadPool.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncServices.PrepareExceptionForRethrow(System.Exception)">
+            <summary>Copies the exception's stack trace so its stack trace isn't overwritten.</summary>
+            <param name="exc">The exception to prepare.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder">
+            <summary>
+            Provides a builder for asynchronous methods that return <see cref="T:System.Threading.Tasks.Task"/>.
+            This type is intended for compiler use only.
+            </summary>
+            <remarks>
+            AsyncTaskMethodBuilder is a value type, and thus it is copied by value.
+            Prior to being copied, one of its Task, SetResult, or SetException members must be accessed,
+            or else the copies may end up building distinct Task instances.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IAsyncMethodBuilder">
+            <summary>Represents an asynchronous method builder.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.s_cachedCompleted">
+            <summary>A cached VoidTaskResult task used for builders that complete synchronously.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.m_builder">
+            <summary>The generic builder object to which this non-generic instance delegates.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetResult">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">RanToCompletion</see> state.
+            </summary>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetException(System.Exception)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">Faulted</see> state with the specified exception.
+            </summary>
+            <param name="exception">The <see cref="T:System.Exception"/> to use to fault the task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetNotificationForWaitCompletion(System.Boolean)">
+            <summary>
+            Called by the debugger to request notification when the first wait operation
+            (await, Wait, Result, etc.) on this builder's task completes.
+            </summary>
+            <param name="enabled">
+            true to enable notification; false to disable a previously set notification.
+            </param>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Task">
+            <summary>Gets the <see cref="T:System.Threading.Tasks.Task"/> for this builder.</summary>
+            <returns>The <see cref="T:System.Threading.Tasks.Task"/> representing the builder's asynchronous operation.</returns>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger, and only in a single-threaded manner
+            when no other threads are in the middle of accessing this property or this.Task.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1">
+            <summary>
+            Provides a builder for asynchronous methods that return <see cref="T:System.Threading.Tasks.Task`1"/>.
+            This type is intended for compiler use only.
+            </summary>
+            <remarks>
+            AsyncTaskMethodBuilder{TResult} is a value type, and thus it is copied by value.
+            Prior to being copied, one of its Task, SetResult, or SetException members must be accessed,
+            or else the copies may end up building distinct Task instances.
+            </remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.s_defaultResultTask">
+            <summary>A cached task for default(TResult).</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_coreState">
+            <summary>State related to the IAsyncStateMachine.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_task">
+            <summary>The lazily-initialized task.</summary>
+            <remarks>Must be named m_task for debugger step-over to work correctly.</remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_taskCompletionSource">
+            <summary>The lazily-initialized task completion source.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.#cctor">
+            <summary>Temporary support for disabling crashing if tasks go unobserved.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(`0)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task`1"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">RanToCompletion</see> state with the specified result.
+            </summary>
+            <param name="result">The result to use to complete the task.</param>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(System.Threading.Tasks.TaskCompletionSource{`0})">
+            <summary>
+            Completes the builder by using either the supplied completed task, or by completing
+            the builder's previously accessed task using default(TResult).
+            </summary>
+            <param name="completedTask">A task already completed with the value default(TResult).</param>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetException(System.Exception)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task`1"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">Faulted</see> state with the specified exception.
+            </summary>
+            <param name="exception">The <see cref="T:System.Exception"/> to use to fault the task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetNotificationForWaitCompletion(System.Boolean)">
+            <summary>
+            Called by the debugger to request notification when the first wait operation
+            (await, Wait, Result, etc.) on this builder's task completes.
+            </summary>
+            <param name="enabled">
+            true to enable notification; false to disable a previously set notification.
+            </param>
+            <remarks>
+            This should only be invoked from within an asynchronous method,
+            and only by the debugger.
+            </remarks>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.GetTaskForResult(`0)">
+            <summary>
+            Gets a task for the specified result.  This will either
+            be a cached or new task, never null.
+            </summary>
+            <param name="result">The result for which we need a task.</param>
+            <returns>The completed task containing the result.</returns>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.CompletionSource">
+            <summary>Gets the lazily-initialized TaskCompletionSource.</summary>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Task">
+            <summary>Gets the <see cref="T:System.Threading.Tasks.Task`1"/> for this builder.</summary>
+            <returns>The <see cref="T:System.Threading.Tasks.Task`1"/> representing the builder's asynchronous operation.</returns>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger, and only in a single-threaded manner
+            when no other threads are in the middle of accessing this property or this.Task.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder">
+            <summary>
+            Provides a builder for asynchronous methods that return void.
+            This type is intended for compiler use only.
+            </summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_synchronizationContext">
+            <summary>The synchronization context associated with this operation.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_coreState">
+            <summary>State related to the IAsyncStateMachine.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_objectIdForDebugger">
+            <summary>An object used by the debugger to uniquely identify this builder.  Lazily initialized.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.#cctor">
+            <summary>Temporary support for disabling crashing if tasks go unobserved.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.PreventUnobservedTaskExceptions">
+            <summary>Registers with UnobservedTaskException to suppress exception crashing.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.s_preventUnobservedTaskExceptionsInvoked">
+            <summary>Non-zero if PreventUnobservedTaskExceptions has already been invoked.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.#ctor(System.Threading.SynchronizationContext)">
+            <summary>Initializes the <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</summary>
+            <param name="synchronizationContext">The synchronizationContext associated with this operation. This may be null.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetResult">
+            <summary>Completes the method builder successfully.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetException(System.Exception)">
+            <summary>Faults the method builder with an exception.</summary>
+            <param name="exception">The exception that is the cause of this fault.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.NotifySynchronizationContextOfCompletion">
+            <summary>Notifies the current synchronization context that the operation completed.</summary>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger and only in a single-threaded manner.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IAsyncStateMachine">
+            <summary>
+            Represents state machines generated for asynchronous methods.
+            This type is intended for compiler use only.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext">
+            <summary>Moves the state machine to its next state.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IAsyncStateMachine.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Configures the state machine with a heap-allocated replica.</summary>
+            <param name="stateMachine">The heap-allocated replica.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.ICriticalNotifyCompletion">
+            <summary>
+            Represents an awaiter used to schedule continuations when an await operation completes.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.INotifyCompletion">
+            <summary>
+            Represents an operation that will schedule continuations when the operation completes.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.INotifyCompletion.OnCompleted(System.Action)">
+            <summary>Schedules the continuation action to be invoked when the instance completes.</summary>
+            <param name="continuation">The action to invoke when the operation completes.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="continuation"/> argument is null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.ICriticalNotifyCompletion.UnsafeOnCompleted(System.Action)">
+            <summary>Schedules the continuation action to be invoked when the instance completes.</summary>
+            <param name="continuation">The action to invoke when the operation completes.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="continuation"/> argument is null (Nothing in Visual Basic).</exception>
+            <remarks>Unlike OnCompleted, UnsafeOnCompleted need not propagate ExecutionContext information.</remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.VoidTaskResult">
+            <summary>Used with Task(of void)</summary>
+        </member>
+    </members>
+</doc>
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net40/ensureRedirect.xml b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net40/ensureRedirect.xml
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net45/_._ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/net45/_._
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp71/System.Runtime.xml b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp71/System.Runtime.xml
new file mode 100644
index 0000000..53f5bef
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp71/System.Runtime.xml
@@ -0,0 +1,860 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Runtime</name>
+    </assembly>
+    <members>
+        <member name="T:System.Strings">
+            <summary>
+              A strongly-typed resource class, for looking up localized strings, etc.
+            </summary>
+        </member>
+        <member name="P:System.Strings.ResourceManager">
+            <summary>
+              Returns the cached ResourceManager instance used by this class.
+            </summary>
+        </member>
+        <member name="P:System.Strings.Culture">
+            <summary>
+              Overrides the current thread's CurrentUICulture property for all
+              resource lookups using this strongly typed resource class.
+            </summary>
+        </member>
+        <member name="P:System.Strings.ArgumentException_TupleIncorrectType">
+            <summary>
+              Looks up a localized string similar to Argument must be of type {0}..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ArgumentException_TupleLastArgumentNotATuple">
+            <summary>
+              Looks up a localized string similar to The last element of an eight element tuple must be a Tuple..
+            </summary>
+        </member>
+        <member name="T:System.Collections.IStructuralEquatable">
+            <summary>
+                Defines methods to support the comparison of objects for structural equality. 
+            </summary>
+        </member>
+        <member name="M:System.Collections.IStructuralEquatable.Equals(System.Object,System.Collections.IEqualityComparer)">
+            <summary>
+                Determines whether an object is structurally equal to the current instance.
+            </summary>
+            <param name="other">The object to compare with the current instance.</param>
+            <param name="comparer">An object that determines whether the current instance and other are equal. </param>
+            <returns>true if the two objects are equal; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Collections.IStructuralEquatable.GetHashCode(System.Collections.IEqualityComparer)">
+            <summary>
+                Returns a hash code for the current instance.
+            </summary>
+            <param name="comparer">An object that computes the hash code of the current object.</param>
+            <returns>The hash code for the current instance.</returns>
+        </member>
+        <member name="T:System.Collections.IStructuralComparable">
+            <summary>
+                Supports the structural comparison of collection objects.
+            </summary>
+        </member>
+        <member name="M:System.Collections.IStructuralComparable.CompareTo(System.Object,System.Collections.IComparer)">
+            <summary>
+                Determines whether the current collection object precedes, occurs in the same position as, or follows another object in the sort order.
+            </summary>
+            <param name="other">The object to compare with the current instance.</param>
+            <param name="comparer">An object that compares members of the current collection object with the corresponding members of other.</param>
+            <returns>An integer that indicates the relationship of the current collection object to other.</returns>
+            <exception cref="T:System.ArgumentException">
+                This instance and other are not the same type.
+            </exception>
+        </member>
+        <member name="T:System.Func`6">
+            <summary>
+                Encapsulates a method that has five parameters and returns a value of the type specified by the TResult parameter.
+            </summary>
+            <typeparam name="T1">The type of the first parameter of the method that this delegate encapsulates.</typeparam>
+            <typeparam name="T2">The type of the second parameter of the method that this delegate encapsulates.</typeparam>
+            <typeparam name="T3">The type of the third parameter of the method that this delegate encapsulates.</typeparam>
+            <typeparam name="T4">The type of the fourth parameter of the method that this delegate encapsulates.</typeparam>
+            <typeparam name="T5">The type of the fifth parameter of the method that this delegate encapsulates.</typeparam>
+            <typeparam name="TResult">The type of the return value of the method that this delegate encapsulates.</typeparam>
+            <param name="arg1">The first parameter of the method that this delegate encapsulates.</param>
+            <param name="arg2">The second parameter of the method that this delegate encapsulates.</param>
+            <param name="arg3">The third parameter of the method that this delegate encapsulates.</param>
+            <param name="arg4">The fourth parameter of the method that this delegate encapsulates.</param>
+            <param name="arg5">The fifth parameter of the method that this delegate encapsulates.</param>
+            <returns>The return value of the method that this delegate encapsulates.</returns>
+        </member>
+        <member name="T:System.IProgress`1">
+            <summary>Defines a provider for progress updates.</summary>
+            <typeparam name="T">The type of progress update value.</typeparam>
+        </member>
+        <member name="M:System.IProgress`1.Report(`0)">
+            <summary>Reports a progress update.</summary>
+            <param name="value">The value of the updated progress.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncStateMachineAttribute">
+            <summary>Identities the async state machine type for this method.</summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.StateMachineAttribute">
+            <summary>Identities the state machine type for this method.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.StateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.StateMachineAttribute.StateMachineType">
+            <summary>Gets the type that implements the state machine.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncStateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerMemberNameAttribute">
+            <summary>
+            Allows you to obtain the method or property name of the caller to the method.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerLineNumberAttribute">
+            <summary>
+            Allows you to obtain the line number in the source file at which the method is called.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerFilePathAttribute">
+            <summary>
+            Allows you to obtain the full path of the source file that contains the caller.
+            This is the file path at the time of compile.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IteratorStateMachineAttribute">
+            <summary>Identities the iterator state machine type for this method.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IteratorStateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+        <member name="T:System.ITuple">
+            <summary>
+            Helper so we can call some tuple methods recursively without knowing the underlying types.
+            </summary>
+        </member>
+        <member name="T:System.Tuple">
+            <summary>
+                Provides static methods for creating tuple objects. 
+            </summary>
+        </member>
+        <member name="M:System.Tuple.Create``1(``0)">
+            <summary>
+                Creates a new 1-tuple, or singleton.
+            </summary>
+            <typeparam name="T1">The type of the only component of the tuple.</typeparam>
+            <param name="item1">The value of the only component of the tuple.</param>
+            <returns>A tuple whose value is (item1).</returns>
+        </member>
+        <member name="M:System.Tuple.Create``2(``0,``1)">
+            <summary>
+                Creates a new 3-tuple, or pair.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <returns>An 2-tuple (pair) whose value is (item1, item2).</returns>
+        </member>
+        <member name="M:System.Tuple.Create``3(``0,``1,``2)">
+            <summary>
+                Creates a new 3-tuple, or triple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <returns>An 3-tuple (triple) whose value is (item1, item2, item3).</returns>
+        </member>
+        <member name="M:System.Tuple.Create``4(``0,``1,``2,``3)">
+            <summary>
+                Creates a new 4-tuple, or quadruple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <returns>An 4-tuple (quadruple) whose value is (item1, item2, item3, item4).</returns>
+        </member>
+        <member name="M:System.Tuple.Create``5(``0,``1,``2,``3,``4)">
+            <summary>
+                Creates a new 5-tuple, or quintuple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <typeparam name="T5">The type of the fifth component of the tuple.</typeparam>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <param name="item5">The value of the fifth component of the tuple.</param>
+            <returns>An 5-tuple (quintuple) whose value is (item1, item2, item3, item4, item5).</returns>
+        </member>
+        <member name="M:System.Tuple.Create``6(``0,``1,``2,``3,``4,``5)">
+            <summary>
+                Creates a new 6-tuple, or sextuple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <typeparam name="T5">The type of the fifth component of the tuple.</typeparam>
+            <typeparam name="T6">The type of the sixth component of the tuple.</typeparam>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <param name="item5">The value of the fifth component of the tuple.</param>
+            <param name="item6">The value of the sixth component of the tuple.</param>
+            <returns>An 6-tuple (sextuple) whose value is (item1, item2, item3, item4, item5, item6).</returns>
+        </member>
+        <member name="M:System.Tuple.Create``7(``0,``1,``2,``3,``4,``5,``6)">
+            <summary>
+                Creates a new 7-tuple, or septuple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <typeparam name="T5">The type of the fifth component of the tuple.</typeparam>
+            <typeparam name="T6">The type of the sixth component of the tuple.</typeparam>
+            <typeparam name="T7">The type of the seventh component of the tuple.</typeparam>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <param name="item5">The value of the fifth component of the tuple.</param>
+            <param name="item6">The value of the sixth component of the tuple.</param>
+            <param name="item7">The value of the seventh component of the tuple.</param>
+            <returns>An 7-tuple (septuple) whose value is (item1, item2, item3, item4, item5, item6, item7).</returns>
+        </member>
+        <member name="M:System.Tuple.Create``8(``0,``1,``2,``3,``4,``5,``6,``7)">
+            <summary>
+                Creates a new 8-tuple, or octuple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <typeparam name="T5">The type of the fifth component of the tuple.</typeparam>
+            <typeparam name="T6">The type of the sixth component of the tuple.</typeparam>
+            <typeparam name="T7">The type of the seventh component of the tuple.</typeparam>
+            <typeparam name="T8">The type of the eighth component of the tuple.</typeparam>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <param name="item5">The value of the fifth component of the tuple.</param>
+            <param name="item6">The value of the sixth component of the tuple.</param>
+            <param name="item7">The value of the seventh component of the tuple.</param>
+            <param name="item8">The value of the eighth component of the tuple.</param>
+            <returns>An 8-tuple (octuple) whose value is (item1, item2, item3, item4, item5, item6, item7, item8).</returns>
+        </member>
+        <member name="T:System.Tuple`1">
+            <summary>
+                Represents a 1-tuple, or singleton. 
+            </summary>
+            <typeparam name="T1">The type of the tuple's only component.</typeparam>
+        </member>
+        <member name="M:System.Tuple`1.#ctor(`0)">
+            <summary>
+                Initializes a new instance of the <see cref="T:System.Tuple`1"/> class.
+            </summary>
+            <param name="item1">The value of the current tuple object's single component.</param>
+        </member>
+        <member name="M:System.Tuple`1.Equals(System.Object)">
+            <summary>
+                Returns a value that indicates whether the current tuple object is equal to a specified object.
+            </summary>
+            <param name="obj">The object to compare with this instance.</param>
+            <returns>true if the current instance is equal to the specified object; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Tuple`1.GetHashCode">
+            <summary>
+                Calculates the hash code for the current tuple object.
+            </summary>
+            <returns>A 32-bit signed integer hash code.</returns>
+        </member>
+        <member name="M:System.Tuple`1.ToString">
+            <summary>
+                Returns a string that represents the value of this tuple instance.
+            </summary>
+            <returns>The string representation of this tuple object.</returns>
+        </member>
+        <member name="P:System.Tuple`1.Item1">
+            <summary>
+                Gets the value of the tuple object's single component. 
+            </summary>
+            <value>
+                The value of the current tuple object's single component.
+            </value>
+        </member>
+        <member name="T:System.Tuple`2">
+            <summary>
+                Represents an 2-tuple, or pair.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+        </member>
+        <member name="M:System.Tuple`2.#ctor(`0,`1)">
+            <summary>
+                Initializes a new instance of the <see cref="T:System.Tuple`2"/> class.
+            </summary>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+        </member>
+        <member name="M:System.Tuple`2.Equals(System.Object)">
+            <summary>
+                Returns a value that indicates whether the current tuple object is equal to a specified object.
+            </summary>
+            <param name="obj">The object to compare with this instance.</param>
+            <returns>true if the current instance is equal to the specified object; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Tuple`2.GetHashCode">
+            <summary>
+                Calculates the hash code for the current tuple object.
+            </summary>
+            <returns>A 32-bit signed integer hash code.</returns>
+        </member>
+        <member name="M:System.Tuple`2.ToString">
+            <summary>
+                Returns a string that represents the value of this tuple instance.
+            </summary>
+            <returns>The string representation of this tuple object.</returns>
+        </member>
+        <member name="P:System.Tuple`2.Item1">
+            <summary>
+                Gets the value of the current tuple object's first component.
+            </summary>
+            <value>
+                The value of the current tuple object's first component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`2.Item2">
+            <summary>
+                Gets the value of the current tuple object's second component.
+            </summary>
+            <value>
+                The value of the current tuple object's second component.
+            </value>
+        </member>
+        <member name="T:System.Tuple`3">
+            <summary>
+                Represents an 3-tuple, or triple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+        </member>
+        <member name="M:System.Tuple`3.#ctor(`0,`1,`2)">
+            <summary>
+                Initializes a new instance of the <see cref="T:System.Tuple`3"/> class.
+            </summary>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+        </member>
+        <member name="M:System.Tuple`3.Equals(System.Object)">
+            <summary>
+                Returns a value that indicates whether the current tuple object is equal to a specified object.
+            </summary>
+            <param name="obj">The object to compare with this instance.</param>
+            <returns>true if the current instance is equal to the specified object; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Tuple`3.GetHashCode">
+            <summary>
+                Calculates the hash code for the current tuple object.
+            </summary>
+            <returns>A 32-bit signed integer hash code.</returns>
+        </member>
+        <member name="M:System.Tuple`3.ToString">
+            <summary>
+                Returns a string that represents the value of this tuple instance.
+            </summary>
+            <returns>The string representation of this tuple object.</returns>
+        </member>
+        <member name="P:System.Tuple`3.Item1">
+            <summary>
+                Gets the value of the current tuple object's first component.
+            </summary>
+            <value>
+                The value of the current tuple object's first component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`3.Item2">
+            <summary>
+                Gets the value of the current tuple object's second component.
+            </summary>
+            <value>
+                The value of the current tuple object's second component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`3.Item3">
+            <summary>
+                Gets the value of the current tuple object's third component.
+            </summary>
+            <value>
+                The value of the current tuple object's third component.
+            </value>
+        </member>
+        <member name="T:System.Tuple`4">
+            <summary>
+                Represents an 4-tuple, or quadruple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+        </member>
+        <member name="M:System.Tuple`4.#ctor(`0,`1,`2,`3)">
+            <summary>
+                Initializes a new instance of the <see cref="T:System.Tuple`4"/> class.
+            </summary>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+        </member>
+        <member name="M:System.Tuple`4.Equals(System.Object)">
+            <summary>
+                Returns a value that indicates whether the current tuple object is equal to a specified object.
+            </summary>
+            <param name="obj">The object to compare with this instance.</param>
+            <returns>true if the current instance is equal to the specified object; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Tuple`4.GetHashCode">
+            <summary>
+                Calculates the hash code for the current tuple object.
+            </summary>
+            <returns>A 32-bit signed integer hash code.</returns>
+        </member>
+        <member name="M:System.Tuple`4.ToString">
+            <summary>
+                Returns a string that represents the value of this tuple instance.
+            </summary>
+            <returns>The string representation of this tuple object.</returns>
+        </member>
+        <member name="P:System.Tuple`4.Item1">
+            <summary>
+                Gets the value of the current tuple object's first component.
+            </summary>
+            <value>
+                The value of the current tuple object's first component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`4.Item2">
+            <summary>
+                Gets the value of the current tuple object's second component.
+            </summary>
+            <value>
+                The value of the current tuple object's second component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`4.Item3">
+            <summary>
+                Gets the value of the current tuple object's third component.
+            </summary>
+            <value>
+                The value of the current tuple object's third component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`4.Item4">
+            <summary>
+                Gets the value of the current tuple object's fourth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fourth component.
+            </value>
+        </member>
+        <member name="T:System.Tuple`5">
+            <summary>
+                Represents an 5-tuple, or quintuple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <typeparam name="T5">The type of the fifth component of the tuple.</typeparam>
+        </member>
+        <member name="M:System.Tuple`5.#ctor(`0,`1,`2,`3,`4)">
+            <summary>
+                Initializes a new instance of the <see cref="T:System.Tuple`5"/> class.
+            </summary>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <param name="item5">The value of the fifth component of the tuple.</param>
+        </member>
+        <member name="M:System.Tuple`5.Equals(System.Object)">
+            <summary>
+                Returns a value that indicates whether the current tuple object is equal to a specified object.
+            </summary>
+            <param name="obj">The object to compare with this instance.</param>
+            <returns>true if the current instance is equal to the specified object; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Tuple`5.GetHashCode">
+            <summary>
+                Calculates the hash code for the current tuple object.
+            </summary>
+            <returns>A 32-bit signed integer hash code.</returns>
+        </member>
+        <member name="M:System.Tuple`5.ToString">
+            <summary>
+                Returns a string that represents the value of this tuple instance.
+            </summary>
+            <returns>The string representation of this tuple object.</returns>
+        </member>
+        <member name="P:System.Tuple`5.Item1">
+            <summary>
+                Gets the value of the current tuple object's first component.
+            </summary>
+            <value>
+                The value of the current tuple object's first component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`5.Item2">
+            <summary>
+                Gets the value of the current tuple object's second component.
+            </summary>
+            <value>
+                The value of the current tuple object's second component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`5.Item3">
+            <summary>
+                Gets the value of the current tuple object's third component.
+            </summary>
+            <value>
+                The value of the current tuple object's third component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`5.Item4">
+            <summary>
+                Gets the value of the current tuple object's fourth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fourth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`5.Item5">
+            <summary>
+                Gets the value of the current tuple object's fifth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fifth component.
+            </value>
+        </member>
+        <member name="T:System.Tuple`6">
+            <summary>
+                Represents an 6-tuple, or sextuple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <typeparam name="T5">The type of the fifth component of the tuple.</typeparam>
+            <typeparam name="T6">The type of the sixth component of the tuple.</typeparam>
+        </member>
+        <member name="M:System.Tuple`6.#ctor(`0,`1,`2,`3,`4,`5)">
+            <summary>
+                Initializes a new instance of the <see cref="T:System.Tuple`6"/> class.
+            </summary>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <param name="item5">The value of the fifth component of the tuple.</param>
+            <param name="item6">The value of the sixth component of the tuple.</param>
+        </member>
+        <member name="M:System.Tuple`6.Equals(System.Object)">
+            <summary>
+                Returns a value that indicates whether the current tuple object is equal to a specified object.
+            </summary>
+            <param name="obj">The object to compare with this instance.</param>
+            <returns>true if the current instance is equal to the specified object; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Tuple`6.GetHashCode">
+            <summary>
+                Calculates the hash code for the current tuple object.
+            </summary>
+            <returns>A 32-bit signed integer hash code.</returns>
+        </member>
+        <member name="M:System.Tuple`6.ToString">
+            <summary>
+                Returns a string that represents the value of this tuple instance.
+            </summary>
+            <returns>The string representation of this tuple object.</returns>
+        </member>
+        <member name="P:System.Tuple`6.Item1">
+            <summary>
+                Gets the value of the current tuple object's first component.
+            </summary>
+            <value>
+                The value of the current tuple object's first component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`6.Item2">
+            <summary>
+                Gets the value of the current tuple object's second component.
+            </summary>
+            <value>
+                The value of the current tuple object's second component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`6.Item3">
+            <summary>
+                Gets the value of the current tuple object's third component.
+            </summary>
+            <value>
+                The value of the current tuple object's third component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`6.Item4">
+            <summary>
+                Gets the value of the current tuple object's fourth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fourth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`6.Item5">
+            <summary>
+                Gets the value of the current tuple object's fifth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fifth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`6.Item6">
+            <summary>
+                Gets the value of the current tuple object's sixth component.
+            </summary>
+            <value>
+                The value of the current tuple object's sixth component.
+            </value>
+        </member>
+        <member name="T:System.Tuple`7">
+            <summary>
+                Represents an 7-tuple, or septuple.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <typeparam name="T5">The type of the fifth component of the tuple.</typeparam>
+            <typeparam name="T6">The type of the sixth component of the tuple.</typeparam>
+            <typeparam name="T7">The type of the seventh component of the tuple.</typeparam>
+        </member>
+        <member name="M:System.Tuple`7.#ctor(`0,`1,`2,`3,`4,`5,`6)">
+            <summary>
+                Initializes a new instance of the <see cref="T:System.Tuple`7"/> class.
+            </summary>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <param name="item5">The value of the fifth component of the tuple.</param>
+            <param name="item6">The value of the sixth component of the tuple.</param>
+            <param name="item7">The value of the seventh component of the tuple.</param>
+        </member>
+        <member name="M:System.Tuple`7.Equals(System.Object)">
+            <summary>
+                Returns a value that indicates whether the current tuple object is equal to a specified object.
+            </summary>
+            <param name="obj">The object to compare with this instance.</param>
+            <returns>true if the current instance is equal to the specified object; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Tuple`7.GetHashCode">
+            <summary>
+                Calculates the hash code for the current tuple object.
+            </summary>
+            <returns>A 32-bit signed integer hash code.</returns>
+        </member>
+        <member name="M:System.Tuple`7.ToString">
+            <summary>
+                Returns a string that represents the value of this tuple instance.
+            </summary>
+            <returns>The string representation of this tuple object.</returns>
+        </member>
+        <member name="P:System.Tuple`7.Item1">
+            <summary>
+                Gets the value of the current tuple object's first component.
+            </summary>
+            <value>
+                The value of the current tuple object's first component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`7.Item2">
+            <summary>
+                Gets the value of the current tuple object's second component.
+            </summary>
+            <value>
+                The value of the current tuple object's second component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`7.Item3">
+            <summary>
+                Gets the value of the current tuple object's third component.
+            </summary>
+            <value>
+                The value of the current tuple object's third component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`7.Item4">
+            <summary>
+                Gets the value of the current tuple object's fourth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fourth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`7.Item5">
+            <summary>
+                Gets the value of the current tuple object's fifth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fifth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`7.Item6">
+            <summary>
+                Gets the value of the current tuple object's sixth component.
+            </summary>
+            <value>
+                The value of the current tuple object's sixth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`7.Item7">
+            <summary>
+                Gets the value of the current tuple object's seventh component.
+            </summary>
+            <value>
+                The value of the current tuple object's seventh component.
+            </value>
+        </member>
+        <member name="T:System.Tuple`8">
+            <summary>
+                Represents an n-tuple, where n is 8 or greater.
+            </summary>
+            <typeparam name="T1">The type of the first component of the tuple.</typeparam>
+            <typeparam name="T2">The type of the second component of the tuple.</typeparam>
+            <typeparam name="T3">The type of the third component of the tuple.</typeparam>
+            <typeparam name="T4">The type of the fourth component of the tuple.</typeparam>
+            <typeparam name="T5">The type of the fifth component of the tuple.</typeparam>
+            <typeparam name="T6">The type of the sixth component of the tuple.</typeparam>
+            <typeparam name="T7">The type of the seventh component of the tuple.</typeparam>
+            <typeparam name="TRest">Any generic Tuple object that defines the types of the tuple's remaining components.</typeparam>
+        </member>
+        <member name="M:System.Tuple`8.#ctor(`0,`1,`2,`3,`4,`5,`6,`7)">
+            <summary>
+                Initializes a new instance of the <see cref="T:System.Tuple`8"/> class.
+            </summary>
+            <param name="item1">The value of the first component of the tuple.</param>
+            <param name="item2">The value of the second component of the tuple.</param>
+            <param name="item3">The value of the third component of the tuple.</param>
+            <param name="item4">The value of the fourth component of the tuple.</param>
+            <param name="item5">The value of the fifth component of the tuple.</param>
+            <param name="item6">The value of the sixth component of the tuple.</param>
+            <param name="item7">The value of the seventh component of the tuple.</param>
+            <param name="rest">Any generic Tuple object that contains the values of the tuple's remaining components.</param>
+            <exception cref="T:System.ArgumentException">
+                rest is not a generic Tuple object.
+            </exception>
+        </member>
+        <member name="M:System.Tuple`8.Equals(System.Object)">
+            <summary>
+                Returns a value that indicates whether the current tuple object is equal to a specified object.
+            </summary>
+            <param name="obj">The object to compare with this instance.</param>
+            <returns>true if the current instance is equal to the specified object; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Tuple`8.GetHashCode">
+            <summary>
+                Calculates the hash code for the current tuple object.
+            </summary>
+            <returns>A 32-bit signed integer hash code.</returns>
+        </member>
+        <member name="M:System.Tuple`8.ToString">
+            <summary>
+                Returns a string that represents the value of this tuple instance.
+            </summary>
+            <returns>The string representation of this tuple object.</returns>
+        </member>
+        <member name="P:System.Tuple`8.Item1">
+            <summary>
+                Gets the value of the current tuple object's first component.
+            </summary>
+            <value>
+                The value of the current tuple object's first component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`8.Item2">
+            <summary>
+                Gets the value of the current tuple object's second component.
+            </summary>
+            <value>
+                The value of the current tuple object's second component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`8.Item3">
+            <summary>
+                Gets the value of the current tuple object's third component.
+            </summary>
+            <value>
+                The value of the current tuple object's third component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`8.Item4">
+            <summary>
+                Gets the value of the current tuple object's fourth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fourth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`8.Item5">
+            <summary>
+                Gets the value of the current tuple object's fifth component.
+            </summary>
+            <value>
+                The value of the current tuple object's fifth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`8.Item6">
+            <summary>
+                Gets the value of the current tuple object's sixth component.
+            </summary>
+            <value>
+                The value of the current tuple object's sixth component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`8.Item7">
+            <summary>
+                Gets the value of the current tuple object's seventh component.
+            </summary>
+            <value>
+                The value of the current tuple object's seventh component.
+            </value>
+        </member>
+        <member name="P:System.Tuple`8.Rest">
+            <summary>
+                Gets the current tuple object's remaining components.
+            </summary>
+            <value>
+                The value of the current tuple object's remaining components.
+            </value>
+        </member>
+    </members>
+</doc>
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp71/System.Threading.Tasks.xml b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp71/System.Threading.Tasks.xml
new file mode 100644
index 0000000..6c77012
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp71/System.Threading.Tasks.xml
@@ -0,0 +1,8969 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Threading.Tasks</name>
+    </assembly>
+    <members>
+        <member name="T:System.AggregateException">
+            <summary>Represents one or more errors that occur during application execution.</summary>
+            <remarks>
+            <see cref="T:System.AggregateException"/> is used to consolidate multiple failures into a single, throwable
+            exception object.
+            </remarks>
+        </member>
+        <member name="M:System.AggregateException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class.
+            </summary>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with
+            a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with a specified error
+            message and a reference to the inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerException"/> argument
+            is null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.Collections.Generic.IEnumerable{System.Exception})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with
+            references to the inner exceptions that are the cause of this exception.
+            </summary>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.Exception[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with
+            references to the inner exceptions that are the cause of this exception.
+            </summary>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String,System.Collections.Generic.IEnumerable{System.Exception})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with a specified error
+            message and references to the inner exceptions that are the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String,System.Exception[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with a specified error
+            message and references to the inner exceptions that are the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String,System.Collections.Generic.IList{System.Exception})">
+            <summary>
+            Allocates a new aggregate exception with the specified message and list of inner exceptions.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.GetBaseException">
+            <summary>
+            Returns the <see cref="T:System.AggregateException"/> that is the root cause of this exception.
+            </summary>
+        </member>
+        <member name="M:System.AggregateException.Handle(System.Func{System.Exception,System.Boolean})">
+            <summary>
+            Invokes a handler on each <see cref="T:System.Exception"/> contained by this <see cref="T:System.AggregateException"/>.
+            </summary>
+            <param name="predicate">The predicate to execute for each exception. The predicate accepts as an
+            argument the <see cref="T:System.Exception"/> to be processed and returns a Boolean to indicate
+            whether the exception was handled.</param>
+            <remarks>
+            Each invocation of the <paramref name="predicate"/> returns true or false to indicate whether the
+            <see cref="T:System.Exception"/> was handled. After all invocations, if any exceptions went
+            unhandled, all unhandled exceptions will be put into a new <see cref="T:System.AggregateException"/>
+            which will be thrown. Otherwise, the <see cref="M:System.AggregateException.Handle(System.Func{System.Exception,System.Boolean})"/> method simply returns. If any
+            invocations of the <paramref name="predicate"/> throws an exception, it will halt the processing
+            of any more exceptions and immediately propagate the thrown exception as-is.
+            </remarks>
+            <exception cref="T:System.AggregateException">An exception contained by this <see cref="T:System.AggregateException"/> was not handled.</exception>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="predicate"/> argument is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.Flatten">
+            <summary>
+            Flattens an <see cref="T:System.AggregateException"/> instances into a single, new instance.
+            </summary>
+            <returns>A new, flattened <see cref="T:System.AggregateException"/>.</returns>
+            <remarks>
+            If any inner exceptions are themselves instances of
+            <see cref="T:System.AggregateException"/>, this method will recursively flatten all of them. The
+            inner exceptions returned in the new <see cref="T:System.AggregateException"/>
+            will be the union of all of the the inner exceptions from exception tree rooted at the provided
+            <see cref="T:System.AggregateException"/> instance.
+            </remarks>
+        </member>
+        <member name="M:System.AggregateException.ToString">
+            <summary>
+            Creates and returns a string representation of the current <see cref="T:System.AggregateException"/>.
+            </summary>
+            <returns>A string representation of the current exception.</returns>
+        </member>
+        <member name="P:System.AggregateException.InnerExceptions">
+            <summary>
+            Gets a read-only collection of the <see cref="T:System.Exception"/> instances that caused the
+            current exception.
+            </summary>
+        </member>
+        <member name="T:System.Strings">
+            <summary>
+              A strongly-typed resource class, for looking up localized strings, etc.
+            </summary>
+        </member>
+        <member name="P:System.Strings.ResourceManager">
+            <summary>
+              Returns the cached ResourceManager instance used by this class.
+            </summary>
+        </member>
+        <member name="P:System.Strings.Culture">
+            <summary>
+              Overrides the current thread's CurrentUICulture property for all
+              resource lookups using this strongly typed resource class.
+            </summary>
+        </member>
+        <member name="P:System.Strings.AggregateException_ctor_DefaultMessage">
+            <summary>
+              Looks up a localized string similar to One or more errors occurred..
+            </summary>
+        </member>
+        <member name="P:System.Strings.AggregateException_ctor_InnerExceptionNull">
+            <summary>
+              Looks up a localized string similar to An element of innerExceptions was null..
+            </summary>
+        </member>
+        <member name="P:System.Strings.AggregateException_ToString">
+            <summary>
+              Looks up a localized string similar to {0}{1}---> (Inner Exception #{2}) {3}{4}{5}.
+            </summary>
+        </member>
+        <member name="P:System.Strings.CancellationToken_CreateLinkedToken_TokensIsEmpty">
+            <summary>
+              Looks up a localized string similar to No tokens were supplied..
+            </summary>
+        </member>
+        <member name="P:System.Strings.CancellationToken_SourceDisposed">
+            <summary>
+              Looks up a localized string similar to The CancellationTokenSource associated with this CancellationToken has been disposed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.CancellationTokenSource_Disposed">
+            <summary>
+              Looks up a localized string similar to The CancellationTokenSource has been disposed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentCollection_SyncRoot_NotSupported">
+            <summary>
+              Looks up a localized string similar to The SyncRoot property may not be used for the synchronization of concurrent collections..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_ArrayIncorrectType">
+            <summary>
+              Looks up a localized string similar to The array is multidimensional, or the type parameter for the set cannot be cast automatically to the type of the destination array..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_ArrayNotLargeEnough">
+            <summary>
+              Looks up a localized string similar to The index is equal to or greater than the length of the array, or the number of elements in the dictionary is greater than the available space from index to the end of the destination array..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_CapacityMustNotBeNegative">
+            <summary>
+              Looks up a localized string similar to The capacity argument must be greater than or equal to zero..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_ConcurrencyLevelMustBePositive">
+            <summary>
+              Looks up a localized string similar to The concurrencyLevel argument must be positive..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_IndexIsNegative">
+            <summary>
+              Looks up a localized string similar to The index argument is less than zero..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_ItemKeyIsNull">
+            <summary>
+              Looks up a localized string similar to TKey is a reference type and item.Key is null..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_KeyAlreadyExisted">
+            <summary>
+              Looks up a localized string similar to The key already existed in the dictionary..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_SourceContainsDuplicateKeys">
+            <summary>
+              Looks up a localized string similar to The source argument contains duplicate keys..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_TypeOfKeyIncorrect">
+            <summary>
+              Looks up a localized string similar to The key was of an incorrect type for this dictionary..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_TypeOfValueIncorrect">
+            <summary>
+              Looks up a localized string similar to The value was of an incorrect type for this dictionary..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Lazy_CreateValue_NoParameterlessCtorForT">
+            <summary>
+              Looks up a localized string similar to The lazily-initialized type does not have a public, parameterless constructor..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Lazy_StaticInit_InvalidOperation">
+            <summary>
+              Looks up a localized string similar to ValueFactory returned null..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ManualResetEventSlim_ctor_SpinCountOutOfRange">
+            <summary>
+              Looks up a localized string similar to The spinCount argument must be in the range 0 to {0}, inclusive..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ManualResetEventSlim_ctor_TooManyWaiters">
+            <summary>
+              Looks up a localized string similar to There are too many threads currently waiting on the event. A maximum of {0} waiting threads are supported..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ManualResetEventSlim_Disposed">
+            <summary>
+              Looks up a localized string similar to The event has been disposed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.OperationCanceled">
+            <summary>
+              Looks up a localized string similar to The operation was canceled..
+            </summary>
+        </member>
+        <member name="P:System.Strings.SpinWait_SpinUntil_ArgumentNull">
+            <summary>
+              Looks up a localized string similar to The condition argument is null..
+            </summary>
+        </member>
+        <member name="P:System.Strings.SpinWait_SpinUntil_TimeoutWrong">
+            <summary>
+              Looks up a localized string similar to The timeout must represent a value between -1 and Int32.MaxValue, inclusive..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_ContinueWith_ESandLR">
+            <summary>
+              Looks up a localized string similar to The specified TaskContinuationOptions combined LongRunning and ExecuteSynchronously.  Synchronous continuations should not be long running..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_ContinueWith_NotOnAnything">
+            <summary>
+              Looks up a localized string similar to The specified TaskContinuationOptions excluded all continuation kinds..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_ctor_LRandSR">
+            <summary>
+              Looks up a localized string similar to (Internal)An attempt was made to create a LongRunning SelfReplicating task..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Delay_InvalidDelay">
+            <summary>
+              Looks up a localized string similar to The value needs to translate in milliseconds to -1 (signifying an infinite timeout), 0 or a positive integer less than or equal to Int32.MaxValue..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Delay_InvalidMillisecondsDelay">
+            <summary>
+              Looks up a localized string similar to The value needs to be either -1 (signifying an infinite timeout), 0 or a positive integer..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Dispose_NotCompleted">
+            <summary>
+              Looks up a localized string similar to A task may only be disposed if it is in a completion state (RanToCompletion, Faulted or Canceled)..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_FromAsync_LongRunning">
+            <summary>
+              Looks up a localized string similar to It is invalid to specify TaskCreationOptions.LongRunning in calls to FromAsync..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_FromAsync_PreferFairness">
+            <summary>
+              Looks up a localized string similar to It is invalid to specify TaskCreationOptions.PreferFairness in calls to FromAsync..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_FromAsync_SelfReplicating">
+            <summary>
+              Looks up a localized string similar to It is invalid to specify TaskCreationOptions.SelfReplicating in calls to FromAsync..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_FromAsync_TaskManagerShutDown">
+            <summary>
+              Looks up a localized string similar to FromAsync was called with a TaskManager that had already shut down..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_MultiTaskContinuation_EmptyTaskList">
+            <summary>
+              Looks up a localized string similar to The tasks argument contains no tasks..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_MultiTaskContinuation_FireOptions">
+            <summary>
+              Looks up a localized string similar to It is invalid to exclude specific continuation kinds for continuations off of multiple tasks..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_MultiTaskContinuation_NullTask">
+            <summary>
+              Looks up a localized string similar to The tasks argument included a null value..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_RunSynchronously_AlreadyStarted">
+            <summary>
+              Looks up a localized string similar to RunSynchronously may not be called on a task that was already started..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_RunSynchronously_Continuation">
+            <summary>
+              Looks up a localized string similar to RunSynchronously may not be called on a continuation task..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_RunSynchronously_Promise">
+            <summary>
+              Looks up a localized string similar to RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_RunSynchronously_TaskCompleted">
+            <summary>
+              Looks up a localized string similar to RunSynchronously may not be called on a task that has already completed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_AlreadyStarted">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a task that was already started..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_ContinuationTask">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a continuation task..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_NullAction">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a task with null action..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_Promise">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a promise-style task..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_TaskCompleted">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a task that has completed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_ThrowIfDisposed">
+            <summary>
+              Looks up a localized string similar to The task has been disposed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_WaitMulti_NullTask">
+            <summary>
+              Looks up a localized string similar to The tasks array included at least one null element..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskAwaiter_TaskNotCompleted">
+            <summary>
+              Looks up a localized string similar to The awaited task has not yet completed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskCanceledException_ctor_DefaultMessage">
+            <summary>
+              Looks up a localized string similar to A task was canceled..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskCompletionSourceT_TrySetException_NoExceptions">
+            <summary>
+              Looks up a localized string similar to The exceptions collection was empty..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskCompletionSourceT_TrySetException_NullException">
+            <summary>
+              Looks up a localized string similar to The exceptions collection included at least one null element..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskExceptionHolder_UnhandledException">
+            <summary>
+              Looks up a localized string similar to A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskExceptionHolder_UnknownExceptionType">
+            <summary>
+              Looks up a localized string similar to (Internal)Expected an Exception or an IEnumerable<Exception>.
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskScheduler_ExecuteTask_TaskAlreadyExecuted">
+            <summary>
+              Looks up a localized string similar to ExecuteTask may not be called for a task which was already executed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskScheduler_ExecuteTask_WrongTaskScheduler">
+            <summary>
+              Looks up a localized string similar to ExecuteTask may not be called for a task which was previously queued to a different TaskScheduler..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskScheduler_FromCurrentSynchronizationContext_NoCurrent">
+            <summary>
+              Looks up a localized string similar to The current SynchronizationContext may not be used as a TaskScheduler..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskScheduler_InconsistentStateAfterTryExecuteTaskInline">
+            <summary>
+              Looks up a localized string similar to The TryExecuteTaskInline call to the underlying scheduler succeeded, but the task body was not invoked..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskSchedulerException_ctor_DefaultMessage">
+            <summary>
+              Looks up a localized string similar to An exception was thrown by a TaskScheduler..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskT_ctor_SelfReplicating">
+            <summary>
+              Looks up a localized string similar to It is invalid to specify TaskCreationOptions.SelfReplicating for a Task<TResult>..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskT_DebuggerNoResult">
+            <summary>
+              Looks up a localized string similar to {Not yet computed}.
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskT_SetException_HasAnInitializer">
+            <summary>
+              Looks up a localized string similar to A task's Exception may only be set directly if the task was created without a function..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskT_TransitionToFinal_AlreadyCompleted">
+            <summary>
+              Looks up a localized string similar to An attempt was made to transition a task to a final state when it had already completed..
+            </summary>
+        </member>
+        <member name="T:System.Collections.Concurrent.ConcurrentDictionary`2">
+            <summary>
+            Represents a thread-safe collection of keys and values.
+            </summary>
+            <typeparam name="TKey">The type of the keys in the dictionary.</typeparam>
+            <typeparam name="TValue">The type of the values in the dictionary.</typeparam>
+            <remarks>
+            All public and protected members of <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> are thread-safe and may be used
+            concurrently from multiple threads.
+            </remarks>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that is empty, has the default concurrency level, has the default initial capacity, and
+            uses the default comparer for the key type.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that is empty, has the specified concurrency level and capacity, and uses the default
+            comparer for the key type.
+            </summary>
+            <param name="concurrencyLevel">The estimated number of threads that will update the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> concurrently.</param>
+            <param name="capacity">The initial number of elements that the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            can contain.</param>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="concurrencyLevel"/> is
+            less than 1.</exception>
+            <exception cref="T:ArgumentOutOfRangeException"> <paramref name="capacity"/> is less than
+            0.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{`0,`1}})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that contains elements copied from the specified <see cref="T:System.Collections.IEnumerable{KeyValuePair{TKey,TValue}}"/>, has the default concurrency
+            level, has the default initial capacity, and uses the default comparer for the key type.
+            </summary>
+            <param name="collection">The <see cref="T:System.Collections.IEnumerable{KeyValuePair{TKey,TValue}}"/> whose elements are copied to
+            the new
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="collection"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException"><paramref name="collection"/> contains one or more
+            duplicate keys.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Collections.Generic.IEqualityComparer{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that is empty, has the specified concurrency level and capacity, and uses the specified
+            <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>.
+            </summary>
+            <param name="comparer">The <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>
+            implementation to use when comparing keys.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="comparer"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{`0,`1}},System.Collections.Generic.IEqualityComparer{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that contains elements copied from the specified <see cref="T:System.Collections.IEnumerable"/>, has the default concurrency level, has the default
+            initial capacity, and uses the specified
+            <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>.
+            </summary>
+            <param name="collection">The <see cref="T:System.Collections.IEnumerable{KeyValuePair{TKey,TValue}}"/> whose elements are copied to
+            the new
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</param>
+            <param name="comparer">The <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>
+            implementation to use when comparing keys.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="collection"/> is a null reference
+            (Nothing in Visual Basic). -or-
+            <paramref name="comparer"/> is a null reference (Nothing in Visual Basic).
+            </exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Int32,System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{`0,`1}},System.Collections.Generic.IEqualityComparer{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> 
+            class that contains elements copied from the specified <see cref="T:System.Collections.IEnumerable"/>, 
+            has the specified concurrency level, has the specified initial capacity, and uses the specified 
+            <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>.
+            </summary>
+            <param name="concurrencyLevel">The estimated number of threads that will update the 
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> concurrently.</param>
+            <param name="collection">The <see cref="T:System.Collections.IEnumerable{KeyValuePair{TKey,TValue}}"/> whose elements are copied to the new 
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</param>
+            <param name="comparer">The <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/> implementation to use 
+            when comparing keys.</param>
+            <exception cref="T:System.ArgumentNullException">
+            <paramref name="collection"/> is a null reference (Nothing in Visual Basic).
+            -or-
+            <paramref name="comparer"/> is a null reference (Nothing in Visual Basic).
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="concurrencyLevel"/> is less than 1.
+            </exception>
+            <exception cref="T:System.ArgumentException"><paramref name="collection"/> contains one or more duplicate keys.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Int32,System.Int32,System.Collections.Generic.IEqualityComparer{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that is empty, has the specified concurrency level, has the specified initial capacity, and
+            uses the specified <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>.
+            </summary>
+            <param name="concurrencyLevel">The estimated number of threads that will update the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> concurrently.</param>
+            <param name="capacity">The initial number of elements that the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            can contain.</param>
+            <param name="comparer">The <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>
+            implementation to use when comparing keys.</param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="concurrencyLevel"/> is less than 1. -or-
+            <paramref name="capacity"/> is less than 0.
+            </exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="comparer"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryAdd(`0,`1)">
+            <summary>
+            Attempts to add the specified key and value to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+            <param name="key">The key of the element to add.</param>
+            <param name="value">The value of the element to add. The value can be a null reference (Nothing
+            in Visual Basic) for reference types.</param>
+            <returns>true if the key/value pair was added to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            successfully; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            contains too many elements.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.ContainsKey(`0)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> contains the specified
+            key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</param>
+            <returns>true if the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> contains an element with
+            the specified key; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryRemove(`0,`1@)">
+            <summary>
+            Attempts to remove and return the the value with the specified key from the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+            <param name="key">The key of the element to remove and return.</param>
+            <param name="value">When this method returns, <paramref name="value"/> contains the object removed from the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> or the default value of <typeparamref name="TValue"/>
+            if the operation failed.</param>
+            <returns>true if an object was removed successfully; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryRemoveInternal(`0,`1@,System.Boolean,`1)">
+            <summary>
+            Removes the specified key from the dictionary if it exists and returns its associated value.
+            If matchValue flag is set, the key will be removed only if is associated with a particular
+            value.
+            </summary>
+            <param name="key">The key to search for and remove if it exists.</param>
+            <param name="value">The variable into which the removed value, if found, is stored.</param>
+            <param name="matchValue">Whether removal of the key is conditional on its value.</param>
+            <param name="oldValue">The conditional value to compare against if <paramref name="matchValue"/> is true</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryGetValue(`0,`1@)">
+            <summary>
+            Attempts to get the value associated with the specified key from the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+            <param name="key">The key of the value to get.</param>
+            <param name="value">When this method returns, <paramref name="value"/> contains the object from
+            the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> with the spedified key or the default value of
+            <typeparamref name="TValue"/>, if the operation failed.</param>
+            <returns>true if the key was found in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>;
+            otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryUpdate(`0,`1,`1)">
+            <summary>
+            Compares the existing value for the specified key with a specified value, and if they’re equal,
+            updates the key with a third value.
+            </summary>
+            <param name="key">The key whose value is compared with <paramref name="comparisonValue"/> and
+            possibly replaced.</param>
+            <param name="newValue">The value that replaces the value of the element with <paramref
+            name="key"/> if the comparison results in equality.</param>
+            <param name="comparisonValue">The value that is compared to the value of the element with
+            <paramref name="key"/>.</param>
+            <returns>true if the value with <paramref name="key"/> was equal to <paramref
+            name="comparisonValue"/> and replaced with <paramref name="newValue"/>; otherwise,
+            false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null
+            reference.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.Clear">
+            <summary>
+            Removes all keys and values from the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#CopyTo(System.Collections.Generic.KeyValuePair{`0,`1}[],System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.Generic.ICollection"/> to an array of
+            type <see cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>, starting at the
+            specified array index.
+            </summary>
+            <param name="array">The one-dimensional array of type <see
+            cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>
+            that is the destination of the <see
+            cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/> elements copied from the <see
+            cref="T:System.Collections.ICollection"/>. The array must have zero-based indexing.</param>
+            <param name="index">The zero-based index in <paramref name="array"/> at which copying
+            begins.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="array"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="index"/> is less than
+            0.</exception>
+            <exception cref="T:System.ArgumentException"><paramref name="index"/> is equal to or greater than
+            the length of the <paramref name="array"/>. -or- The number of elements in the source <see
+            cref="T:System.Collections.ICollection"/>
+            is greater than the available space from <paramref name="index"/> to the end of the destination
+            <paramref name="array"/>.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.ToArray">
+            <summary>
+            Copies the key and value pairs stored in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> to a
+            new array.
+            </summary>
+            <returns>A new array containing a snapshot of key and value pairs copied from the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.CopyToPairs(System.Collections.Generic.KeyValuePair{`0,`1}[],System.Int32)">
+            <summary>
+            Copy dictionary contents to an array - shared implementation between ToArray and CopyTo.
+            
+            Important: the caller must hold all locks in m_locks before calling CopyToPairs.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.CopyToEntries(System.Collections.DictionaryEntry[],System.Int32)">
+            <summary>
+            Copy dictionary contents to an array - shared implementation between ToArray and CopyTo.
+            
+            Important: the caller must hold all locks in m_locks before calling CopyToEntries.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.CopyToObjects(System.Object[],System.Int32)">
+            <summary>
+            Copy dictionary contents to an array - shared implementation between ToArray and CopyTo.
+            
+            Important: the caller must hold all locks in m_locks before calling CopyToObjects.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetEnumerator">
+            <summary>Returns an enumerator that iterates through the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</summary>
+            <returns>An enumerator for the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</returns>
+            <remarks>
+            The enumerator returned from the dictionary is safe to use concurrently with
+            reads and writes to the dictionary, however it does not represent a moment-in-time snapshot
+            of the dictionary.  The contents exposed through the enumerator may contain modifications
+            made to the dictionary after <see cref="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetEnumerator"/> was called.
+            </remarks>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryAddInternal(`0,`1,System.Boolean,System.Boolean,`1@)">
+            <summary>
+            Shared internal implementation for inserts and updates.
+            If key exists, we always return false; and if updateIfExists == true we force update with value;
+            If key doesn't exist, we always add value and return true;
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(`0,System.Func{`0,`1})">
+            <summary>
+            Adds a key/value pair to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> 
+            if the key does not already exist.
+            </summary>
+            <param name="key">The key of the element to add.</param>
+            <param name="valueFactory">The function used to generate a value for the key</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="valueFactory"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <returns>The value for the key.  This will be either the existing value for the key if the
+            key is already in the dictionary, or the new value for the key as returned by valueFactory
+            if the key was not in the dictionary.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(`0,`1)">
+            <summary>
+            Adds a key/value pair to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> 
+            if the key does not already exist.
+            </summary>
+            <param name="key">The key of the element to add.</param>
+            <param name="value">the value to be added, if the key does not already exist</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <returns>The value for the key.  This will be either the existing value for the key if the 
+            key is already in the dictionary, or the new value if the key was not in the dictionary.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.AddOrUpdate(`0,System.Func{`0,`1},System.Func{`0,`1,`1})">
+            <summary>
+            Adds a key/value pair to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> if the key does not already 
+            exist, or updates a key/value pair in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> if the key 
+            already exists.
+            </summary>
+            <param name="key">The key to be added or whose value should be updated</param>
+            <param name="addValueFactory">The function used to generate a value for an absent key</param>
+            <param name="updateValueFactory">The function used to generate a new value for an existing key
+            based on the key's existing value</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="addValueFactory"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="updateValueFactory"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <returns>The new value for the key.  This will be either be the result of addValueFactory (if the key was 
+            absent) or the result of updateValueFactory (if the key was present).</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.AddOrUpdate(`0,`1,System.Func{`0,`1,`1})">
+            <summary>
+            Adds a key/value pair to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> if the key does not already 
+            exist, or updates a key/value pair in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> if the key 
+            already exists.
+            </summary>
+            <param name="key">The key to be added or whose value should be updated</param>
+            <param name="addValue">The value to be added for an absent key</param>
+            <param name="updateValueFactory">The function used to generate a new value for an existing key based on 
+            the key's existing value</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="updateValueFactory"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <returns>The new value for the key.  This will be either be the result of addValueFactory (if the key was 
+            absent) or the result of updateValueFactory (if the key was present).</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#IDictionary{TKey at TValue}#Add(`0,`1)">
+            <summary>
+            Adds the specified key and value to the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.
+            </summary>
+            <param name="key">The object to use as the key of the element to add.</param>
+            <param name="value">The object to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <exception cref="T:System.ArgumentException">
+            An element with the same key already exists in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#IDictionary{TKey at TValue}#Remove(`0)">
+            <summary>
+            Removes the element with the specified key from the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <returns>true if the element is successfully remove; otherwise false. This method also returns
+            false if
+            <paramref name="key"/> was not found in the original <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.
+            </returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#Add(System.Collections.Generic.KeyValuePair{`0,`1})">
+            <summary>
+            Adds the specified value to the <see cref="T:System.Collections.Generic.ICollection{TValue}"/>
+            with the specified key.
+            </summary>
+            <param name="keyValuePair">The <see cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>
+            structure representing the key and value to add to the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="keyValuePair"/> of <paramref
+            name="keyValuePair"/> is null.</exception>
+            <exception cref="T:System.OverflowException">The <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>
+            contains too many elements.</exception>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the
+            <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/></exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#Contains(System.Collections.Generic.KeyValuePair{`0,`1})">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.Generic.ICollection{TKey,TValue}"/>
+            contains a specific key and value.
+            </summary>
+            <param name="keyValuePair">The <see cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>
+            structure to locate in the <see
+            cref="T:System.Collections.Generic.ICollection{TValue}"/>.</param>
+            <returns>true if the <paramref name="keyValuePair"/> is found in the <see
+            cref="T:System.Collections.Generic.ICollection{TKey,TValue}"/>; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#Remove(System.Collections.Generic.KeyValuePair{`0,`1})">
+            <summary>
+            Removes a key and value from the dictionary.
+            </summary>
+            <param name="keyValuePair">The <see
+            cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>
+            structure representing the key and value to remove from the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.</param>
+            <returns>true if the key and value represented by <paramref name="keyValuePair"/> is successfully
+            found and removed; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException">The Key property of <paramref
+            name="keyValuePair"/> is a null reference (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IEnumerable#GetEnumerator">
+            <summary>Returns an enumerator that iterates through the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</summary>
+            <returns>An enumerator for the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</returns>
+            <remarks>
+            The enumerator returned from the dictionary is safe to use concurrently with
+            reads and writes to the dictionary, however it does not represent a moment-in-time snapshot
+            of the dictionary.  The contents exposed through the enumerator may contain modifications
+            made to the dictionary after <see cref="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetEnumerator"/> was called.
+            </remarks>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Add(System.Object,System.Object)">
+            <summary>
+            Adds the specified key and value to the dictionary.
+            </summary>
+            <param name="key">The object to use as the key.</param>
+            <param name="value">The object to use as the value.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <exception cref="T:System.ArgumentException">
+            <paramref name="key"/> is of a type that is not assignable to the key type <typeparamref
+            name="TKey"/> of the <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>. -or-
+            <paramref name="value"/> is of a type that is not assignable to <typeparamref name="TValue"/>,
+            the type of values in the <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.
+            -or- A value with the same key already exists in the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.
+            </exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Contains(System.Object)">
+            <summary>
+            Gets whether the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> contains an
+            element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.</param>
+            <returns>true if the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> contains
+            an element with the specified key; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"> <paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#GetEnumerator">
+            <summary>Provides an <see cref="T:System.Collections.Generics.IDictionaryEnumerator"/> for the
+            <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.</summary>
+            <returns>An <see cref="T:System.Collections.Generics.IDictionaryEnumerator"/> for the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see
+            cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"/> to an array, starting
+            at the specified array index.
+            </summary>
+            <param name="array">The one-dimensional array that is the destination of the elements copied from
+            the <see cref="T:System.Collections.ICollection"/>. The array must have zero-based
+            indexing.</param>
+            <param name="index">The zero-based index in <paramref name="array"/> at which copying
+            begins.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="array"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="index"/> is less than
+            0.</exception>
+            <exception cref="T:System.ArgumentException"><paramref name="index"/> is equal to or greater than
+            the length of the <paramref name="array"/>. -or- The number of elements in the source <see
+            cref="T:System.Collections.ICollection"/>
+            is greater than the available space from <paramref name="index"/> to the end of the destination
+            <paramref name="array"/>.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GrowTable(System.Collections.Concurrent.ConcurrentDictionary{`0,`1}.Node[])">
+            <summary>
+            Replaces the internal table with a larger one. To prevent multiple threads from resizing the
+            table as a result of races, the table of buckets that was deemed too small is passed in as
+            an argument to GrowTable(). GrowTable() obtains a lock, and then checks whether the bucket
+            table has been replaced in the meantime or not.
+            </summary>
+            <param name="buckets">Reference to the bucket table that was deemed too small.</param>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetBucketAndLockNo(System.Int32,System.Int32@,System.Int32@,System.Int32)">
+            <summary>
+            Computes the bucket and lock number for a particular key. 
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.AcquireAllLocks(System.Int32@)">
+            <summary>
+            Acquires all locks for this hash table, and increments locksAcquired by the number
+            of locks that were successfully acquired. The locks are acquired in an increasing
+            order.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.AcquireLocks(System.Int32,System.Int32,System.Int32@)">
+            <summary>
+            Acquires a contiguous range of locks for this hash table, and increments locksAcquired
+            by the number of locks that were successfully acquired. The locks are acquired in an
+            increasing order.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.ReleaseLocks(System.Int32,System.Int32)">
+            <summary>
+            Releases a contiguous range of locks.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetKeys">
+            <summary>
+            Gets a collection containing the keys in the dictionary.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetValues">
+            <summary>
+            Gets a collection containing the values in the dictionary.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.Assert(System.Boolean)">
+            <summary>
+            A helper method for asserts.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.OnSerializing(System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Get the data array to be serialized
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.OnDeserialized(System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Construct the dictionary from a previously seiralized one
+            </summary>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.Item(`0)">
+            <summary>
+            Gets or sets the value associated with the specified key.
+            </summary>
+            <param name="key">The key of the value to get or set.</param>
+            <value>The value associated with the specified key. If the specified key is not found, a get
+            operation throws a
+            <see cref="T:Sytem.Collections.Generic.KeyNotFoundException"/>, and a set operation creates a new
+            element with the specified key.</value>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.Collections.Generic.KeyNotFoundException">The property is retrieved and
+            <paramref name="key"/>
+            does not exist in the collection.</exception>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.Count">
+            <summary>
+            Gets the number of key/value pairs contained in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <value>The number of key/value paris contained in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</value>
+            <remarks>Count has snapshot semantics and represents the number of items in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            at the moment when Count was accessed.</remarks>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.IsEmpty">
+            <summary>
+            Gets a value that indicates whether the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> is empty.
+            </summary>
+            <value>true if the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> is empty; otherwise,
+            false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.Keys">
+            <summary>
+            Gets a collection containing the keys in the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.Generic.ICollection{TKey}"/> containing the keys in the
+            <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.Values">
+            <summary>
+            Gets a collection containing the values in the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.Generic.ICollection{TValue}"/> containing the values in
+            the
+            <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#IsReadOnly">
+            <summary>
+            Gets a value indicating whether the dictionary is read-only.
+            </summary>
+            <value>true if the <see cref="T:System.Collections.Generic.ICollection{TKey,TValue}"/> is
+            read-only; otherwise, false. For <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>, this property always returns
+            false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> has a fixed size.
+            </summary>
+            <value>true if the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> has a
+            fixed size; otherwise, false. For <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>, this property always
+            returns false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> is read-only.
+            </summary>
+            <value>true if the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> is
+            read-only; otherwise, false. For <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>, this property always
+            returns false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"/> containing the keys of the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.ICollection"/> containing the keys of the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"/> containing the values in the <see
+            cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.ICollection"/> containing the values in the <see
+            cref="T:System.Collections.IDictionary"/>.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Item(System.Object)">
+            <summary>
+            Gets or sets the value associated with the specified key.
+            </summary>
+            <param name="key">The key of the value to get or set.</param>
+            <value>The value associated with the specified key, or a null reference (Nothing in Visual Basic)
+            if <paramref name="key"/> is not in the dictionary or <paramref name="key"/> is of a type that is
+            not assignable to the key type <typeparamref name="TKey"/> of the <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>.</value>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">
+            A value is being assigned, and <paramref name="key"/> is of a type that is not assignable to the
+            key type <typeparamref name="TKey"/> of the <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>. -or- A value is being
+            assigned, and <paramref name="key"/> is of a type that is not assignable to the value type
+            <typeparamref name="TValue"/> of the <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>
+            </exception>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#ICollection#IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"/> is
+            synchronized with the SyncRoot.
+            </summary>
+            <value>true if access to the <see cref="T:System.Collections.ICollection"/> is synchronized
+            (thread safe); otherwise, false. For <see
+            cref="T:System.Collections.Concurrent.ConcurrentDictionary{TKey,TValue}"/>, this property always
+            returns false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#ICollection#SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see
+            cref="T:System.Collections.ICollection"/>. This property is not supported.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The SyncRoot property is not supported.</exception>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.DefaultConcurrencyLevel">
+            <summary>
+            The number of concurrent writes for which to optimize by default.
+            </summary>
+        </member>
+        <member name="T:System.Collections.Concurrent.ConcurrentDictionary`2.Node">
+            <summary>
+            A node in a singly-linked list representing a particular hash table bucket.
+            </summary>
+        </member>
+        <member name="T:System.Collections.Concurrent.ConcurrentDictionary`2.DictionaryEnumerator">
+            <summary>
+            A private class to represent enumeration over the dictionary that implements the 
+            IDictionaryEnumerator interface.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncServices.ThrowAsync(System.Exception,System.Threading.SynchronizationContext)">
+            <summary>Throws the exception on the ThreadPool.</summary>
+            <param name="exception">The exception to propagate.</param>
+            <param name="targetContext">The target context on which to propagate the exception.  Null to use the ThreadPool.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncServices.PrepareExceptionForRethrow(System.Exception)">
+            <summary>Copies the exception's stack trace so its stack trace isn't overwritten.</summary>
+            <param name="exc">The exception to prepare.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder">
+            <summary>
+            Provides a builder for asynchronous methods that return <see cref="T:System.Threading.Tasks.Task"/>.
+            This type is intended for compiler use only.
+            </summary>
+            <remarks>
+            AsyncTaskMethodBuilder is a value type, and thus it is copied by value.
+            Prior to being copied, one of its Task, SetResult, or SetException members must be accessed,
+            or else the copies may end up building distinct Task instances.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IAsyncMethodBuilder">
+            <summary>Represents an asynchronous method builder.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.s_cachedCompleted">
+            <summary>A cached VoidTaskResult task used for builders that complete synchronously.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.m_builder">
+            <summary>The generic builder object to which this non-generic instance delegates.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetResult">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">RanToCompletion</see> state.
+            </summary>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetException(System.Exception)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">Faulted</see> state with the specified exception.
+            </summary>
+            <param name="exception">The <see cref="T:System.Exception"/> to use to fault the task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetNotificationForWaitCompletion(System.Boolean)">
+            <summary>
+            Called by the debugger to request notification when the first wait operation
+            (await, Wait, Result, etc.) on this builder's task completes.
+            </summary>
+            <param name="enabled">
+            true to enable notification; false to disable a previously set notification.
+            </param>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Task">
+            <summary>Gets the <see cref="T:System.Threading.Tasks.Task"/> for this builder.</summary>
+            <returns>The <see cref="T:System.Threading.Tasks.Task"/> representing the builder's asynchronous operation.</returns>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger, and only in a single-threaded manner
+            when no other threads are in the middle of accessing this property or this.Task.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodBuilderCore">
+            <summary>Holds state related to the builder's IAsyncStateMachine.</summary>
+            <remarks>This is a mutable struct.  Be very delicate with it.</remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.m_stateMachine">
+            <summary>A reference to the heap-allocated state machine object associated with this builder.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument is null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.GetCompletionAction``2(``0@,``1@)">
+            <summary>
+            Gets the Action to use with an awaiter's OnCompleted or UnsafeOnCompleted method.
+            On first invocation, the supplied state machine will be boxed.
+            </summary>
+            <typeparam name="TMethodBuilder">Specifies the type of the method builder used.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine used.</typeparam>
+            <param name="builder">The builder.</param>
+            <param name="stateMachine">The state machine.</param>
+            <returns>An Action to provide to the awaiter.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner">
+            <summary>Provides the ability to invoke a state machine's MoveNext method under a supplied ExecutionContext.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.m_context">
+            <summary>The context with which to run MoveNext.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.m_stateMachine">
+            <summary>The state machine whose MoveNext method should be invoked.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.#ctor(System.ExecutionContextLightup)">
+            <summary>Initializes the runner.</summary>
+            <param name="context">The context with which to run MoveNext.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.Run">
+            <summary>Invokes MoveNext under the provided context.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.s_invokeMoveNext">
+            <summary>Cached delegate used with ExecutionContext.Run.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.InvokeMoveNext(System.Object)">
+            <summary>Invokes the MoveNext method on the supplied IAsyncStateMachine.</summary>
+            <param name="stateMachine">The IAsyncStateMachine machine instance.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder">
+            <summary>
+            Provides a builder for asynchronous methods that return void.
+            This type is intended for compiler use only.
+            </summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_synchronizationContext">
+            <summary>The synchronization context associated with this operation.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_coreState">
+            <summary>State related to the IAsyncStateMachine.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_objectIdForDebugger">
+            <summary>An object used by the debugger to uniquely identify this builder.  Lazily initialized.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.#cctor">
+            <summary>Temporary support for disabling crashing if tasks go unobserved.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.PreventUnobservedTaskExceptions">
+            <summary>Registers with UnobservedTaskException to suppress exception crashing.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.s_preventUnobservedTaskExceptionsInvoked">
+            <summary>Non-zero if PreventUnobservedTaskExceptions has already been invoked.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.#ctor(System.Threading.SynchronizationContext)">
+            <summary>Initializes the <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</summary>
+            <param name="synchronizationContext">The synchronizationContext associated with this operation. This may be null.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetResult">
+            <summary>Completes the method builder successfully.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetException(System.Exception)">
+            <summary>Faults the method builder with an exception.</summary>
+            <param name="exception">The exception that is the cause of this fault.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.NotifySynchronizationContextOfCompletion">
+            <summary>Notifies the current synchronization context that the operation completed.</summary>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger and only in a single-threaded manner.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1">
+            <summary>
+            Provides a builder for asynchronous methods that return <see cref="T:System.Threading.Tasks.Task`1"/>.
+            This type is intended for compiler use only.
+            </summary>
+            <remarks>
+            AsyncTaskMethodBuilder{TResult} is a value type, and thus it is copied by value.
+            Prior to being copied, one of its Task, SetResult, or SetException members must be accessed,
+            or else the copies may end up building distinct Task instances.
+            </remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.s_defaultResultTask">
+            <summary>A cached task for default(TResult).</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_coreState">
+            <summary>State related to the IAsyncStateMachine.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_task">
+            <summary>The lazily-initialized task.</summary>
+            <remarks>Must be named m_task for debugger step-over to work correctly.</remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_taskCompletionSource">
+            <summary>The lazily-initialized task completion source.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.#cctor">
+            <summary>Temporary support for disabling crashing if tasks go unobserved.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(`0)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task`1"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">RanToCompletion</see> state with the specified result.
+            </summary>
+            <param name="result">The result to use to complete the task.</param>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(System.Threading.Tasks.TaskCompletionSource{`0})">
+            <summary>
+            Completes the builder by using either the supplied completed task, or by completing
+            the builder's previously accessed task using default(TResult).
+            </summary>
+            <param name="completedTask">A task already completed with the value default(TResult).</param>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetException(System.Exception)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task`1"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">Faulted</see> state with the specified exception.
+            </summary>
+            <param name="exception">The <see cref="T:System.Exception"/> to use to fault the task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetNotificationForWaitCompletion(System.Boolean)">
+            <summary>
+            Called by the debugger to request notification when the first wait operation
+            (await, Wait, Result, etc.) on this builder's task completes.
+            </summary>
+            <param name="enabled">
+            true to enable notification; false to disable a previously set notification.
+            </param>
+            <remarks>
+            This should only be invoked from within an asynchronous method,
+            and only by the debugger.
+            </remarks>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.GetTaskForResult(`0)">
+            <summary>
+            Gets a task for the specified result.  This will either
+            be a cached or new task, never null.
+            </summary>
+            <param name="result">The result for which we need a task.</param>
+            <returns>The completed task containing the result.</returns>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.CompletionSource">
+            <summary>Gets the lazily-initialized TaskCompletionSource.</summary>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Task">
+            <summary>Gets the <see cref="T:System.Threading.Tasks.Task`1"/> for this builder.</summary>
+            <returns>The <see cref="T:System.Threading.Tasks.Task`1"/> representing the builder's asynchronous operation.</returns>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger, and only in a single-threaded manner
+            when no other threads are in the middle of accessing this property or this.Task.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1">
+            <summary>Provides a base class used to cache tasks of a specific return type.</summary>
+            <typeparam name="TResult">Specifies the type of results the cached tasks return.</typeparam>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.Singleton">
+            <summary>
+            A singleton cache for this result type.
+            This may be null if there are no cached tasks for this TResult.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.CreateCompleted(`0)">
+            <summary>Creates a non-disposable task.</summary>
+            <param name="result">The result for the task.</param>
+            <returns>The cacheable task.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.CreateCache">
+            <summary>Creates a cache.</summary>
+            <returns>A task cache for this result type.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.FromResult(`0)">
+            <summary>Gets a cached task if one exists.</summary>
+            <param name="result">The result for which we want a cached task.</param>
+            <returns>A cached task if one exists; otherwise, null.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache">
+            <summary>Provides a cache for Boolean tasks.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.m_true">
+            <summary>A true task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.m_false">
+            <summary>A false task.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.FromResult(System.Boolean)">
+            <summary>Gets a cached task for the Boolean result.</summary>
+            <param name="result">true or false</param>
+            <returns>A cached task for the Boolean result.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache">
+            <summary>Provides a cache for zero Int32 tasks.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.INCLUSIVE_INT32_MIN">
+            <summary>The minimum value, inclusive, for which we want a cached task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.EXCLUSIVE_INT32_MAX">
+            <summary>The maximum value, exclusive, for which we want a cached task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.Int32Tasks">
+            <summary>The cache of Task{Int32}.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.CreateInt32Tasks">
+            <summary>Creates an array of cached tasks for the values in the range [INCLUSIVE_MIN,EXCLUSIVE_MAX).</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.FromResult(System.Int32)">
+            <summary>Gets a cached task for the zero Int32 result.</summary>
+            <param name="result">The integer value</param>
+            <returns>A cached task for the Int32 result or null if not cached.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IAsyncStateMachine">
+            <summary>
+            Represents state machines generated for asynchronous methods.
+            This type is intended for compiler use only.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext">
+            <summary>Moves the state machine to its next state.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IAsyncStateMachine.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Configures the state machine with a heap-allocated replica.</summary>
+            <param name="stateMachine">The heap-allocated replica.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.ICriticalNotifyCompletion">
+            <summary>
+            Represents an awaiter used to schedule continuations when an await operation completes.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.INotifyCompletion">
+            <summary>
+            Represents an operation that will schedule continuations when the operation completes.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.INotifyCompletion.OnCompleted(System.Action)">
+            <summary>Schedules the continuation action to be invoked when the instance completes.</summary>
+            <param name="continuation">The action to invoke when the operation completes.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="continuation"/> argument is null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.ICriticalNotifyCompletion.UnsafeOnCompleted(System.Action)">
+            <summary>Schedules the continuation action to be invoked when the instance completes.</summary>
+            <param name="continuation">The action to invoke when the operation completes.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="continuation"/> argument is null (Nothing in Visual Basic).</exception>
+            <remarks>Unlike OnCompleted, UnsafeOnCompleted need not propagate ExecutionContext information.</remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.VoidTaskResult">
+            <summary>Used with Task(of void)</summary>
+        </member>
+        <member name="T:System.Threading.Tasks.IThreadPoolWorkItem">
+            <summary>
+            An interface similar to the one added in .NET 4.0.
+            </summary>
+        </member>
+        <member name="T:System.OperationCanceledException">
+            <summary>The exception that is thrown in a thread upon cancellation of an operation that the thread was executing.</summary>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor">
+            <summary>Initializes the exception.</summary>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.String)">
+            <summary>Initializes the exception.</summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.String,System.Exception)">
+            <summary>Initializes the exception.</summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.Threading.CancellationToken)">
+            <summary>Initializes the exception.</summary>
+            <param name="token">A cancellation token associated with the operation that was canceled.</param>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.String,System.Threading.CancellationToken)">
+            <summary>Initializes the exception.</summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="token">A cancellation token associated with the operation that was canceled.</param>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.String,System.Exception,System.Threading.CancellationToken)">
+            <summary>Initializes the exception.</summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+            <param name="token">A cancellation token associated with the operation that was canceled.</param>
+        </member>
+        <member name="P:System.OperationCanceledException.CancellationToken">
+            <summary>Gets a token associated with the operation that was canceled.</summary>
+        </member>
+        <member name="T:System.Threading.StackCrawlMark">
+            <summary>
+            A dummy replacement for the .NET internal class StackCrawlMark.
+            </summary>
+        </member>
+        <member name="T:System.Threading.CancellationToken">
+            <summary>
+            Propogates notification that operations should be canceled.
+            </summary>
+            <remarks>
+            <para>
+            A <see cref="T:System.Threading.CancellationToken"/> may be created directly in an unchangeable canceled or non-canceled state
+            using the CancellationToken's constructors. However, to have a CancellationToken that can change 
+            from a non-canceled to a canceled state, 
+            <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> must be used.
+            CancellationTokenSource exposes the associated CancellationToken that may be canceled by the source through its 
+            <see cref="P:System.Threading.CancellationTokenSource.Token">Token</see> property. 
+            </para>
+            <para>
+            Once canceled, a token may not transition to a non-canceled state, and a token whose 
+            <see cref="P:System.Threading.CancellationToken.CanBeCanceled"/> is false will never change to one that can be canceled.
+            </para>
+            <para>
+            All members of this struct are thread-safe and may be used concurrently from multiple threads.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationToken.#ctor(System.Threading.CancellationTokenSource)">
+            <summary>
+            Internal constructor only a CancellationTokenSource should create a CancellationToken
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationToken.#ctor(System.Boolean)">
+            <summary>
+            Initializes the <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </summary>
+            <param name="canceled">
+            The canceled state for the token.
+            </param>
+            <remarks>
+            Tokens created with this constructor will remain in the canceled state specified
+            by the <paramref name="canceled"/> parameter.  If <paramref name="canceled"/> is false,
+            both <see cref="P:System.Threading.CancellationToken.CanBeCanceled"/> and <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> will be false.
+            If <paramref name="canceled"/> is true,
+            both <see cref="P:System.Threading.CancellationToken.CanBeCanceled"/> and <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> will be true. 
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Register(System.Action)">
+            <summary>
+            Registers a delegate that will be called when this <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.
+            </summary>
+            <remarks>
+            <para>
+            If this token is already in the canceled state, the
+            delegate will be run immediately and synchronously. Any exception the delegate generates will be
+            propogated out of this method call.
+            </para>
+            </remarks>
+            <param name="callback">The delegate to be executed when the <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.</param>
+            <returns>The <see cref="T:System.Threading.CancellationTokenRegistration"/> instance that can 
+            be used to deregister the callback.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="callback"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Register(System.Action,System.Boolean)">
+            <summary>
+            Registers a delegate that will be called when this 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.
+            </summary>
+            <remarks>
+            <para>
+            If this token is already in the canceled state, the
+            delegate will be run immediately and synchronously. Any exception the delegate generates will be
+            propogated out of this method call.
+            </para>
+            </remarks>
+            <param name="callback">The delegate to be executed when the <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.</param>
+            <param name="useSynchronizationContext">A Boolean value that indicates whether to capture
+            the current <see cref="T:System.Threading.SynchronizationContext">SynchronizationContext</see> and use it
+            when invoking the <paramref name="callback"/>.</param>
+            <returns>The <see cref="T:System.Threading.CancellationTokenRegistration"/> instance that can 
+            be used to deregister the callback.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="callback"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Register(System.Action{System.Object},System.Object)">
+            <summary>
+            Registers a delegate that will be called when this 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.
+            </summary>
+            <remarks>
+            <para>
+            If this token is already in the canceled state, the
+            delegate will be run immediately and synchronously. Any exception the delegate generates will be
+            propogated out of this method call.
+            </para>
+            </remarks>
+            <param name="callback">The delegate to be executed when the <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.</param>
+            <param name="state">The state to pass to the <paramref name="callback"/> when the delegate is invoked.  This may be null.</param>
+            <returns>The <see cref="T:System.Threading.CancellationTokenRegistration"/> instance that can 
+            be used to deregister the callback.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="callback"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Register(System.Action{System.Object},System.Object,System.Boolean)">
+            <summary>
+            Registers a delegate that will be called when this 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.
+            </summary>
+            <remarks>
+            <para>
+            If this token is already in the canceled state, the
+            delegate will be run immediately and synchronously. Any exception the delegate generates will be
+            propogated out of this method call.
+            </para>
+            </remarks>
+            <param name="callback">The delegate to be executed when the <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.</param>
+            <param name="state">The state to pass to the <paramref name="callback"/> when the delegate is invoked.  This may be null.</param>
+            <param name="useSynchronizationContext">A Boolean value that indicates whether to capture
+            the current <see cref="T:System.Threading.SynchronizationContext">SynchronizationContext</see> and use it
+            when invoking the <paramref name="callback"/>.</param>
+            <returns>The <see cref="T:System.Threading.CancellationTokenRegistration"/> instance that can 
+            be used to deregister the callback.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="callback"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Equals(System.Threading.CancellationToken)">
+            <summary>
+            Determines whether the current <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instance is equal to the 
+            specified token.
+            </summary>
+            <param name="other">The other <see cref="T:System.Threading.CancellationToken">CancellationToken</see> to which to compare this
+            instance.</param>
+            <returns>True if the instances are equal; otherwise, false. Two tokens are equal if they are associated
+            with the same <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> or if they were both constructed 
+            from public CancellationToken constructors and their <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> values are equal.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Equals(System.Object)">
+            <summary>
+            Determines whether the current <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instance is equal to the 
+            specified <see cref="T:System.Object"/>.
+            </summary>
+            <param name="other">The other object to which to compare this instance.</param>
+            <returns>True if <paramref name="other"/> is a <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            and if the two instances are equal; otherwise, false. Two tokens are equal if they are associated
+            with the same <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> or if they were both constructed 
+            from public CancellationToken constructors and their <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> values are equal.</returns>
+            <exception cref="T:System.ObjectDisposedException">An associated <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.GetHashCode">
+            <summary>
+            Serves as a hash function for a <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </summary>
+            <returns>A hash code for the current <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instance.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationToken.op_Equality(System.Threading.CancellationToken,System.Threading.CancellationToken)">
+            <summary>
+            Determines whether two <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instances are equal.
+            </summary>
+            <param name="left">The first instance.</param>
+            <param name="right">The second instance.</param>
+            <returns>True if the instances are equal; otherwise, false.</returns>
+            <exception cref="T:System.ObjectDisposedException">An associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.op_Inequality(System.Threading.CancellationToken,System.Threading.CancellationToken)">
+            <summary>
+            Determines whether two <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instances are not equal.
+            </summary>
+            <param name="left">The first instance.</param>
+            <param name="right">The second instance.</param>
+            <returns>True if the instances are not equal; otherwise, false.</returns>
+            <exception cref="T:System.ObjectDisposedException">An associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.ThrowIfCancellationRequested">
+            <summary>
+            Throws a <see cref="T:System.OperationCanceledException">OperationCanceledException</see> if
+            this token has had cancellation requested.
+            </summary>
+            <remarks>
+            This method provides functionality equivalent to:
+            <code>
+            if (token.IsCancellationRequested) 
+               throw new OperationCanceledException(token);
+            </code>
+            </remarks>
+            <exception cref="T:System.OperationCanceledException">The token has had cancellation requested.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="P:System.Threading.CancellationToken.None">
+            <summary>
+            Returns an empty CancellationToken value.
+            </summary>
+            <remarks>
+            The <see cref="T:System.Threading.CancellationToken"/> value returned by this property will be non-cancelable by default.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.CancellationToken.IsCancellationRequested">
+            <summary>
+            Gets whether cancellation has been requested for this token.
+            </summary>
+            <value>Whether cancellation has been requested for this token.</value>
+            <remarks>
+            <para>
+            This property indicates whether cancellation has been requested for this token, 
+            either through the token initially being construted in a canceled state, or through
+            calling <see cref="M:System.Threading.CancellationTokenSource.Cancel">Cancel</see> 
+            on the token's associated <see cref="T:System.Threading.CancellationTokenSource"/>.
+            </para>
+            <para>
+            If this property is true, it only guarantees that cancellation has been requested.  
+            It does not guarantee that every registered handler
+            has finished executing, nor that cancellation requests have finished propagating
+            to all registered handlers.  Additional synchronization may be required,
+            particularly in situations where related objects are being canceled concurrently.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:System.Threading.CancellationToken.CanBeCanceled">
+            <summary>
+            Gets whether this token is capable of being in the canceled state.
+            </summary>
+            <remarks>
+            If CanBeCanceled returns false, it is guaranteed that the token will never transition
+            into a canceled state, meaning that <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> will never
+            return true.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.CancellationToken.WaitHandle">
+            <summary>
+            Gets a <see cref="T:System.Threading.WaitHandle"/> that is signaled when the token is canceled.</summary>
+            <remarks>
+            Accessing this property causes a <see cref="T:System.Threading.WaitHandle">WaitHandle</see>
+            to be instantiated.  It is preferable to only use this property when necessary, and to then
+            dispose the associated <see cref="T:System.Threading.CancellationTokenSource"/> instance at the earliest opportunity (disposing
+            the source will dispose of this allocated handle).  The handle should not be closed or disposed directly.
+            </remarks>
+            <exception cref="T:System.ObjectDisposedException">The associated <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="T:System.Threading.CancellationTokenRegistration">
+            <summary>
+            Represents a callback delegate that has been registered with a <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </summary>
+            <remarks>
+            To unregister a callback, dispose the corresponding Registration instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.TryDeregister">
+            <summary>
+            Attempts to deregister the item. If it's already being run, this may fail.
+            Entails a full memory fence.
+            </summary>
+            <returns>True if the callback was found and deregistered, false otherwise.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.Dispose">
+            <summary>
+            Disposes of the registration and unregisters the target callback from the associated 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            If the target callback is currently executing this method will wait until it completes, except
+            in the degenerate cases where a callback method deregisters itself.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.op_Equality(System.Threading.CancellationTokenRegistration,System.Threading.CancellationTokenRegistration)">
+            <summary>
+            Determines whether two <see
+            cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see>
+            instances are equal.
+            </summary>
+            <param name="left">The first instance.</param>
+            <param name="right">The second instance.</param>
+            <returns>True if the instances are equal; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.op_Inequality(System.Threading.CancellationTokenRegistration,System.Threading.CancellationTokenRegistration)">
+            <summary>
+            Determines whether two <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instances are not equal.
+            </summary>
+            <param name="left">The first instance.</param>
+            <param name="right">The second instance.</param>
+            <returns>True if the instances are not equal; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.Equals(System.Object)">
+            <summary>
+            Determines whether the current <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instance is equal to the 
+            specified <see cref="T:System.Object"/>.
+            </summary> 
+            <param name="obj">The other object to which to compare this instance.</param>
+            <returns>True, if both this and <paramref name="obj"/> are equal. False, otherwise.
+            Two <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instances are equal if
+            they both refer to the output of a single call to the same Register method of a 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see>. 
+            </returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.Equals(System.Threading.CancellationTokenRegistration)">
+            <summary>
+            Determines whether the current <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instance is equal to the 
+            specified <see cref="T:System.Object"/>.
+            </summary> 
+            <param name="other">The other <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> to which to compare this instance.</param>
+            <returns>True, if both this and <paramref name="other"/> are equal. False, otherwise.
+            Two <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instances are equal if
+            they both refer to the output of a single call to the same Register method of a 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see>. 
+            </returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.GetHashCode">
+            <summary>
+            Serves as a hash function for a <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration.</see>.
+            </summary>
+            <returns>A hash code for the current <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instance.</returns>
+        </member>
+        <member name="T:System.Threading.CancellationTokenSource">
+            <summary>
+            Signals to a <see cref="T:System.Threading.CancellationToken"/> that it should be canceled.
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.CancellationTokenSource"/> is used to instantiate a <see cref="T:System.Threading.CancellationToken"/>
+            (via the source's <see cref="P:System.Threading.CancellationTokenSource.Token">Token</see> property)
+            that can be handed to operations that wish to be notified of cancellation or that can be used to
+            register asynchronous operations for cancellation. That token may have cancellation requested by
+            calling to the source's <see cref="M:System.Threading.CancellationTokenSource.Cancel">Cancel</see>
+            method.
+            </para>
+            <para>
+            All members of this class, except <see cref="M:System.Threading.CancellationTokenSource.Dispose">Dispose</see>, are thread-safe and may be used
+            concurrently from multiple threads.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:System.Threading.CancellationTokenSource.m_threadIDExecutingCallbacks">
+            The ID of the thread currently executing the main body of CTS.Cancel()
+            this helps us to know if a call to ctr.Dispose() is running 'within' a cancellation callback.
+            This is updated as we move between the main thread calling cts.Cancel() and any syncContexts that are used to 
+            actually run the callbacks.
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.#ctor">
+            <summary>
+            Initializes the <see cref="T:System.Threading.CancellationTokenSource"/>.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.Cancel">
+            <summary>
+            Communicates a request for cancellation.
+            </summary>
+            <remarks>
+            <para>
+            The associated <see cref="T:System.Threading.CancellationToken"/> will be
+            notified of the cancellation and will transition to a state where 
+            <see cref="P:System.Threading.CancellationToken.IsCancellationRequested">IsCancellationRequested</see> returns true. 
+            Any callbacks or cancelable operations
+            registered with the <see cref="T:System.Threading.CancellationToken"/>  will be executed.
+            </para>
+            <para>
+            Cancelable operations and callbacks registered with the token should not throw exceptions.
+            However, this overload of Cancel will aggregate any exceptions thrown into a <see cref="T:System.AggregateException"/>,
+            such that one callback throwing an exception will not prevent other registered callbacks from being executed.
+            </para>
+            <para>
+            The <see cref="T:System.Threading.ExecutionContext"/> that was captured when each callback was registered
+            will be reestablished when the callback is invoked.
+            </para>
+            </remarks>
+            <exception cref="T:System.AggregateException">An aggregate exception containing all the exceptions thrown
+            by the registered callbacks on the associated <see cref="T:System.Threading.CancellationToken"/>.</exception>
+            <exception cref="T:System.ObjectDisposedException">This <see cref="T:System.Threading.CancellationTokenSource"/> has been disposed.</exception> 
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.Cancel(System.Boolean)">
+            <summary>
+            Communicates a request for cancellation.
+            </summary>
+            <remarks>
+            <para>
+            The associated <see cref="T:System.Threading.CancellationToken"/> will be
+            notified of the cancellation and will transition to a state where 
+            <see cref="P:System.Threading.CancellationToken.IsCancellationRequested">IsCancellationRequested</see> returns true. 
+            Any callbacks or cancelable operations
+            registered with the <see cref="T:System.Threading.CancellationToken"/>  will be executed.
+            </para>
+            <para>
+            Cancelable operations and callbacks registered with the token should not throw exceptions. 
+            If <paramref name="throwOnFirstException"/> is true, an exception will immediately propagate out of the
+            call to Cancel, preventing the remaining callbacks and cancelable operations from being processed.
+            If <paramref name="throwOnFirstException"/> is false, this overload will aggregate any 
+            exceptions thrown into a <see cref="T:System.AggregateException"/>,
+            such that one callback throwing an exception will not prevent other registered callbacks from being executed.
+            </para>
+            <para>
+            The <see cref="T:System.Threading.ExecutionContext"/> that was captured when each callback was registered
+            will be reestablished when the callback is invoked.
+            </para>
+            </remarks>
+            <param name="throwOnFirstException">Specifies whether exceptions should immediately propagate.</param>
+            <exception cref="T:System.AggregateException">An aggregate exception containing all the exceptions thrown
+            by the registered callbacks on the associated <see cref="T:System.Threading.CancellationToken"/>.</exception>
+            <exception cref="T:System.ObjectDisposedException">This <see cref="T:System.Threading.CancellationTokenSource"/> has been disposed.</exception> 
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.Dispose">
+            <summary>
+            Releases the resources used by this <see cref="T:System.Threading.CancellationTokenSource" />.
+            </summary>
+            <remarks>
+            This method is not thread-safe for any other concurrent calls.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.ThrowIfDisposed">
+            <summary>
+            Throws an exception if the source has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.InternalGetStaticSource(System.Boolean)">
+            <summary>
+            InternalGetStaticSource()
+            </summary>
+            <param name="set">Whether the source should be set.</param>
+            <returns>A static source to be shared among multiple tokens.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.InternalRegister(System.Action{System.Object},System.Object,System.Threading.SynchronizationContext)">
+            <summary>
+            Registers a callback object. If cancellation has already occurred, the
+            callback will have been run by the time this method returns.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.NotifyCancellation(System.Boolean)">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(System.Boolean)">
+            <summary>
+            Invoke the Canceled event.
+            </summary>
+            <remarks>
+            The handlers are invoked synchronously in LIFO order.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.CreateLinkedTokenSource(System.Threading.CancellationToken,System.Threading.CancellationToken)">
+            <summary>
+            Creates a <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that will be in the canceled state
+            when any of the source tokens are in the canceled state.
+            </summary>
+            <param name="token1">The first <see cref="T:System.Threading.CancellationToken">CancellationToken</see> to observe.</param>
+            <param name="token2">The second <see cref="T:System.Threading.CancellationToken">CancellationToken</see> to observe.</param>
+            <returns>A <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that is linked 
+            to the source tokens.</returns>
+            <exception cref="T:System.ObjectDisposedException">A <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> associated with
+            one of the source tokens has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.CreateLinkedTokenSource(System.Threading.CancellationToken[])">
+            <summary>
+            Creates a <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that will be in the canceled state
+            when any of the source tokens are in the canceled state.
+            </summary>
+            <param name="tokens">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instances to observe.</param>
+            <returns>A <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that is linked 
+            to the source tokens.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="tokens"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">A <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> associated with
+            one of the source tokens has been disposed.</exception>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.IsCancellationRequested">
+            <summary>
+            Gets whether cancellation has been requested for this <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see>.
+            </summary>
+            <value>Whether cancellation has been requested for this <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see>.</value>
+            <remarks>
+            <para>
+            This property indicates whether cancellation has been requested for this token source, such as
+            due to a call to its
+            <see cref="M:System.Threading.CancellationTokenSource.Cancel">Cancel</see> method.
+            </para>
+            <para>
+            If this property returns true, it only guarantees that cancellation has been requested. It does not
+            guarantee that every handler registered with the corresponding token has finished executing, nor
+            that cancellation requests have finished propagating to all registered handlers. Additional
+            synchronization may be required, particularly in situations where related objects are being
+            canceled concurrently.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.IsCancellationCompleted">
+            <summary>
+            A simple helper to determine whether cancellation has finished.
+            </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.IsDisposed">
+            <summary>
+            A simple helper to determine whether disposal has occured.
+            </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.ThreadIDExecutingCallbacks">
+            <summary>
+            The ID of the thread that is running callbacks.
+            </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.Token">
+            <summary>
+            Gets the <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            associated with this <see cref="T:System.Threading.CancellationTokenSource"/>.
+            </summary>
+            <value>The <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            associated with this <see cref="T:System.Threading.CancellationTokenSource"/>.</value>
+            <exception cref="T:System.ObjectDisposedException">The token source has been
+            disposed.</exception>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.CanBeCanceled">
+             <summary>
+            
+             </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.WaitHandle">
+             <summary>
+            
+             </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.ExecutingCallback">
+            <summary>
+            The currently executing callback
+            </summary>
+        </member>
+        <member name="T:System.Threading.CancellationCallbackInfo">
+            <summary>
+            A helper class for collating the various bits of information required to execute 
+            cancellation callbacks.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationCallbackInfo.ExecuteCallback">
+            <summary>
+            InternalExecuteCallbackSynchronously_GeneralPath
+            This will be called on the target synchronization context, however, we still need to restore the required execution context
+            </summary>
+        </member>
+        <member name="T:System.Threading.SparselyPopulatedArray`1">
+            <summary>
+            A sparsely populated array.  Elements can be sparse and some null, but this allows for
+            lock-free additions and growth, and also for constant time removal (by nulling out).
+            </summary>
+            <typeparam name="T">The kind of elements contained within.</typeparam>
+        </member>
+        <member name="M:System.Threading.SparselyPopulatedArray`1.#ctor(System.Int32)">
+            <summary>
+            Allocates a new array with the given initial size.
+            </summary>
+            <param name="initialSize">How many array slots to pre-allocate.</param>
+        </member>
+        <member name="M:System.Threading.SparselyPopulatedArray`1.Add(`0)">
+            <summary>
+            Adds an element in the first available slot, beginning the search from the tail-to-head.
+            If no slots are available, the array is grown.  The method doesn't return until successful.
+            </summary>
+            <param name="element">The element to add.</param>
+            <returns>Information about where the add happened, to enable O(1) deregistration.</returns>
+        </member>
+        <member name="P:System.Threading.SparselyPopulatedArray`1.Tail">
+            <summary>
+            The tail of the doubly linked list.
+            </summary>
+        </member>
+        <member name="T:System.Threading.SparselyPopulatedArrayAddInfo`1">
+            <summary>
+            A struct to hold a link to the exact spot in an array an element was inserted, enabling
+            constant time removal later on.
+            </summary>
+        </member>
+        <member name="T:System.Threading.SparselyPopulatedArrayFragment`1">
+            <summary>
+            A fragment of a sparsely populated array, doubly linked.
+            </summary>
+            <typeparam name="T">The kind of elements contained within.</typeparam>
+        </member>
+        <member name="T:System.Threading.LazyInitializer">
+            <summary>
+            Provides lazy initialization routines.
+            </summary>
+            <remarks>
+            These routines avoid needing to allocate a dedicated, lazy-initialization instance, instead using
+            references to ensure targets have been initialized as they are accessed.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitialized``1(``0@)">
+            <summary>
+            Initializes a target reference type with the type's default constructor if the target has not
+            already been initialized.
+            </summary>
+            <typeparam name="T">The refence type of the reference to be initialized.</typeparam>
+            <param name="target">A reference of type <typeparamref name="T"/> to initialize if it has not
+            already been initialized.</param>
+            <returns>The initialized reference of type <typeparamref name="T"/>.</returns>
+            <exception cref="T:System.MissingMemberException">Type <typeparamref name="T"/> does not have a default
+            constructor.</exception>
+            <exception cref="T:System.MemberAccessException">
+            Permissions to access the constructor of type <typeparamref name="T"/> were missing.
+            </exception>
+            <remarks>
+            <para>
+            This method may only be used on reference types. To ensure initialization of value
+            types, see other overloads of EnsureInitialized.
+            </para>
+            <para>
+            This method may be used concurrently by multiple threads to initialize <paramref name="target"/>.  
+            In the event that multiple threads access this method concurrently, multiple instances of <typeparamref name="T"/>
+            may be created, but only one will be stored into <paramref name="target"/>. In such an occurrence, this method will not dispose of the
+            objects that were not stored.  If such objects must be disposed, it is up to the caller to determine 
+            if an object was not used and to then dispose of the object appropriately.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitialized``1(``0@,System.Func{``0})">
+            <summary>
+            Initializes a target reference type using the specified function if it has not already been
+            initialized.
+            </summary>
+            <typeparam name="T">The reference type of the reference to be initialized.</typeparam>
+            <param name="target">The reference of type <typeparamref name="T"/> to initialize if it has not
+            already been initialized.</param>
+            <param name="valueFactory">The <see cref="T:System.Func{T}"/> invoked to initialize the
+            reference.</param>
+            <returns>The initialized reference of type <typeparamref name="T"/>.</returns>
+            <exception cref="T:System.MissingMemberException">Type <typeparamref name="T"/> does not have a
+            default constructor.</exception>
+            <exception cref="T:System.InvalidOperationException"><paramref name="valueFactory"/> returned
+            null.</exception>
+            <remarks>
+            <para>
+            This method may only be used on reference types, and <paramref name="valueFactory"/> may
+            not return a null reference (Nothing in Visual Basic). To ensure initialization of value types or
+            to allow null reference types, see other overloads of EnsureInitialized.
+            </para>
+            <para>
+            This method may be used concurrently by multiple threads to initialize <paramref name="target"/>.  
+            In the event that multiple threads access this method concurrently, multiple instances of <typeparamref name="T"/>
+            may be created, but only one will be stored into <paramref name="target"/>. In such an occurrence, this method will not dispose of the
+            objects that were not stored.  If such objects must be disposed, it is up to the caller to determine 
+            if an object was not used and to then dispose of the object appropriately.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitializedCore``1(``0@,System.Func{``0})">
+            <summary>
+            Initialize the target using the given delegate (slow path).
+            </summary>
+            <typeparam name="T">The reference type of the reference to be initialized.</typeparam>
+            <param name="target">The variable that need to be initialized</param>
+            <param name="valueFactory">The delegate that will be executed to initialize the target</param>
+            <returns>The initialized variable</returns>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitialized``1(``0@,System.Boolean@,System.Object@)">
+            <summary>
+            Initializes a target reference or value type with its default constructor if it has not already
+            been initialized.
+            </summary>
+            <typeparam name="T">The type of the reference to be initialized.</typeparam>
+            <param name="target">A reference or value of type <typeparamref name="T"/> to initialize if it
+            has not already been initialized.</param>
+            <param name="initialized">A reference to a boolean that determines whether the target has already
+            been initialized.</param>
+            <param name="syncLock">A reference to an object used as the mutually exclusive lock for initializing
+            <paramref name="target"/>.</param>
+            <returns>The initialized value of type <typeparamref name="T"/>.</returns>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitialized``1(``0@,System.Boolean@,System.Object@,System.Func{``0})">
+            <summary>
+            Initializes a target reference or value type with a specified function if it has not already been
+            initialized.
+            </summary>
+            <typeparam name="T">The type of the reference to be initialized.</typeparam>
+            <param name="target">A reference or value of type <typeparamref name="T"/> to initialize if it
+            has not already been initialized.</param>
+            <param name="initialized">A reference to a boolean that determines whether the target has already
+            been initialized.</param>
+            <param name="syncLock">A reference to an object used as the mutually exclusive lock for initializing
+            <paramref name="target"/>.</param>
+            <param name="valueFactory">The <see cref="T:System.Func{T}"/> invoked to initialize the
+            reference or value.</param>
+            <returns>The initialized value of type <typeparamref name="T"/>.</returns>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitializedCore``1(``0@,System.Boolean@,System.Object@,System.Func{``0})">
+            <summary>
+            Ensure the target is initialized and return the value (slow path). This overload permits nulls
+            and also works for value type targets. Uses the supplied function to create the value.
+            </summary>
+            <typeparam name="T">The type of target.</typeparam>
+            <param name="target">A reference to the target to be initialized.</param>
+            <param name="initialized">A reference to a location tracking whether the target has been initialized.</param>
+            <param name="syncLock">A reference to a location containing a mutual exclusive lock.</param>
+            <param name="valueFactory">
+            The <see cref="T:System.Func{T}"/> to invoke in order to produce the lazily-initialized value.
+            </param>
+            <returns>The initialized object.</returns>
+        </member>
+        <member name="T:System.Threading.ManualResetEventSlim">
+            <summary>
+            Provides a slimmed down version of <see cref="T:System.Threading.ManualResetEvent"/>.
+            </summary>
+            <remarks>
+            All public and protected members of <see cref="T:System.Threading.ManualResetEventSlim"/> are thread-safe and may be used
+            concurrently from multiple threads, with the exception of Dispose, which
+            must only be used when all other operations on the <see cref="T:System.Threading.ManualResetEventSlim"/> have
+            completed, and Reset, which should only be used when no other threads are
+            accessing the event.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.ManualResetEventSlim"/>
+            class with an initial state of nonsignaled.
+            </summary>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.#ctor(System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.ManualResetEventSlim"/>
+            class with a Boolen value indicating whether to set the intial state to signaled.
+            </summary>
+            <param name="initialState">true to set the initial state signaled; false to set the initial state
+            to nonsignaled.</param>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.#ctor(System.Boolean,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.ManualResetEventSlim"/>
+            class with a Boolen value indicating whether to set the intial state to signaled and a specified
+            spin count.
+            </summary>
+            <param name="initialState">true to set the initial state to signaled; false to set the initial state
+            to nonsignaled.</param>
+            <param name="spinCount">The number of spin waits that will occur before falling back to a true
+            wait.</param>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="spinCount"/> is less than
+            0 or greater than the maximum allowed value.</exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Initialize(System.Boolean,System.Int32)">
+            <summary>
+            Initializes the internal state of the event.
+            </summary>
+            <param name="initialState">Whether the event is set initially or not.</param>
+            <param name="spinCount">The spin count that decides when the event will block.</param>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.EnsureLockObjectCreated">
+            <summary>
+            Helper to ensure the lock object is created before first use.
+            </summary>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.LazyInitializeEvent">
+            <summary>
+            This method lazily initializes the event object. It uses CAS to guarantee that
+            many threads racing to call this at once don't result in more than one event
+            being stored and used. The event will be signaled or unsignaled depending on
+            the state of the thin-event itself, with synchronization taken into account.
+            </summary>
+            <returns>True if a new event was created and stored, false otherwise.</returns>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Set">
+            <summary>
+            Sets the state of the event to signaled, which allows one or more threads waiting on the event to
+            proceed.
+            </summary>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Set(System.Boolean)">
+            <summary>
+            Private helper to actually perform the Set.
+            </summary>
+            <param name="duringCancellation">Indicates whether we are calling Set() during cancellation.</param>
+            <exception cref="T:System.OperationCanceledException">The object has been canceled.</exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Reset">
+            <summary>
+            Sets the state of the event to nonsignaled, which causes threads to block.
+            </summary>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.ManualResetEventSlim"/>, <see cref="M:System.Threading.ManualResetEventSlim.Reset"/> is not
+            thread-safe and may not be used concurrently with other members of this instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set.
+            </summary>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+            <remarks>
+            The caller of this method blocks indefinitely until the current instance is set. The caller will
+            return immediately if the event is currently in a set state.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.Threading.CancellationToken)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> receives a signal,
+            while observing a <see cref="T:System.Threading.CancellationToken"/>.
+            </summary>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to
+            observe.</param>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+            <exception cref="T:System.OperationCanceledExcepton"><paramref name="cancellationToken"/> was
+            canceled.</exception>
+            <remarks>
+            The caller of this method blocks indefinitely until the current instance is set. The caller will
+            return immediately if the event is currently in a set state.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.TimeSpan)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set, using a
+            <see cref="T:System.TimeSpan"/> to measure the time interval.
+            </summary>
+            <param name="timeout">A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds
+            to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <returns>true if the <see cref="T:System.Threading.ManualResetEventSlim"/> was set; otherwise,
+            false.</returns>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="timeout"/> is a negative
+            number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater
+            than <see cref="F:System.Int32.MaxValue"/>.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.TimeSpan,System.Threading.CancellationToken)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set, using a
+            <see cref="T:System.TimeSpan"/> to measure the time interval, while observing a <see cref="T:System.Threading.CancellationToken"/>.
+            </summary>
+            <param name="timeout">A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds
+            to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to
+            observe.</param>
+            <returns>true if the <see cref="T:System.Threading.ManualResetEventSlim"/> was set; otherwise,
+            false.</returns>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="timeout"/> is a negative
+            number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater
+            than <see cref="F:System.Int32.MaxValue"/>.</exception>
+            <exception cref="T:System.Threading.OperationCanceledException"><paramref name="cancellationToken"/> was canceled.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.Int32)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set, using a
+            32-bit signed integer to measure the time interval.
+            </summary>
+            <param name="millisecondsTimeout">The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/>(-1) to wait indefinitely.</param>
+            <returns>true if the <see cref="T:System.Threading.ManualResetEventSlim"/> was set; otherwise,
+            false.</returns>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="millisecondsTimeout"/> is a
+            negative number other than -1, which represents an infinite time-out.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set, using a
+            32-bit signed integer to measure the time interval, while observing a <see cref="T:System.Threading.CancellationToken"/>.
+            </summary>
+            <param name="millisecondsTimeout">The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/>(-1) to wait indefinitely.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to
+            observe.</param>
+            <returns>true if the <see cref="T:System.Threading.ManualResetEventSlim"/> was set; otherwise,
+            false.</returns>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="millisecondsTimeout"/> is a
+            negative number other than -1, which represents an infinite time-out.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+            <exception cref="T:System.Threading.OperationCanceledException"><paramref name="cancellationToken"/> was canceled.</exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Dispose">
+            <summary>
+            Releases all resources used by the current instance of <see cref="T:System.Threading.ManualResetEventSlim"/>.
+            </summary>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.ManualResetEventSlim"/>, <see cref="M:System.Threading.ManualResetEventSlim.Dispose"/> is not
+            thread-safe and may not be used concurrently with other members of this instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Dispose(System.Boolean)">
+            <summary>
+            When overridden in a derived class, releases the unmanaged resources used by the 
+            <see cref="T:System.Threading.ManualResetEventSlim"/>, and optionally releases the managed resources.
+            </summary>
+            <param name="disposing">true to release both managed and unmanaged resources;
+            false to release only unmanaged resources.</param>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.ManualResetEventSlim"/>, <see cref="M:System.Threading.ManualResetEventSlim.Dispose(System.Boolean)"/> is not
+            thread-safe and may not be used concurrently with other members of this instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.ThrowIfDisposed">
+            <summary>
+            Throw ObjectDisposedException if the MRES is disposed
+            </summary>
+        </member>
+        <member name="F:System.Threading.ManualResetEventSlim.s_cancellationTokenCallback">
+            <summary>
+            Private helper method to wake up waiters when a cancellationToken gets canceled.
+            </summary>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.UpdateStateAtomically(System.Int32,System.Int32)">
+            <summary>
+            Private helper method for updating parts of a bit-string state value.
+            Mainly called from the IsSet and Waiters properties setters
+            </summary>
+            <remarks>
+            Note: the parameter types must be int as CompareExchange cannot take a Uint
+            </remarks>
+            <param name="newBits">The new value</param>
+            <param name="updateBitsMask">The mask used to set the bits</param>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.ExtractStatePortionAndShiftRight(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Private helper method - performs Mask and shift, particular helpful to extract a field from a packed word.
+            eg ExtractStatePortionAndShiftRight(0x12345678, 0xFF000000, 24) => 0x12, ie extracting the top 8-bits as a simple integer 
+            
+            ?? is there a common place to put this rather than being private to MRES?
+            </summary>
+            <param name="state"></param>
+            <param name="mask"></param>
+            <param name="rightBitShiftCount"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.ExtractStatePortion(System.Int32,System.Int32)">
+            <summary>
+            Performs a Mask operation, but does not perform the shift.
+            This is acceptable for boolean values for which the shift is unnecessary
+            eg (val & Mask) != 0 is an appropriate way to extract a boolean rather than using
+            ((val & Mask) >> shiftAmount) == 1
+            
+            ?? is there a common place to put this rather than being private to MRES?
+            </summary>
+            <param name="state"></param>
+            <param name="mask"></param>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.UpdateTimeOut(System.Int64,System.Int32)">
+            <summary>
+            Helper function to measure and update the wait time
+            </summary>
+            <param name="startTimeTicks"> The first time (in Ticks) observed when the wait started.</param>
+            <param name="originalWaitMillisecondsTimeout">The orginal wait timeoutout in milliseconds.</param>
+            <returns>The new wait time in milliseconds, -1 if the time expired, -2 if overflow in counters
+            has occurred.</returns>
+        </member>
+        <member name="P:System.Threading.ManualResetEventSlim.WaitHandle">
+            <summary>
+            Gets the underlying <see cref="T:System.Threading.WaitHandle"/> object for this <see cref="T:System.Threading.ManualResetEventSlim"/>.
+            </summary>
+            <value>The underlying <see cref="T:System.Threading.WaitHandle"/> event object fore this <see cref="T:System.Threading.ManualResetEventSlim"/>.</value>
+            <remarks>
+            Accessing this property forces initialization of an underlying event object if one hasn't
+            already been created.  To simply wait on this <see cref="T:System.Threading.ManualResetEventSlim"/>, 
+            the public Wait methods should be preferred.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.ManualResetEventSlim.IsSet">
+            <summary>
+            Gets whether the event is set.
+            </summary>
+            <value>true if the event has is set; otherwise, false.</value>
+        </member>
+        <member name="P:System.Threading.ManualResetEventSlim.SpinCount">
+            <summary>
+            Gets the number of spin waits that will be occur before falling back to a true wait.
+            </summary>
+        </member>
+        <member name="P:System.Threading.ManualResetEventSlim.Waiters">
+            <summary>
+            How many threads are waiting.
+            </summary>
+        </member>
+        <member name="T:System.Threading.SpinWait">
+            <summary>
+            Provides support for spin-based waiting.
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.SpinWait"/> encapsulates common spinning logic. On single-processor machines, yields are
+            always used instead of busy waits, and on computers with Intel™ processors employing Hyper-Threading™
+            technology, it helps to prevent hardware thread starvation. SpinWait encapsulates a good mixture of
+            spinning and true yielding.
+            </para>
+            <para>
+            <see cref="T:System.Threading.SpinWait"/> is a value type, which means that low-level code can utilize SpinWait without
+            fear of unnecessary allocation overheads. SpinWait is not generally useful for ordinary applications.
+            In most cases, you should use the synchronization classes provided by the .NET Framework, such as
+            <see cref="T:System.Threading.Monitor"/>. For most purposes where spin waiting is required, however,
+            the <see cref="T:System.Threading.SpinWait"/> type should be preferred over the System.Threading.Thread.SpinWait method.
+            </para>
+            <para>
+            While SpinWait is designed to be used in concurrent applications, it is not designed to be
+            used from multiple threads concurrently.  SpinWait's members are not thread-safe.  If multiple
+            threads must spin, each should use its own instance of SpinWait.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.SpinWait.SpinOnce">
+            <summary>
+            Performs a single spin.
+            </summary>
+            <remarks>
+            This is typically called in a loop, and may change in behavior based on the number of times a
+            <see cref="M:System.Threading.SpinWait.SpinOnce"/> has been called thus far on this instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.SpinWait.Reset">
+            <summary>
+            Resets the spin counter.
+            </summary>
+            <remarks>
+            This makes <see cref="M:System.Threading.SpinWait.SpinOnce"/> and <see cref="P:System.Threading.SpinWait.NextSpinWillYield"/> behave as though no calls
+            to <see cref="M:System.Threading.SpinWait.SpinOnce"/> had been issued on this instance. If a <see cref="T:System.Threading.SpinWait"/> instance
+            is reused many times, it may be useful to reset it to avoid yielding too soon.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean})">
+            <summary>
+            Spins until the specified condition is satisfied.
+            </summary>
+            <param name="condition">A delegate to be executed over and over until it returns true.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="condition"/> argument is null.</exception>
+        </member>
+        <member name="M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean},System.TimeSpan)">
+            <summary>
+            Spins until the specified condition is satisfied or until the specified timeout is expired.
+            </summary>
+            <param name="condition">A delegate to be executed over and over until it returns true.</param>
+            <param name="timeout">
+            A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds to wait, 
+            or a TimeSpan that represents -1 milliseconds to wait indefinitely.</param>
+            <returns>True if the condition is satisfied within the timeout; otherwise, false</returns>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="condition"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="timeout"/> is a negative number
+            other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater than
+            <see cref="F:System.Int32.MaxValue"/>.</exception>
+        </member>
+        <member name="M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean},System.Int32)">
+            <summary>
+            Spins until the specified condition is satisfied or until the specified timeout is expired.
+            </summary>
+            <param name="condition">A delegate to be executed over and over until it returns true.</param>
+            <param name="millisecondsTimeout">The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to wait indefinitely.</param>
+            <returns>True if the condition is satisfied within the timeout; otherwise, false</returns>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="condition"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="millisecondsTimeout"/> is a
+            negative number other than -1, which represents an infinite time-out.</exception>
+        </member>
+        <member name="P:System.Threading.SpinWait.Count">
+            <summary>
+            Gets the number of times <see cref="M:System.Threading.SpinWait.SpinOnce"/> has been called on this instance.
+            </summary>
+        </member>
+        <member name="P:System.Threading.SpinWait.NextSpinWillYield">
+            <summary>
+            Gets whether the next call to <see cref="M:System.Threading.SpinWait.SpinOnce"/> will yield the processor, triggering a
+            forced context switch.
+            </summary>
+            <value>Whether the next call to <see cref="M:System.Threading.SpinWait.SpinOnce"/> will yield the processor, triggering a
+            forced context switch.</value>
+            <remarks>
+            On a single-CPU machine, <see cref="M:System.Threading.SpinWait.SpinOnce"/> always yields the processor. On machines with
+            multiple CPUs, <see cref="M:System.Threading.SpinWait.SpinOnce"/> may yield after an unspecified number of calls.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.PlatformHelper">
+            <summary>
+            A helper class to get the number of preocessors, it updates the numbers of processors every sampling interval
+            </summary>
+        </member>
+        <member name="P:System.Threading.PlatformHelper.ProcessorCount">
+            <summary>
+            Gets the number of available processors
+            </summary>
+        </member>
+        <member name="P:System.Threading.PlatformHelper.IsSingleProcessor">
+            <summary>
+            Gets whether the current machine has only a single processor.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.Task`1">
+            <summary>
+            Represents an asynchronous operation that produces a result at some time in the future.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by this <see cref="T:System.Threading.Tasks.Task`1"/>.
+            </typeparam>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.Tasks.Task`1"/> instances may be created in a variety of ways. The most common approach is by
+            using the task's <see cref="P:System.Threading.Tasks.Task`1.Factory"/> property to retrieve a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance that can be used to create tasks for several
+            purposes. For example, to create a <see cref="T:System.Threading.Tasks.Task`1"/> that runs a function, the factory's StartNew
+            method may be used:
+            <code>
+            // C# 
+            var t = Task<int>.Factory.StartNew(() => GenerateResult());
+            - or -
+            var t = Task.Factory.StartNew(() => GenerateResult());
+            
+            ' Visual Basic 
+            Dim t = Task<int>.Factory.StartNew(Function() GenerateResult())
+            - or -
+            Dim t = Task.Factory.StartNew(Function() GenerateResult())
+            </code>
+            </para>
+            <para>
+            The <see cref="T:System.Threading.Tasks.Task`1"/> class also provides constructors that initialize the task but that do not
+            schedule it for execution. For performance reasons, the StartNew method should be the
+            preferred mechanism for creating and scheduling computational tasks, but for scenarios where creation
+            and scheduling must be separated, the constructors may be used, and the task's 
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see>
+            method may then be used to schedule the task for execution at a later time.
+            </para>
+            <para>
+            All members of <see cref="T:System.Threading.Tasks.Task`1"/>, except for 
+            <see cref="M:System.Threading.Tasks.Task.Dispose">Dispose</see>, are thread-safe
+            and may be used from multiple threads concurrently.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.Task">
+            <summary>
+            Represents an asynchronous operation.
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.Tasks.Task"/> instances may be created in a variety of ways. The most common approach is by
+            using the Task type's <see cref="P:System.Threading.Tasks.Task.Factory"/> property to retrieve a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance that can be used to create tasks for several
+            purposes. For example, to create a <see cref="T:System.Threading.Tasks.Task"/> that runs an action, the factory's StartNew
+            method may be used:
+            <code>
+            // C# 
+            var t = Task.Factory.StartNew(() => DoAction());
+            
+            ' Visual Basic 
+            Dim t = Task.Factory.StartNew(Function() DoAction())
+            </code>
+            </para>
+            <para>
+            The <see cref="T:System.Threading.Tasks.Task"/> class also provides constructors that initialize the Task but that do not
+            schedule it for execution. For performance reasons, TaskFactory's StartNew method should be the
+            preferred mechanism for creating and scheduling computational tasks, but for scenarios where creation
+            and scheduling must be separated, the constructors may be used, and the task's <see cref="M:System.Threading.Tasks.Task.Start"/>
+            method may then be used to schedule the task for execution at a later time.
+            </para>
+            <para>
+            All members of <see cref="T:System.Threading.Tasks.Task"/>, except for <see cref="M:System.Threading.Tasks.Task.Dispose"/>, are thread-safe
+            and may be used from multiple threads concurrently.
+            </para>
+            <para>
+            For operations that return values, the <see cref="T:System.Threading.Tasks.Task`1"/> class
+            should be used.
+            </para>
+            <para>
+            For developers implementing custom debuggers, several internal and private members of Task may be
+            useful (these may change from release to release). The Int32 m_taskId field serves as the backing
+            store for the <see cref="P:System.Threading.Tasks.Task.Id"/> property, however accessing this field directly from a debugger may be
+            more efficient than accessing the same value through the property's getter method (the
+            s_taskIdCounter Int32 counter is used to retrieve the next available ID for a Task). Similarly, the
+            Int32 m_stateFlags field stores information about the current lifecycle stage of the Task,
+            information also accessible through the <see cref="P:System.Threading.Tasks.Task.Status"/> property. The m_action System.Object
+            field stores a reference to the Task's delegate, and the m_stateObject System.Object field stores the
+            async state passed to the Task by the developer. Finally, for debuggers that parse stack frames, the
+            InternalWait method serves a potential marker for when a Task is entering a wait operation.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#cctor">
+            <summary>
+            A type initializer that runs with the appropriate permissions.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the Task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="action"/> argument is null.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action,System.Threading.CancellationToken)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action and <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the Task.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            that will be assigned to the new Task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="action"/> argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action and creation options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the Task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action and creation options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the Task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action{System.Object},System.Object)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action and state.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action{System.Object},System.Object,System.Threading.CancellationToken)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action, state, snd options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new task.</param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action{System.Object},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action, state, snd options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the Task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action{System.Object},System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action, state, snd options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the Task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Object,System.Object,System.Threading.Tasks.Task,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            An internal constructor used by the factory methods on task and its descendent(s).
+            This variant does not capture the ExecutionContext; it is up to the caller to do that.
+            </summary>
+            <param name="action">An action to execute.</param>
+            <param name="state">Optional state to pass to the action.</param>
+            <param name="parent">Parent of Task.</param>
+            <param name="cancellationToken">A CancellationToken for the task.</param>
+            <param name="scheduler">A task scheduler under which the task will run.</param>
+            <param name="creationOptions">Options to control its execution.</param>
+            <param name="internalOptions">Internal options to control its execution</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.TaskConstructorCore(System.Object,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Common logic used by the following internal ctors:
+                Task()
+                Task(object action, object state, Task parent, TaskCreationOptions options, TaskScheduler taskScheduler)
+            
+            ASSUMES THAT m_creatingTask IS ALREADY SET.
+            
+            </summary>
+            <param name="action">Action for task to execute.</param>
+            <param name="state">Object to which to pass to action (may be null)</param>
+            <param name="scheduler">Task scheduler on which to run thread (only used by continuation tasks).</param>
+            <param name="cancellationToken">A CancellationToken for the Task.</param>
+            <param name="creationOptions">Options to customize behavior of Task.</param>
+            <param name="internalOptions">Internal options to customize behavior of Task.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.DeregisterCancellationCallback">
+            <summary>
+            Checks if we registered a CT callback during construction, and deregisters it. 
+            This should be called when we know the registration isn't useful anymore. Specifically from Finish() if the task has completed
+            successfully or with an exception.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.PossiblyCaptureContext(System.Threading.StackCrawlMark@)">
+            <summary>
+            Captures the ExecutionContext so long as flow isn't suppressed.
+            </summary>
+            <param name="stackMark">A stack crawl mark pointing to the frame of the caller.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.AddNewChild">
+            <summary>
+            Internal function that will be called by a new child task to add itself to 
+            the children list of the parent (this).
+            
+            Since a child task can only be created from the thread executing the action delegate
+            of this task, reentrancy is neither required nor supported. This should not be called from
+            anywhere other than the task construction/initialization codepaths.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Start">
+            <summary>
+            Starts the <see cref="T:System.Threading.Tasks.Task"/>, scheduling it for execution to the current <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>.
+            </summary>
+            <remarks>
+            A task may only be started and run only once.  Any attempts to schedule a task a second time
+            will result in an exception.
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">
+            The <see cref="T:System.Threading.Tasks.Task"/> is not in a valid state to be started. It may have already been started,
+            executed, or canceled, or it may have been created in a manner that doesn't support direct
+            scheduling.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> instance has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Start(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Starts the <see cref="T:System.Threading.Tasks.Task"/>, scheduling it for execution to the specified <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>.
+            </summary>
+            <remarks>
+            A task may only be started and run only once. Any attempts to schedule a task a second time will
+            result in an exception.
+            </remarks>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> with which to associate
+            and execute this task.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.InvalidOperationException">
+            The <see cref="T:System.Threading.Tasks.Task"/> is not in a valid state to be started. It may have already been started,
+            executed, or canceled, or it may have been created in a manner that doesn't support direct
+            scheduling.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> instance has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.RunSynchronously">
+            <summary>
+            Runs the <see cref="T:System.Threading.Tasks.Task"/> synchronously on the current <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>.
+            </summary>
+            <remarks>
+            <para>
+            A task may only be started and run only once. Any attempts to schedule a task a second time will
+            result in an exception.
+            </para>
+            <para>
+            Tasks executed with <see cref="M:System.Threading.Tasks.Task.RunSynchronously"/> will be associated with the current <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>.
+            </para>
+            <para>
+            If the target scheduler does not support running this Task on the current thread, the Task will
+            be scheduled for execution on the scheduler, and the current thread will block until the
+            Task has completed execution.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">
+            The <see cref="T:System.Threading.Tasks.Task"/> is not in a valid state to be started. It may have already been started,
+            executed, or canceled, or it may have been created in a manner that doesn't support direct
+            scheduling.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> instance has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.RunSynchronously(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Runs the <see cref="T:System.Threading.Tasks.Task"/> synchronously on the <see cref="T:System.Threading.Tasks.TaskScheduler">scheduler</see> provided.
+            </summary>
+            <remarks>
+            <para>
+            A task may only be started and run only once. Any attempts to schedule a task a second time will
+            result in an exception.
+            </para>
+            <para>
+            If the target scheduler does not support running this Task on the current thread, the Task will
+            be scheduled for execution on the scheduler, and the current thread will block until the
+            Task has completed execution.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">
+            The <see cref="T:System.Threading.Tasks.Task"/> is not in a valid state to be started. It may have already been started,
+            executed, or canceled, or it may have been created in a manner that doesn't support direct
+            scheduling.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> instance has been disposed.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="scheduler"/> parameter
+            is null.</exception>
+            <param name="scheduler">The scheduler on which to attempt to run this task inline.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ThrowIfDisposed">
+            <summary>
+            Throws an exception if the task has been disposed, and hence can no longer be accessed.
+            </summary>
+            <exception cref="T:System.ObjectDisposedException">The task has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.SetCompleted">
+            <summary>
+            Sets the internal completion event.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Dispose">
+            <summary>
+            Disposes the <see cref="T:System.Threading.Tasks.Task"/>, releasing all of its unmanaged resources.  
+            </summary>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.Tasks.Task"/>, this method is not thread-safe.
+            Also, <see cref="M:System.Threading.Tasks.Task.Dispose"/> may only be called on a <see cref="T:System.Threading.Tasks.Task"/> that is in one of
+            the final states: <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>,
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">
+            The exception that is thrown if the <see cref="T:System.Threading.Tasks.Task"/> is not in 
+            one of the final states: <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>,
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </exception>       
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Dispose(System.Boolean)">
+            <summary>
+            Disposes the <see cref="T:System.Threading.Tasks.Task"/>, releasing all of its unmanaged resources.  
+            </summary>
+            <param name="disposing">
+            A Boolean value that indicates whether this method is being called due to a call to <see cref="M:System.Threading.Tasks.Task.Dispose"/>.
+            </param>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.Tasks.Task"/>, this method is not thread-safe.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ScheduleAndStart(System.Boolean)">
+            <summary>
+            Schedules the task for execution.
+            </summary>
+            <param name="needsProtection">If true, TASK_STATE_STARTED bit is turned on in
+            an atomic fashion, making sure that TASK_STATE_CANCELED does not get set
+            underneath us.  If false, TASK_STATE_STARTED bit is OR-ed right in.  This
+            allows us to streamline things a bit for StartNew(), where competing cancellations
+            are not a problem.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.AddException(System.Object)">
+            <summary>
+            Adds an exception to the list of exceptions this task has thrown.
+            </summary>
+            <param name="exceptionObject">An object representing either an Exception or a collection of Exceptions.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.GetExceptions(System.Boolean)">
+            <summary>
+            Returns a list of exceptions by aggregating the holder's contents. Or null if
+            no exceptions have been thrown.
+            </summary>
+            <param name="includeTaskCanceledExceptions">Whether to include a TCE if cancelled.</param>
+            <returns>An aggregate exception, or null if no exceptions have been caught.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ThrowIfExceptional(System.Boolean)">
+            <summary>
+            Throws an aggregate exception if the task contains exceptions. 
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.UpdateExceptionObservedStatus">
+            <summary>
+            Checks whether this is an attached task, and whether we are being called by the parent task.
+            And sets the TASK_STATE_EXCEPTIONOBSERVEDBYPARENT status flag based on that.
+            
+            This is meant to be used internally when throwing an exception, and when WaitAll is gathering 
+            exceptions for tasks it waited on. If this flag gets set, the implicit wait on children 
+            will skip exceptions to prevent duplication.
+            
+            This should only be called when this task has completed with an exception
+            
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Finish(System.Boolean)">
+             <summary>
+             Signals completion of this particular task.
+            
+             The bUserDelegateExecuted parameter indicates whether this Finish() call comes following the
+             full execution of the user delegate. 
+             
+             If bUserDelegateExecuted is false, it mean user delegate wasn't invoked at all (either due to
+             a cancellation request, or because this task is a promise style Task). In this case, the steps
+             involving child tasks (i.e. WaitForChildren) will be skipped.
+             
+             </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FinishStageTwo">
+            <summary>
+            FinishStageTwo is to be executed as soon as we known there are no more children to complete. 
+            It can happen i) either on the thread that originally executed this task (if no children were spawned, or they all completed by the time this task's delegate quit)
+                         ii) or on the thread that executed the last child.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FinishStageThree">
+            <summary>
+            Final stage of the task completion code path. Notifies the parent (if any) that another of its childre are done, and runs continuations.
+            This function is only separated out from FinishStageTwo because these two operations are also needed to be called from CancellationCleanupLogic()
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ProcessChildCompletion(System.Threading.Tasks.Task)">
+            <summary>
+            This is called by children of this task when they are completed.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.AddExceptionsFromChildren">
+            <summary>
+            This is to be called just before the task does its final state transition. 
+            It traverses the list of exceptional children, and appends their aggregate exceptions into this one's exception list
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FinishThreadAbortedTask(System.Boolean,System.Boolean)">
+            <summary>
+            Special purpose Finish() entry point to be used when the task delegate throws a ThreadAbortedException
+            This makes a note in the state flags so that we avoid any costly synchronous operations in the finish codepath
+            such as inlined continuations
+            </summary>
+            <param name="bTAEAddedToExceptionHolder">
+            Indicates whether the ThreadAbortException was added to this task's exception holder. 
+            This should always be true except for the case of non-root self replicating task copies.
+            </param>
+            <param name="delegateRan">Whether the delegate was executed.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Execute">
+            <summary>
+            Executes the task. This method will only be called once, and handles bookeeping associated with
+            self-replicating tasks, in addition to performing necessary exception marshaling.
+            </summary>
+            <exception cref="T:System.ObjectDisposedException">The task has already been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.System#Threading#Tasks#IThreadPoolWorkItem#ExecuteWorkItem">
+            <summary>
+            IThreadPoolWorkItem override, which is the entry function for this task when the TP scheduler decides to run it.
+            
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ExecuteEntry(System.Boolean)">
+            <summary>
+            Outermost entry function to execute this task. Handles all aspects of executing a task on the caller thread.
+            Currently this is called by IThreadPoolWorkItem.ExecuteWorkItem(), and TaskManager.TryExecuteInline. 
+            
+            </summary>
+            <param name="bPreventDoubleExecution"> Performs atomic updates to prevent double execution. Should only be set to true
+            in codepaths servicing user provided TaskSchedulers. The ConcRT or ThreadPool schedulers don't need this. </param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.InnerInvoke">
+            <summary>
+            The actual code which invokes the body of the task. This can be overriden in derived types.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.InnerInvokeWithArg(System.Threading.Tasks.Task)">
+            <summary>
+            Alternate InnerInvoke prototype to be called from ExecuteSelfReplicating() so that
+            the Parallel Debugger can discover the actual task being invoked. 
+            Details: Here, InnerInvoke is actually being called on the rootTask object while we are actually executing the
+            childTask. And the debugger needs to discover the childTask, so we pass that down as an argument.
+            The NoOptimization and NoInlining flags ensure that the childTask pointer is retained, and that this
+            function appears on the callstack.
+            </summary>
+            <param name="childTask"></param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.HandleException(System.Exception)">
+            <summary>
+            Performs whatever handling is necessary for an unhandled exception. Normally
+            this just entails adding the exception to the holder object. 
+            </summary>
+            <param name="unhandledException">The exception that went unhandled.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during
+            the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait(System.TimeSpan)">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <param name="timeout">
+            A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <returns>
+            true if the <see cref="T:System.Threading.Tasks.Task"/> completed execution within the allotted time; otherwise, false.
+            </returns>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="timeout"/> is a negative number other than -1 milliseconds, which represents an
+            infinite time-out -or- timeout is greater than
+            <see cref="F:System.Int32.MaxValue"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait(System.Threading.CancellationToken)">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for the task to complete.
+            </param>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/>
+            has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait(System.Int32)">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.</param>
+            <returns>true if the <see cref="T:System.Threading.Tasks.Task"/> completed execution within the allotted time; otherwise,
+            false.
+            </returns>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/>
+            has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait(System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for the task to complete.
+            </param>
+            <returns>
+            true if the <see cref="T:System.Threading.Tasks.Task"/> completed execution within the allotted time; otherwise, false.
+            </returns>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/>
+            has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.InternalWait(System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            The core wait function, which is only accesible internally. It's meant to be used in places in TPL code where 
+            the current context is known or cached.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.InternalCancel(System.Boolean)">
+            <summary>
+            Cancels the <see cref="T:System.Threading.Tasks.Task"/>.
+            </summary>
+            <param name="bCancelNonExecutingOnly"> Indiactes whether we should only cancel non-invoked tasks.
+            For the default scheduler this option will only be serviced through TryDequeue.
+            For custom schedulers we also attempt an atomic state transition.</param>
+            <returns>true if the task was successfully canceled; otherwise, false.</returns>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="T:System.Threading.Tasks.Task"/>
+            has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.SetCancellationAcknowledged">
+            <summary>
+            Sets the task's cancellation acknowledged flag.
+            </summary>    
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FinishContinuations">
+            <summary>
+            Runs all of the continuations, as appropriate.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWithIsRightKind(System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Helper function to determine whether the current task is in the state desired by the
+            continuation kind under evaluation. Three possibilities exist: the task failed with
+            an unhandled exception (OnFailed), the task was canceled before running (OnAborted),
+            or the task completed successfully (OnCompletedSuccessfully).  Note that the last
+            one includes completing due to cancellation.
+            </summary>
+            <param name="options">The continuation options under evaluation.</param>
+            <returns>True if the continuation should be run given the task's current state.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task})">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken"> The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task},System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes.  When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed. If the continuation criteria specified through the <paramref name="continuationOptions"/> parameter are not met, the continuation task will be canceled
+            instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its
+            execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed. If the criteria specified through the <paramref name="continuationOptions"/> parameter
+            are not met, the continuation task will be canceled instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0})">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0},System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes.  When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed. If the continuation criteria specified through the <paramref name="continuationOptions"/> parameter are not met, the continuation task will be canceled
+            instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its
+            execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed. If the criteria specified through the <paramref name="continuationOptions"/> parameter
+            are not met, the continuation task will be canceled instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.CreationOptionsFromContinuationOptions(System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskCreationOptions@,System.Threading.Tasks.InternalTaskOptions@)">
+            <summary>
+            Converts TaskContinuationOptions to TaskCreationOptions, and also does
+            some validity checking along the way.
+            </summary>
+            <param name="continuationOptions">Incoming TaskContinuationOptions</param>
+            <param name="creationOptions">Outgoing TaskCreationOptions</param>
+            <param name="internalOptions">Outgoing InternalTaskOptions</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWithCore(System.Threading.Tasks.Task,System.Threading.Tasks.TaskScheduler,System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Registers the continuation and possibly runs it (if the task is already finished).
+            </summary>
+            <param name="continuationTask">The continuation task itself.</param>
+            <param name="scheduler">TaskScheduler with which to associate continuation task.</param>
+            <param name="options">Restrictions on when the continuation becomes active.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[])">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.TimeSpan)">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <returns>
+            true if all of the <see cref="T:System.Threading.Tasks.Task"/> instances completed execution within the allotted time;
+            otherwise, false.
+            </returns>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="timeout">
+            A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="timeout"/> is a negative number other than -1 milliseconds, which represents an
+            infinite time-out -or- timeout is greater than
+            <see cref="F:System.Int32.MaxValue"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.Int32)">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <returns>
+            true if all of the <see cref="T:System.Threading.Tasks.Task"/> instances completed execution within the allotted time;
+            otherwise, false.
+            </returns>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.</param>
+            <param name="tasks">An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.Threading.CancellationToken)">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <returns>
+            true if all of the <see cref="T:System.Threading.Tasks.Task"/> instances completed execution within the allotted time;
+            otherwise, false.
+            </returns>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for the tasks to complete.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <returns>
+            true if all of the <see cref="T:System.Threading.Tasks.Task"/> instances completed execution within the allotted time;
+            otherwise, false.
+            </returns>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for the tasks to complete.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAllSTAAnd64Aware(System.Threading.WaitHandle[],System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Waits for a set of handles in a STA-aware way.  In other words, it will wait for each
+            of the events individually if we're on a STA thread, because MsgWaitForMultipleObjectsEx
+            can't do a true wait-all due to its hidden message queue event. This is not atomic,
+            of course, but we only wait on one-way (MRE) events anyway so this is OK.
+            </summary>
+            <param name="waitHandles">An array of wait handles to wait on.</param>
+            <param name="millisecondsTimeout">The timeout to use during waits.</param>
+            <param name="cancellationToken">The cancellationToken that enables a wait to be canceled.</param>
+            <returns>True if all waits succeeded, false if a timeout occurred.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FastWaitAll(System.Threading.Tasks.Task[])">
+            <summary>
+            Internal WaitAll implementation which is meant to be used with small number of tasks,
+            optimized for Parallel.Invoke and other structured primitives.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.AddExceptionsForCompletedTask(System.Collections.Generic.List{System.Exception}@,System.Threading.Tasks.Task)">
+            <summary>
+            This internal function is only meant to be called by WaitAll()
+            If the completed task is canceled or it has other exceptions, here we will add those
+            into the passed in exception list (which will be lazily initialized here).
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[])">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <returns>The index of the completed task in the <paramref name="tasks"/> array argument.</returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[],System.TimeSpan)">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="timeout">
+            A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <returns>
+            The index of the completed task in the <paramref name="tasks"/> array argument, or -1 if the
+            timeout occurred.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="timeout"/> is a negative number other than -1 milliseconds, which represents an
+            infinite time-out -or- timeout is greater than
+            <see cref="F:System.Int32.MaxValue"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[],System.Threading.CancellationToken)">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for a task to complete.
+            </param>
+            <returns>
+            The index of the completed task in the <paramref name="tasks"/> array argument.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[],System.Int32)">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.
+            </param>
+            <returns>
+            The index of the completed task in the <paramref name="tasks"/> array argument, or -1 if the
+            timeout occurred.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[],System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for a task to complete.
+            </param>
+            <returns>
+            The index of the completed task in the <paramref name="tasks"/> array argument, or -1 if the
+            timeout occurred.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.Id">
+            <summary>
+            Gets a unique ID for this <see cref="T:System.Threading.Tasks.Task">Task</see> instance.
+            </summary>
+            <remarks>
+            Task IDs are assigned on-demand and do not necessarily represent the order in the which Task
+            instances were created.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.CurrentId">
+            <summary>
+            Returns the unique ID of the currently executing <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.InternalCurrent">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.Task">Task</see> instance currently executing, or
+            null if none exists.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.Exception">
+            <summary>
+            Gets the <see cref="T:System.AggregateException">Exception</see> that caused the <see cref="T:System.Threading.Tasks.Task">Task</see> to end prematurely. If the <see cref="T:System.Threading.Tasks.Task">Task</see> completed successfully or has not yet thrown any
+            exceptions, this will return null.
+            </summary>
+            <remarks>
+            Tasks that throw unhandled exceptions store the resulting exception and propagate it wrapped in a
+            <see cref="T:System.AggregateException"/> in calls to <see cref="M:System.Threading.Tasks.Task.Wait">Wait</see>
+            or in accesses to the <see cref="P:System.Threading.Tasks.Task.Exception"/> property.  Any exceptions not observed by the time
+            the Task instance is garbage collected will be propagated on the finalizer thread.
+            </remarks>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task">Task</see>
+            has been disposed.
+            </exception>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.Status">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> of this Task. 
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsCanceled">
+            <summary>
+            Gets whether this <see cref="T:System.Threading.Tasks.Task">Task</see> instance has completed
+            execution due to being canceled.
+            </summary>
+            <remarks>
+            A <see cref="T:System.Threading.Tasks.Task">Task</see> will complete in Canceled state either if its <see cref="P:System.Threading.Tasks.Task.CancellationToken">CancellationToken</see> 
+            was marked for cancellation before the task started executing, or if the task acknowledged the cancellation request on 
+            its already signaled CancellationToken by throwing an 
+            <see cref="T:System.OperationCanceledException">OperationCanceledException2</see> that bears the same 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsCancellationRequested">
+            <summary>
+            Returns true if this task has a cancellation token and it was signaled.
+            To be used internally in execute entry codepaths.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.CancellationToken">
+            <summary>
+            This internal property provides access to the CancellationToken that was set on the task 
+            when it was constructed.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsCancellationAcknowledged">
+            <summary>
+            Gets whether this <see cref="T:System.Threading.Tasks.Task"/> threw an OperationCanceledException2 while its CancellationToken was signaled.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsCompleted">
+            <summary>
+            Gets whether this <see cref="T:System.Threading.Tasks.Task">Task</see> has completed.
+            </summary>
+            <remarks>
+            <see cref="P:System.Threading.Tasks.Task.IsCompleted"/> will return true when the Task is in one of the three
+            final states: <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>,
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsDisposed">
+            <summary>
+            Checks whether this task has been disposed.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.CreationOptions">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used
+            to create this task.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.System#IAsyncResult#AsyncWaitHandle">
+            <summary>
+            Gets a <see cref="T:System.Threading.WaitHandle"/> that can be used to wait for the task to
+            complete.
+            </summary>
+            <remarks>
+            Using the wait functionality provided by <see cref="M:System.Threading.Tasks.Task.Wait"/>
+            should be preferred over using <see cref="P:System.IAsyncResult.AsyncWaitHandle"/> for similar
+            functionality.
+            </remarks>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.AsyncState">
+            <summary>
+            Gets the state object supplied when the <see cref="T:System.Threading.Tasks.Task">Task</see> was created,
+            or null if none was supplied.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.System#IAsyncResult#CompletedSynchronously">
+            <summary>
+            Gets an indication of whether the asynchronous operation completed synchronously.
+            </summary>
+            <value>true if the asynchronous operation completed synchronously; otherwise, false.</value>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.ExecutingTaskScheduler">
+            <summary>
+            Provides access to the TaskScheduler responsible for executing this Task.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.Factory">
+            <summary>
+            Provides access to factory methods for creating <see cref="T:System.Threading.Tasks.Task"/> and <see cref="T:System.Threading.Tasks.Task`1"/> instances.
+            </summary>
+            <remarks>
+            The factory returned from <see cref="P:System.Threading.Tasks.Task.Factory"/> is a default instance
+            of <see cref="T:System.Threading.Tasks.TaskFactory"/>, as would result from using
+            the default constructor on TaskFactory.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.CompletedEvent">
+            <summary>
+            Provides an event that can be used to wait for completion.
+            Only called by Wait*(), which means that we really do need to instantiate a completion event.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsSelfReplicatingRoot">
+            <summary>
+            Determines whether this is the root task of a self replicating group.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsChildReplica">
+            <summary>
+            Determines whether the task is a replica itself.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.ExceptionRecorded">
+            <summary>
+            The property formerly known as IsFaulted.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsFaulted">
+            <summary>
+            Gets whether the <see cref="T:System.Threading.Tasks.Task"/> completed due to an unhandled exception.
+            </summary>
+            <remarks>
+            If <see cref="P:System.Threading.Tasks.Task.IsFaulted"/> is true, the Task's <see cref="P:System.Threading.Tasks.Task.Status"/> will be equal to
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">TaskStatus.Faulted</see>, and its
+            <see cref="P:System.Threading.Tasks.Task.Exception"/> property will be non-null.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsExceptionObservedByParent">
+            <summary>
+            Checks whether the TASK_STATE_EXCEPTIONOBSERVEDBYPARENT status flag is set,
+            This will only be used by the implicit wait to prevent double throws
+            
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsDelegateInvoked">
+            <summary>
+            Checks whether the body was ever invoked. Used by task scheduler code to verify custom schedulers actually ran the task.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.Task.TaskContinuation">
+            <summary>
+            A structure to hold continuation information.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.TaskContinuation.#ctor(System.Threading.Tasks.Task,System.Threading.Tasks.TaskScheduler,System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Constructs a new continuation structure.
+            </summary>
+            <param name="task">The task to be activated.</param>
+            <param name="options">The continuation options.</param>
+            <param name="scheduler">The scheduler to use for the continuation.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.TaskContinuation.Run(System.Threading.Tasks.Task,System.Boolean)">
+            <summary>
+            Invokes the continuation for the target completion task.
+            </summary>
+            <param name="completedTask">The completed task.</param>
+            <param name="bCanInlineContinuationTask">Whether the continuation can be inlined.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0})">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0},System.Threading.CancellationToken)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to be assigned to this task.</param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0},System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function and creation options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0},System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function and creation options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function and state.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object,System.Threading.CancellationToken)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified action, state, and options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="state">An object representing data to be used by the function.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to be assigned to the new task.</param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified action, state, and options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="state">An object representing data to be used by the function.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified action, state, and options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="state">An object representing data to be used by the function.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to be assigned to the new task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0},System.Threading.Tasks.Task,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a new future object.
+            </summary>
+            <param name="parent">The parent task for this future.</param>
+            <param name="valueSelector">A function that yields the future value.</param>
+            <param name="scheduler">The task scheduler which will be used to execute the future.</param>
+            <param name="cancellationToken">The CancellationToken for the task.</param>
+            <param name="creationOptions">Options to control the future's behavior.</param>
+            <param name="internalOptions">Internal options to control the future's behavior.</param>
+            <exception cref="T:ArgumentOutOfRangeException">The <paramref name="creationOptions"/> argument specifies
+            a SelfReplicating <see cref="T:System.Threading.Tasks.Task`1"/>, which is illegal."/>.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object,System.Threading.Tasks.Task,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a new future object.
+            </summary>
+            <param name="parent">The parent task for this future.</param>
+            <param name="state">An object containing data to be used by the action; may be null.</param>
+            <param name="valueSelector">A function that yields the future value.</param>
+            <param name="cancellationToken">The CancellationToken for the task.</param>
+            <param name="scheduler">The task scheduler which will be used to execute the future.</param>
+            <param name="creationOptions">Options to control the future's behavior.</param>
+            <param name="internalOptions">Internal options to control the future's behavior.</param>
+            <exception cref="T:ArgumentOutOfRangeException">The <paramref name="creationOptions"/> argument specifies
+            a SelfReplicating <see cref="T:System.Threading.Tasks.Task`1"/>, which is illegal."/>.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.InvokeFuture(System.Object)">
+            <summary>
+            Evaluates the value selector of the Task which is passed in as an object and stores the result.
+            </summary>        
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}})">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}},System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed. If the continuation criteria specified through the <paramref name="continuationOptions"/> parameter are not met, the continuation task will be canceled
+            instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its
+            execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed. If the criteria specified through the <paramref name="continuationOptions"/> parameter
+            are not met, the continuation task will be canceled instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0})">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current
+            task has completed, whether it completes due to running to completion successfully, faulting due
+            to an unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new task.</param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current
+            task has completed, whether it completes due to running to completion successfully, faulting due
+            to an unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0},System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes.  When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            <para>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current
+            task has completed, whether it completes due to running to completion successfully, faulting due
+            to an unhandled exception, or exiting out early due to being canceled.
+            </para>
+            <para>
+            The <paramref name="continuationFunction"/>, when executed, should return a <see cref="T:System.Threading.Tasks.Task`1"/>. This task's completion state will be transferred to the task returned
+            from the ContinueWith call.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be passed as
+            an argument this completed task.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its
+            execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            <para>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </para>
+            <para>
+            The <paramref name="continuationFunction"/>, when executed, should return a <see cref="T:System.Threading.Tasks.Task`1"/>.
+            This task's completion state will be transferred to the task returned from the
+            ContinueWith call.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="P:System.Threading.Tasks.Task`1.Result">
+            <summary>
+            Gets the result value of this <see cref="T:System.Threading.Tasks.Task`1"/>.
+            </summary>
+            <remarks>
+            The get accessor for this property ensures that the asynchronous operation is complete before
+            returning. Once the result of the computation is available, it is stored and will be returned
+            immediately on later calls to <see cref="P:System.Threading.Tasks.Task`1.Result"/>.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task`1.Factory">
+            <summary>
+            Provides access to factory methods for creating <see cref="T:System.Threading.Tasks.Task`1"/> instances.
+            </summary>
+            <remarks>
+            The factory returned from <see cref="P:System.Threading.Tasks.Task`1.Factory"/> is a default instance
+            of <see cref="T:System.Threading.Tasks.TaskFactory`1"/>, as would result from using
+            the default constructor on the factory type.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskFactory`1">
+            <summary>
+            Provides support for creating and scheduling
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task{TResult}</see> objects.
+            </summary>
+            <typeparam name="TResult">The type of the results that are available though 
+            the <see cref="T:System.Threading.Tasks.Task{TResult}">Task{TResult}</see> objects that are associated with 
+            the methods in this class.</typeparam>
+            <remarks>
+            <para>
+            There are many common patterns for which tasks are relevant. The <see cref="T:System.Threading.Tasks.TaskFactory`1"/>
+            class encodes some of these patterns into methods that pick up default settings, which are
+            configurable through its constructors.
+            </para>
+            <para>
+            A default instance of <see cref="T:System.Threading.Tasks.TaskFactory`1"/> is available through the
+            <see cref="P:System.Threading.Tasks.Task`1.Factory">Task{TResult}.Factory</see> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the default configuration.
+            </summary>
+            <remarks>
+            This constructor creates a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with a default configuration. The
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor(System.Threading.CancellationToken)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the default configuration.
+            </summary>
+            <param name="cancellationToken">The default <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned 
+            to tasks created by this <see cref="T:System.Threading.Tasks.TaskFactory"/> unless another CancellationToken is explicitly specified 
+            while calling the factory methods.</param>
+            <remarks>
+            This constructor creates a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with a default configuration. The
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the specified configuration.
+            </summary>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler">
+            TaskScheduler</see> to use to schedule any tasks created with this TaskFactory{TResult}. A null value
+            indicates that the current TaskScheduler should be used.
+            </param>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to <paramref name="scheduler"/>, unless it's null, in which case the property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor(System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the specified configuration.
+            </summary>
+            <param name="creationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskCreationOptions">
+            TaskCreationOptions</see> to use when creating tasks with this TaskFactory{TResult}.
+            </param>
+            <param name="continuationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> to use when creating continuation tasks with this TaskFactory{TResult}.
+            </param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The exception that is thrown when the
+            <paramref name="creationOptions"/> argument or the <paramref name="continuationOptions"/>
+            argument specifies an invalid value.
+            </exception>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to <paramref name="creationOptions"/>,
+            the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <paramref name="continuationOptions"/>, and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is initialized to the
+            current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the specified configuration.
+            </summary>
+            <param name="cancellationToken">The default <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned 
+            to tasks created by this <see cref="T:System.Threading.Tasks.TaskFactory"/> unless another CancellationToken is explicitly specified 
+            while calling the factory methods.</param>
+            <param name="creationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskCreationOptions">
+            TaskCreationOptions</see> to use when creating tasks with this TaskFactory{TResult}.
+            </param>
+            <param name="continuationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> to use when creating continuation tasks with this TaskFactory{TResult}.
+            </param>
+            <param name="scheduler">
+            The default <see cref="T:System.Threading.Tasks.TaskScheduler">
+            TaskScheduler</see> to use to schedule any Tasks created with this TaskFactory{TResult}. A null value
+            indicates that TaskScheduler.Current should be used.
+            </param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The exception that is thrown when the
+            <paramref name="creationOptions"/> argument or the <paramref name="continuationOptions"/>
+            argumentspecifies an invalid value.
+            </exception>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to <paramref name="creationOptions"/>,
+            the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <paramref name="continuationOptions"/>, and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is initialized to
+            <paramref name="scheduler"/>, unless it's null, in which case the property is initialized to the
+            current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{`0})">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{`0},System.Threading.CancellationToken)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned to the new task.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{`0},System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{`0},System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created <see cref="T:System.Threading.Tasks.Task{TResult}">
+            Task{TResult}</see>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="scheduler"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{System.Object,`0},System.Object)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="function"/>
+            delegate.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{System.Object,`0},System.Object,System.Threading.CancellationToken)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="function"/>
+            delegate.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned to the new task.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{System.Object,`0},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="function"/>
+            delegate.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{System.Object,`0},System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="function"/>
+            delegate.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created <see cref="T:System.Threading.Tasks.Task{TResult}">
+            Task{TResult}</see>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="scheduler"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync(System.IAsyncResult,System.Func{System.IAsyncResult,`0})">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that executes an end
+            method function when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The function delegate that processes the completed <paramref
+            name="asyncResult"/>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents the
+            asynchronous operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync(System.IAsyncResult,System.Func{System.IAsyncResult,`0},System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that executes an end
+            method function when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The function delegate that processes the completed <paramref
+            name="asyncResult"/>.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents the
+            asynchronous operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync(System.IAsyncResult,System.Func{System.IAsyncResult,`0},System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that executes an end
+            method function when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The function delegate that processes the completed <paramref name="asyncResult"/>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the task that executes the end method.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents the
+            asynchronous operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,`0},System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,`0},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync``1(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,`0},``0,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync``1(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,`0},``0,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync``2(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,`0},``0,``1,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync``2(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,`0},``0,``1,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync``3(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,`0},``0,``1,``2,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg3">The type of the third argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg3">The third argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.FromAsync``3(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,`0},``0,``1,``2,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg3">The type of the third argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg3">The third argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAll(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task[],`0})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> 
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in 
+            the <paramref name="tasks"/> array have completed.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAll(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task[],`0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> 
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in 
+            the <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAll(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task[],`0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the <paramref name="tasks"/> array have completed.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAll(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task[],`0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAll``1(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0}[],`0})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAll``1(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0}[],`0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAll``1(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0}[],`0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAll``1(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0}[],`0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAny(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task,`0})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the <paramref
+            name="tasks"/> array completes.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAny(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task,`0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAny(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task,`0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the <paramref name="tasks"/> array completes.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAny(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task,`0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAny``1(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0},`0})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAny``1(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0},`0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAny``1(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0},`0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.ContinueWhenAny``1(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0},`0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskFactory`1.CancellationToken">
+            <summary>
+            Gets the default <see cref="T:System.Threading.CancellationToken">CancellationToken</see> of this
+            TaskFactory.
+            </summary>
+            <remarks>
+            This property returns the default <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned to all 
+            tasks created by this factory unless another CancellationToken value is explicitly specified 
+            during the call to the factory methods.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskFactory`1.Scheduler">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> of this
+            TaskFactory{TResult}.
+            </summary>
+            <remarks>
+            This property returns the default scheduler for this factory.  It will be used to schedule all 
+            tasks unless another scheduler is explicitly specified during calls to this factory's methods.  
+            If null, <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see> 
+            will be used.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskFactory`1.CreationOptions">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions
+            </see> value of this TaskFactory{TResult}.
+            </summary>
+            <remarks>
+            This property returns the default creation options for this factory.  They will be used to create all 
+            tasks unless other options are explicitly specified during calls to this factory's methods.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskFactory`1.ContinuationOptions">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskContinuationOptions
+            </see> value of this TaskFactory{TResult}.
+            </summary>
+            <remarks>
+            This property returns the default continuation options for this factory.  They will be used to create 
+            all continuation tasks unless other options are explicitly specified during calls to this factory's methods.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskStatus">
+            <summary>
+            Represents the current stage in the lifecycle of a <see cref="T:System.Threading.Tasks.Task"/>.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskStatus.Created">
+            <summary> 
+            The task has been initialized but has not yet been scheduled.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskStatus.WaitingForActivation">
+            <summary> 
+            The task is waiting to be activated and scheduled internally by the .NET Framework infrastructure.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskStatus.WaitingToRun">
+            <summary>
+            The task has been scheduled for execution but has not yet begun executing.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskStatus.Running">
+            <summary>
+            The task is running but has not yet completed.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskStatus.WaitingForChildrenToComplete">
+            <summary>
+            The task has finished executing and is implicitly waiting for
+            attached child tasks to complete.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskStatus.RanToCompletion">
+            <summary>
+            The task completed execution successfully.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskStatus.Canceled">
+            <summary>
+            The task acknowledged cancellation by throwing an OperationCanceledException2 with its own CancellationToken
+            while the token was in signaled state, or the task's CancellationToken was already signaled before the
+            task started executing.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskStatus.Faulted">
+            <summary>
+            The task completed due to an unhandled exception.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskCreationOptions">
+            <summary>
+            Specifies flags that control optional behavior for the creation and execution of tasks.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskCreationOptions.None">
+            <summary>
+            Specifies that the default behavior should be used.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskCreationOptions.PreferFairness">
+            <summary>
+            A hint to a <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> to schedule a
+            task in as fair a manner as possible, meaning that tasks scheduled sooner will be more likely to
+            be run sooner, and tasks scheduled later will be more likely to be run later.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskCreationOptions.LongRunning">
+            <summary>
+            Specifies that a task will be a long-running, course-grained operation. It provides a hint to the
+            <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> that oversubscription may be
+            warranted. 
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskCreationOptions.AttachedToParent">
+            <summary>
+            Specifies that a task is attached to a parent in the task hierarchy.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.InternalTaskOptions">
+            <summary>
+            Task creation flags which are only used internally.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.InternalTaskOptions.None">
+            <summary> Specifies "No internal task options" </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.InternalTaskOptions.InternalOptionsMask">
+            <summary>Used to filter out internal vs. public task creation options.</summary>
+        </member>
+        <member name="F:System.Threading.Tasks.InternalTaskOptions.QueuedByRuntime">
+            <summary>Specifies that the task will be queued by the runtime before handing it over to the user. 
+            This flag will be used to skip the cancellationtoken registration step, which is only meant for unstarted tasks.</summary>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskContinuationOptions">
+            <summary>
+            Specifies flags that control optional behavior for the creation and execution of continuation tasks.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.None">
+            <summary>
+            Default = "Continue on any, no task options, run asynchronously"
+            Specifies that the default behavior should be used.  Continuations, by default, will
+            be scheduled when the antecedent task completes, regardless of the task's final <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see>.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.PreferFairness">
+            <summary>
+            A hint to a <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> to schedule a
+            task in as fair a manner as possible, meaning that tasks scheduled sooner will be more likely to
+            be run sooner, and tasks scheduled later will be more likely to be run later.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.LongRunning">
+            <summary>
+            Specifies that a task will be a long-running, course-grained operation.  It provides
+            a hint to the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> that
+            oversubscription may be warranted.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.AttachedToParent">
+            <summary>
+            Specifies that a task is attached to a parent in the task hierarchy.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.NotOnRanToCompletion">
+            <summary>
+            Specifies that the continuation task should not be scheduled if its antecedent ran to completion.
+            This option is not valid for multi-task continuations.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.NotOnFaulted">
+            <summary>
+            Specifies that the continuation task should not be scheduled if its antecedent threw an unhandled
+            exception. This option is not valid for multi-task continuations.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.NotOnCanceled">
+            <summary>
+            Specifies that the continuation task should not be scheduled if its antecedent was canceled. This
+            option is not valid for multi-task continuations.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnRanToCompletion">
+            <summary>
+            Specifies that the continuation task should be scheduled only if its antecedent ran to
+            completion. This option is not valid for multi-task continuations.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnFaulted">
+            <summary>
+            Specifies that the continuation task should be scheduled only if its antecedent threw an
+            unhandled exception. This option is not valid for multi-task continuations.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">
+            <summary>
+            Specifies that the continuation task should be scheduled only if its antecedent was canceled.
+            This option is not valid for multi-task continuations.
+            </summary>
+        </member>
+        <member name="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">
+            <summary>
+            Specifies that the continuation task should be executed synchronously. With this option
+            specified, the continuation will be run on the same thread that causes the antecedent task to
+            transition into its final state. If the antecedent is already complete when the continuation is
+            created, the continuation will run on the thread creating the continuation.  Only very
+            short-running continuations should be executed synchronously.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskCanceledException">
+            <summary>
+            Represents an exception used to communicate task cancellation.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCanceledException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/> class.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCanceledException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/>
+            class with a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCanceledException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/>
+            class with a specified error message and a reference to the inner exception that is the cause of
+            this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCanceledException.#ctor(System.Threading.Tasks.Task)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/> class
+            with a reference to the <see cref="T:System.Threading.Tasks.Task"/> that has been canceled.
+            </summary>
+            <param name="task">A task that has been canceled.</param>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskCanceledException.Task">
+            <summary>
+            Gets the task associated with this exception.
+            </summary>
+            <remarks>
+            It is permissible for no Task to be associated with a 
+            <see cref="T:System.Threading.Tasks.TaskCanceledException"/>, in which case
+            this property will return null.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskCompletionSource`1">
+            <summary>
+            Represents the producer side of a <see cref="T:System.Threading.Tasks.Task{TResult}"/> unbound to a
+            delegate, providing access to the consumer side through the <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> property.
+            </summary>
+            <remarks>
+            <para>
+            It is often the case that a <see cref="T:System.Threading.Tasks.Task{TResult}"/> is desired to
+            represent another asynchronous operation.
+            <see cref="T:System.Threading.Tasks.TaskCompletionSource`1">TaskCompletionSource</see> is provided for this purpose. It enables
+            the creation of a task that can be handed out to consumers, and those consumers can use the members
+            of the task as they would any other. However, unlike most tasks, the state of a task created by a
+            TaskCompletionSource is controlled explicitly by the methods on TaskCompletionSource. This enables the
+            completion of the external asynchronous operation to be propagated to the underlying Task. The
+            separation also ensures that consumers are not able to transition the state without access to the
+            corresponding TaskCompletionSource.
+            </para>
+            <para>
+            All members of <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/> are thread-safe
+            and may be used from multiple threads concurrently.
+            </para>
+            </remarks>
+            <typeparam name="TResult">The type of the result value assocatied with this <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/>.</typeparam>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.#ctor">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/>.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.#ctor(System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/>
+            with the specified options.
+            </summary>
+            <remarks>
+            The <see cref="T:System.Threading.Tasks.Task{TResult}"/> created
+            by this instance and accessible through its <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> property
+            will be instantiated using the specified <paramref name="creationOptions"/>.
+            </remarks>
+            <param name="creationOptions">The options to use when creating the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> represent options invalid for use
+            with a <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.#ctor(System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/>
+            with the specified state.
+            </summary>
+            <param name="state">The state to use as the underlying 
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>'s AsyncState.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.#ctor(System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/> with
+            the specified state and options.
+            </summary>
+            <param name="creationOptions">The options to use when creating the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">The state to use as the underlying 
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>'s AsyncState.</param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> represent options invalid for use
+            with a <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.TrySetException(System.Exception)">
+            <summary>
+            Attempts to transition the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> into the 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>
+            state.
+            </summary>
+            <param name="exception">The exception to bind to this <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>True if the operation was successful; otherwise, false.</returns>
+            <remarks>This operation will return false if the 
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> is already in one
+            of the three final states:
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>, 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> was disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.TrySetException(System.Collections.Generic.IEnumerable{System.Exception})">
+            <summary>
+            Attempts to transition the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> into the 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>
+            state.
+            </summary>
+            <param name="exceptions">The collection of exceptions to bind to this <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>True if the operation was successful; otherwise, false.</returns>
+            <remarks>This operation will return false if the 
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> is already in one
+            of the three final states:
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>, 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exceptions"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">There are one or more null elements in <paramref name="exceptions"/>.</exception>
+            <exception cref="T:System.ArgumentException">The <paramref name="exceptions"/> collection is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> was disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.SetException(System.Exception)">
+            <summary>
+            Transitions the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> into the 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>
+            state.
+            </summary>
+            <param name="exception">The exception to bind to this <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The underlying <see cref="T:System.Threading.Tasks.Task{TResult}"/> is already in one
+            of the three final states:
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>, 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> was disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.SetException(System.Collections.Generic.IEnumerable{System.Exception})">
+            <summary>
+            Transitions the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> into the 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>
+            state.
+            </summary>
+            <param name="exceptions">The collection of exceptions to bind to this <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exceptions"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">There are one or more null elements in <paramref name="exceptions"/>.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The underlying <see cref="T:System.Threading.Tasks.Task{TResult}"/> is already in one
+            of the three final states:
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>, 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> was disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.TrySetResult(`0)">
+            <summary>
+            Attempts to transition the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> into the 
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>
+            state.
+            </summary>
+            <param name="result">The result value to bind to this <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>True if the operation was successful; otherwise, false.</returns>
+            <remarks>This operation will return false if the 
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> is already in one
+            of the three final states:
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>, 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </remarks>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> was disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.SetResult(`0)">
+            <summary>
+            Transitions the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> into the 
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>
+            state.
+            </summary>
+            <param name="result">The result value to bind to this <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <exception cref="T:System.InvalidOperationException">
+            The underlying <see cref="T:System.Threading.Tasks.Task{TResult}"/> is already in one
+            of the three final states:
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>, 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> was disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.SetCanceled">
+            <summary>
+            Transitions the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> into the 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>
+            state.
+            </summary>
+            <exception cref="T:System.InvalidOperationException">
+            The underlying <see cref="T:System.Threading.Tasks.Task{TResult}"/> is already in one
+            of the three final states:
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>, 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> was disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskCompletionSource`1.TrySetCanceled">
+            <summary>
+            Attempts to transition the underlying
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> into the 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>
+            state.
+            </summary>
+            <returns>True if the operation was successful; otherwise, false.</returns>
+            <remarks>This operation will return false if the 
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/> is already in one
+            of the three final states:
+            <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>, 
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </remarks>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="P:System.Threading.Tasks.TaskCompletionSource`1.Task"/> was disposed.</exception>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskCompletionSource`1.Task">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.Task{TResult}"/> created
+            by this <see cref="T:System.Threading.Tasks.TaskCompletionSource`1"/>.
+            </summary>
+            <remarks>
+            This property enables a consumer access to the <see cref="T:System.Threading.Tasks.Task{TResult}"/> that is controlled by this instance.
+            The <see cref="M:System.Threading.Tasks.TaskCompletionSource`1.SetResult(`0)"/>, <see cref="M:System.Threading.Tasks.TaskCompletionSource`1.SetException(System.Exception)"/>,
+            <see cref="M:System.Threading.Tasks.TaskCompletionSource`1.SetException(System.Collections.Generic.IEnumerable{System.Exception})"/>, and <see cref="M:System.Threading.Tasks.TaskCompletionSource`1.SetCanceled"/>
+            methods (and their "Try" variants) on this instance all result in the relevant state
+            transitions on this underlying Task.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskExceptionHolder">
+            <summary>
+            An exception holder manages a list of exceptions for one particular task.
+            It offers the ability to aggregate, but more importantly, also offers intrinsic
+            support for propagating unhandled exceptions that are never observed. It does
+            this by aggregating and throwing if the holder is ever GC'd without the holder's
+            contents ever having been requested (e.g. by a Task.Wait, Task.get_Exception, etc).
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskExceptionHolder.#ctor(System.Threading.Tasks.Task)">
+            <summary>
+            Creates a new holder; it will be registered for finalization.
+            </summary>
+            <param name="task">The task this holder belongs to.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskExceptionHolder.Finalize">
+            <summary>
+            A finalizer that repropagates unhandled exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskExceptionHolder.Add(System.Object)">
+            <summary>
+            Add an exception to the internal list.  This will ensure the holder is
+            in the proper state (handled/unhandled) depending on the list's contents.
+            </summary>
+            <param name="exceptionObject">An exception object (either an Exception or an 
+            IEnumerable{Exception}) to add to the list.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskExceptionHolder.MarkAsUnhandled">
+            <summary>
+            A private helper method that ensures the holder is considered
+            unhandled, i.e. it is registered for finalization.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskExceptionHolder.MarkAsHandled(System.Boolean)">
+            <summary>
+            A private helper method that ensures the holder is considered
+            handled, i.e. it is not registered for finalization.
+            </summary>
+            <param name="calledFromFinalizer">Whether this is called from the finalizer thread.</param> 
+        </member>
+        <member name="M:System.Threading.Tasks.TaskExceptionHolder.CreateExceptionObject(System.Boolean,System.Exception)">
+            <summary>
+            Allocates a new aggregate exception and adds the contents of the list to
+            it. By calling this method, the holder assumes exceptions to have been
+            "observed", such that the finalization check will be subsequently skipped.
+            </summary>
+            <param name="calledFromFinalizer">Whether this is being called from a finalizer.</param>
+            <param name="includeThisException">An extra exception to be included (optionally).</param>
+            <returns>The aggregate exception to throw.</returns>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskExtensions">
+            <summary>
+            Provides a set of static (Shared in Visual Basic) methods for working with specific kinds of 
+            <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskExtensions.Unwrap(System.Threading.Tasks.Task{System.Threading.Tasks.Task})">
+            <summary>
+            Creates a proxy <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the 
+            asynchronous operation of a Task{Task}.
+            </summary>
+            <remarks>
+            It is often useful to be able to return a Task from a <see cref="T:System.Threading.Tasks.Task`1">
+            Task{TResult}</see>, where the inner Task represents work done as part of the outer Task{TResult}.  However, 
+            doing so results in a Task{Task}, which, if not dealt with carefully, could produce unexpected behavior.  Unwrap 
+            solves this problem by creating a proxy Task that represents the entire asynchronous operation of such a Task{Task}.
+            </remarks>
+            <param name="task">The Task{Task} to unwrap.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown if the 
+            <paramref name="task"/> argument is null.</exception>
+            <returns>A Task that represents the asynchronous operation of the provided Task{Task}.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskExtensions.Unwrap``1(System.Threading.Tasks.Task{System.Threading.Tasks.Task{``0}})">
+            <summary>
+            Creates a proxy <see cref="T:System.Threading.Tasks.Task`1">Task{TResult}</see> that represents the 
+            asynchronous operation of a Task{Task{TResult}}.
+            </summary>
+            <remarks>
+            It is often useful to be able to return a Task{TResult} from a Task{TResult}, where the inner Task{TResult} 
+            represents work done as part of the outer Task{TResult}.  However, doing so results in a Task{Task{TResult}}, 
+            which, if not dealt with carefully, could produce unexpected behavior.  Unwrap solves this problem by 
+            creating a proxy Task{TResult} that represents the entire asynchronous operation of such a Task{Task{TResult}}.
+            </remarks>
+            <param name="task">The Task{Task{TResult}} to unwrap.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown if the 
+            <paramref name="task"/> argument is null.</exception>
+            <returns>A Task{TResult} that represents the asynchronous operation of the provided Task{Task{TResult}}.</returns>        /// <summary>Unwraps a Task that returns another Task.</summary>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskFactory">
+            <summary>
+            Provides support for creating and scheduling
+            <see cref="T:System.Threading.Tasks.Task">Tasks</see>.
+            </summary>
+            <remarks>
+            <para>
+            There are many common patterns for which tasks are relevant. The <see cref="T:System.Threading.Tasks.TaskFactory"/>
+            class encodes some of these patterns into methods that pick up default settings, which are
+            configurable through its constructors.
+            </para>
+            <para>
+            A default instance of <see cref="T:System.Threading.Tasks.TaskFactory"/> is available through the
+            <see cref="P:System.Threading.Tasks.Task.Factory">Task.Factory</see> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.#ctor">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance with the default configuration.
+            </summary>
+            <remarks>
+            This constructor creates a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance with a default configuration. The
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.#ctor(System.Threading.CancellationToken)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance with the specified configuration.
+            </summary>
+            <param name="cancellationToken">The default <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned 
+            to tasks created by this <see cref="T:System.Threading.Tasks.TaskFactory"/> unless another CancellationToken is explicitly specified 
+            while calling the factory methods.</param>
+            <remarks>
+            This constructor creates a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance with a default configuration. The
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.#ctor(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance with the specified configuration.
+            </summary>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler">
+            TaskScheduler</see> to use to schedule any tasks created with this TaskFactory. A null value
+            indicates that the current TaskScheduler should be used.
+            </param>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to <paramref name="scheduler"/>, unless it's null, in which case the property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.#ctor(System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance with the specified configuration.
+            </summary>
+            <param name="creationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskCreationOptions">
+            TaskCreationOptions</see> to use when creating tasks with this TaskFactory.
+            </param>
+            <param name="continuationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> to use when creating continuation tasks with this TaskFactory.
+            </param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The exception that is thrown when the
+            <paramref name="creationOptions"/> argument or the <paramref name="continuationOptions"/>
+            argument specifies an invalid value.
+            </exception>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to <paramref name="creationOptions"/>,
+            the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <paramref name="continuationOptions"/>, and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is initialized to the
+            current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.#ctor(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance with the specified configuration.
+            </summary>
+            <param name="cancellationToken">The default <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned 
+            to tasks created by this <see cref="T:System.Threading.Tasks.TaskFactory"/> unless another CancellationToken is explicitly specified 
+            while calling the factory methods.</param>
+            <param name="creationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskCreationOptions">
+            TaskCreationOptions</see> to use when creating tasks with this TaskFactory.
+            </param>
+            <param name="continuationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> to use when creating continuation tasks with this TaskFactory.
+            </param>
+            <param name="scheduler">
+            The default <see cref="T:System.Threading.Tasks.TaskScheduler">
+            TaskScheduler</see> to use to schedule any Tasks created with this TaskFactory. A null value
+            indicates that TaskScheduler.Current should be used.
+            </param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The exception that is thrown when the
+            <paramref name="creationOptions"/> argument or the <paramref name="continuationOptions"/>
+            argumentspecifies an invalid value.
+            </exception>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to <paramref name="creationOptions"/>,
+            the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <paramref name="continuationOptions"/>, and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is initialized to
+            <paramref name="scheduler"/>, unless it's null, in which case the property is initialized to the
+            current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew(System.Action)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+            <param name="action">The action delegate to execute asynchronously.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="action"/> 
+            argument is null.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a Task using one of its constructors 
+            and then calling 
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.  However,
+            unless creation and scheduling must be separated, StartNew is the recommended
+            approach for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew(System.Action,System.Threading.CancellationToken)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+            <param name="action">The action delegate to execute asynchronously.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to the new task.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="action"/> 
+            argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a Task using one of its constructors 
+            and then calling 
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.  However,
+            unless creation and scheduling must be separated, StartNew is the recommended
+            approach for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew(System.Action,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+            <param name="action">The action delegate to execute asynchronously.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task">Task.</see></param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="action"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a Task using one of its constructors and
+            then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew(System.Action,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+            <param name="action">The action delegate to execute asynchronously.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to the new <see cref="T:System.Threading.Tasks.Task"/></param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task">Task.</see></param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="action"/>
+            argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="scheduler"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a Task using one of its constructors and
+            then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew(System.Action{System.Object},System.Object)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+            <param name="action">The action delegate to execute asynchronously.</param>
+            <param name="state">An object containing data to be used by the <paramref name="action"/>
+            delegate.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="action"/>
+            argument is null.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a Task using one of its constructors and
+            then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew(System.Action{System.Object},System.Object,System.Threading.CancellationToken)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+            <param name="action">The action delegate to execute asynchronously.</param>
+            <param name="state">An object containing data to be used by the <paramref name="action"/>
+            delegate.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to the new <see cref="T:System.Threading.Tasks.Task"/></param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="action"/>
+            argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a Task using one of its constructors and
+            then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew(System.Action{System.Object},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+            <param name="action">The action delegate to execute asynchronously.</param>
+            <param name="state">An object containing data to be used by the <paramref name="action"/>
+            delegate.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task">Task.</see></param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="action"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a Task using one of its constructors and
+            then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew(System.Action{System.Object},System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+            <param name="action">The action delegate to execute asynchronously.</param>
+            <param name="state">An object containing data to be used by the <paramref name="action"/>
+            delegate.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task">Task.</see></param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="action"/>
+            argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="scheduler"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a Task using one of its constructors and
+            then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew``1(System.Func{``0})">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew``1(System.Func{``0},System.Threading.CancellationToken)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to the new <see cref="T:System.Threading.Tasks.Task"/></param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew``1(System.Func{``0},System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew``1(System.Func{``0},System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created <see cref="T:System.Threading.Tasks.Task{TResult}">
+            Task{TResult}</see>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="scheduler"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew``1(System.Func{System.Object,``0},System.Object)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="function"/>
+            delegate.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew``1(System.Func{System.Object,``0},System.Object,System.Threading.CancellationToken)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="function"/>
+            delegate.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to the new <see cref="T:System.Threading.Tasks.Task"/></param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew``1(System.Func{System.Object,``0},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="function"/>
+            delegate.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.StartNew``1(System.Func{System.Object,``0},System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="function"/>
+            delegate.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created <see cref="T:System.Threading.Tasks.Task{TResult}">
+            Task{TResult}</see>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="scheduler"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync(System.IAsyncResult,System.Action{System.IAsyncResult})">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that executes an end method action
+            when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The action delegate that processes the completed <paramref
+            name="asyncResult"/>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the asynchronous
+            operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync(System.IAsyncResult,System.Action{System.IAsyncResult},System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that executes an end method action
+            when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The action delegate that processes the completed <paramref
+            name="asyncResult"/>.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the asynchronous
+            operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync(System.IAsyncResult,System.Action{System.IAsyncResult},System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that executes an end method action
+            when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The action delegate that processes the completed <paramref name="asyncResult"/>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the task that executes the end method.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the asynchronous
+            operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that represents a pair of begin
+            and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the
+            asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that represents a pair of begin
+            and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the
+            asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that represents a pair of begin
+            and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the
+            asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that represents a pair of begin
+            and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the
+            asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``2(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,``1,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that represents a pair of begin
+            and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the
+            asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``2(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,``1,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that represents a pair of begin
+            and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the
+            asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``3(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,``1,``2,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that represents a pair of begin
+            and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg3">The type of the third argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg3">The third argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the
+            asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``3(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,``1,``2,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task">Task</see> that represents a pair of begin
+            and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg3">The type of the third argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg3">The third argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task">Task</see> that represents the
+            asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.IAsyncResult,System.Func{System.IAsyncResult,``0})">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that executes an end
+            method function when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The function delegate that processes the completed <paramref
+            name="asyncResult"/>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents the
+            asynchronous operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.IAsyncResult,System.Func{System.IAsyncResult,``0},System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that executes an end
+            method function when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The function delegate that processes the completed <paramref
+            name="asyncResult"/>.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents the
+            asynchronous operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.IAsyncResult,System.Func{System.IAsyncResult,``0},System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that executes an end
+            method function when a specified <see cref="T:System.IAsyncResult">IAsyncResult</see> completes.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="asyncResult">The IAsyncResult whose completion should trigger the processing of the
+            <paramref name="endMethod"/>.</param>
+            <param name="endMethod">The function delegate that processes the completed <paramref name="asyncResult"/>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the task that executes the end method.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="asyncResult"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>A <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents the
+            asynchronous operation.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``0},System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``0},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``2(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``1},``0,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``2(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``1},``0,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``3(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``2},``0,``1,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``3(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``2},``0,``1,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``4(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``3},``0,``1,``2,System.Object)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg3">The type of the third argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg3">The third argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.FromAsync``4(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``3},``0,``1,``2,System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that represents a pair of
+            begin and end methods that conform to the Asynchronous Programming Model pattern.
+            </summary>
+            <typeparam name="TArg1">The type of the first argument passed to the <paramref
+            name="beginMethod"/> delegate.</typeparam>
+            <typeparam name="TArg2">The type of the second argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TArg3">The type of the third argument passed to <paramref name="beginMethod"/>
+            delegate.</typeparam>
+            <typeparam name="TResult">The type of the result available through the
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.
+            </typeparam>
+            <param name="beginMethod">The delegate that begins the asynchronous operation.</param>
+            <param name="endMethod">The delegate that ends the asynchronous operation.</param>
+            <param name="arg1">The first argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg2">The second argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="arg3">The third argument passed to the <paramref name="beginMethod"/>
+            delegate.</param>
+            <param name="creationOptions">The TaskCreationOptions value that controls the behavior of the
+            created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="state">An object containing data to be used by the <paramref name="beginMethod"/>
+            delegate.</param>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="beginMethod"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="endMethod"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <returns>The created <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see> that
+            represents the asynchronous operation.</returns>
+            <remarks>
+            This method throws any exceptions thrown by the <paramref name="beginMethod"/>.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.CheckFromAsyncOptions(System.Threading.Tasks.TaskCreationOptions,System.Boolean)">
+            <summary>
+            Check validity of options passed to FromAsync method
+            </summary>
+            <param name="creationOptions">The options to be validated.</param>
+            <param name="hasBeginMethod">determines type of FromAsync method that called this method</param>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll(System.Threading.Tasks.Task[],System.Action{System.Threading.Tasks.Task[]})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see> 
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationAction">The action delegate to execute when all tasks in 
+            the <paramref name="tasks"/> array have completed.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll(System.Threading.Tasks.Task[],System.Action{System.Threading.Tasks.Task[]},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see> 
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationAction">The action delegate to execute when all tasks in 
+            the <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll(System.Threading.Tasks.Task[],System.Action{System.Threading.Tasks.Task[]},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationAction">The action delegate to execute when all tasks in the <paramref name="tasks"/> array have completed.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll(System.Threading.Tasks.Task[],System.Action{System.Threading.Tasks.Task[]},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationAction">The action delegate to execute when all tasks in the <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``1(System.Threading.Tasks.Task{``0}[],System.Action{System.Threading.Tasks.Task{``0}[]})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see> 
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationAction">The action delegate to execute when all tasks in 
+            the <paramref name="tasks"/> array have completed.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``1(System.Threading.Tasks.Task{``0}[],System.Action{System.Threading.Tasks.Task{``0}[]},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see> 
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationAction">The action delegate to execute when all tasks in 
+            the <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the 
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the 
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``1(System.Threading.Tasks.Task{``0}[],System.Action{System.Threading.Tasks.Task{``0}[]},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationAction">The action delegate to execute when all tasks in the <paramref name="tasks"/> array have completed.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``1(System.Threading.Tasks.Task{``0}[],System.Action{System.Threading.Tasks.Task{``0}[]},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationAction">The action delegate to execute when all tasks in the <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``1(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task[],``0})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref
+            name="continuationFunction"/>
+            delegate and associated with the created <see
+            cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``1(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task[],``0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``1(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task[],``0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``1(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task[],``0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``2(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0}[],``1})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref
+            name="continuationFunction"/>
+            delegate and associated with the created <see
+            cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``2(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0}[],``1},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``2(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0}[],``1},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAll``2(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0}[],``1},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of a set of provided Tasks.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue.</param>
+            <param name="continuationFunction">The function delegate to execute when all tasks in the
+            <paramref name="tasks"/> array have completed.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAll.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny(System.Threading.Tasks.Task[],System.Action{System.Threading.Tasks.Task})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationAction">The action delegate to execute when one task in the <paramref
+            name="tasks"/> array completes.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny(System.Threading.Tasks.Task[],System.Action{System.Threading.Tasks.Task},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationAction">The action delegate to execute when one task in the <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny(System.Threading.Tasks.Task[],System.Action{System.Threading.Tasks.Task},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationAction">The action delegate to execute when one task in the <paramref name="tasks"/> array completes.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny(System.Threading.Tasks.Task[],System.Action{System.Threading.Tasks.Task},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationAction">The action delegate to execute when one task in the <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``1(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task,``0})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref
+            name="continuationFunction"/>
+            delegate and associated with the created <see
+            cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``1(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task,``0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``1(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task,``0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``1(System.Threading.Tasks.Task[],System.Func{System.Threading.Tasks.Task,``0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``2(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0},``1})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref
+            name="continuationFunction"/>
+            delegate and associated with the created <see
+            cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``2(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0},``1},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``2(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0},``1},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``2(System.Threading.Tasks.Task{``0}[],System.Func{System.Threading.Tasks.Task{``0},``1},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TResult">The type of the result that is returned by the <paramref name="continuationFunction"/>
+            delegate and associated with the created <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</typeparam>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationFunction">The function delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationFunction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``1(System.Threading.Tasks.Task{``0}[],System.Action{System.Threading.Tasks.Task{``0}})">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationAction">The action delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``1(System.Threading.Tasks.Task{``0}[],System.Action{System.Threading.Tasks.Task{``0}},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationAction">The action delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``1(System.Threading.Tasks.Task{``0}[],System.Action{System.Threading.Tasks.Task{``0}},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationAction">The action delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory.ContinueWhenAny``1(System.Threading.Tasks.Task{``0}[],System.Action{System.Threading.Tasks.Task{``0}},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation <see cref="T:System.Threading.Tasks.Task">Task</see>
+            that will be started upon the completion of any Task in the provided set.
+            </summary>
+            <typeparam name="TAntecedentResult">The type of the result of the antecedent <paramref name="tasks"/>.</typeparam>
+            <param name="tasks">The array of tasks from which to continue when one task completes.</param>
+            <param name="continuationAction">The action delegate to execute when one task in the
+            <paramref name="tasks"/> array completes.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> 
+            that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">The <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> value that controls the behavior of
+            the created continuation <see cref="T:System.Threading.Tasks.Task">Task</see>.</param>
+            <param name="scheduler">The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            that is used to schedule the created continuation <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="tasks"/> array is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="continuationAction"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the
+            <paramref name="scheduler"/> argument is null.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array contains a null value.</exception>
+            <exception cref="T:System.ArgumentException">The exception that is thrown when the
+            <paramref name="tasks"/> array is empty.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="continuationOptions"/> argument specifies an invalid TaskContinuationOptions
+            value.</exception>
+            <exception cref="T:System.ObjectDisposedException">The exception that is thrown when one 
+            of the elements in the <paramref name="tasks"/> array has been disposed.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            The NotOn* and OnlyOn* <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>, 
+            which constrain for which <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> states a continuation 
+            will be executed, are illegal with ContinueWhenAny.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskFactory.CancellationToken">
+            <summary>
+            Gets the default <see cref="T:System.Threading.CancellationToken">CancellationToken</see> of this
+            TaskFactory.
+            </summary>
+            <remarks>
+            This property returns the default <see cref="P:System.Threading.Tasks.TaskFactory.CancellationToken"/> that will be assigned to all 
+            tasks created by this factory unless another CancellationToken value is explicitly specified 
+            during the call to the factory methods.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskFactory.Scheduler">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> of this
+            TaskFactory.
+            </summary>
+            <remarks>
+            This property returns the default scheduler for this factory.  It will be used to schedule all 
+            tasks unless another scheduler is explicitly specified during calls to this factory's methods.  
+            If null, <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see> 
+            will be used.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskFactory.CreationOptions">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions
+            </see> value of this TaskFactory.
+            </summary>
+            <remarks>
+            This property returns the default creation options for this factory.  They will be used to create all 
+            tasks unless other options are explicitly specified during calls to this factory's methods.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskFactory.ContinuationOptions">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskContinuationOptions
+            </see> value of this TaskFactory.
+            </summary>
+            <remarks>
+            This property returns the default continuation options for this factory.  They will be used to create 
+            all continuation tasks unless other options are explicitly specified during calls to this factory's methods.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskScheduler">
+            <summary>
+            Represents an abstract scheduler for tasks.
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> acts as the extension point for all 
+            pluggable scheduling logic.  This includes mechanisms such as how to schedule a task for execution, and
+            how scheduled tasks should be exposed to debuggers.
+            </para>
+            <para>
+            All members of the abstract <see cref="T:System.Threading.Tasks.TaskScheduler"/> type are thread-safe
+            and may be used from multiple threads concurrently.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.QueueTask(System.Threading.Tasks.Task)">
+            <summary>
+            Queues a <see cref="T:System.Threading.Tasks.Task">Task</see> to the scheduler.
+            </summary>
+            <remarks>
+            <para>
+            A class derived from <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>  
+            implements this method to accept tasks being scheduled on the scheduler.
+            A typical implementation would store the task in an internal data structure, which would
+            be serviced by threads that would execute those tasks at some time in the future.
+            </para>
+            <para>
+            This method is only meant to be called by the .NET Framework and
+            should not be called directly by the derived class. This is necessary 
+            for maintaining the consistency of the system.
+            </para>
+            </remarks>
+            <param name="task">The <see cref="T:System.Threading.Tasks.Task">Task</see> to be queued.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="task"/> argument is null.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.TryExecuteTaskInline(System.Threading.Tasks.Task,System.Boolean)">
+            <summary>
+            Determines whether the provided <see cref="T:System.Threading.Tasks.Task">Task</see>
+            can be executed synchronously in this call, and if it can, executes it.
+            </summary>
+            <remarks>
+            <para>
+            A class derived from <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> implements this function to
+            support inline execution of a task on a thread that initiates a wait on that task object. Inline
+            execution is optional, and the request may be rejected by returning false. However, better
+            scalability typically results the more tasks that can be inlined, and in fact a scheduler that
+            inlines too little may be prone to deadlocks. A proper implementation should ensure that a
+            request executing under the policies guaranteed by the scheduler can successfully inline. For
+            example, if a scheduler uses a dedicated thread to execute tasks, any inlining requests from that
+            thread should succeed.
+            </para>
+            <para>
+            If a scheduler decides to perform the inline execution, it should do so by calling to the base
+            TaskScheduler's
+            <see cref="M:System.Threading.Tasks.TaskScheduler.TryExecuteTask(System.Threading.Tasks.Task)">TryExecuteTask</see> method with the provided task object, propagating
+            the return value. It may also be appropriate for the scheduler to remove an inlined task from its
+            internal data structures if it decides to honor the inlining request. Note, however, that under
+            some circumstances a scheduler may be asked to inline a task that was not previously provided to
+            it with the <see cref="M:System.Threading.Tasks.TaskScheduler.QueueTask(System.Threading.Tasks.Task)"/> method.
+            </para>
+            <para>
+            The derived scheduler is responsible for making sure that the calling thread is suitable for
+            executing the given task as far as its own scheduling and execution policies are concerned.
+            </para>
+            </remarks>
+            <param name="task">The <see cref="T:System.Threading.Tasks.Task">Task</see> to be
+            executed.</param>
+            <param name="taskWasPreviouslyQueued">A Boolean denoting whether or not task has previously been
+            queued. If this parameter is True, then the task may have been previously queued (scheduled); if
+            False, then the task is known not to have been queued, and this call is being made in order to
+            execute the task inline without queueing it.</param>
+            <returns>A Boolean value indicating whether the task was executed inline.</returns>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="task"/> argument is
+            null.</exception>
+            <exception cref="T:System.InvalidOperationException">The <paramref name="task"/> was already
+            executed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.GetScheduledTasks">
+            <summary>
+            Generates an enumerable of <see cref="T:System.Threading.Tasks.Task">Task</see> instances
+            currently queued to the scheduler waiting to be executed.
+            </summary>
+            <remarks>
+            <para>
+            A class derived from <see cref="T:System.Threading.Tasks.TaskScheduler"/> implements this method in order to support
+            integration with debuggers. This method will only be invoked by the .NET Framework when the
+            debugger requests access to the data. The enumerable returned will be traversed by debugging
+            utilities to access the tasks currently queued to this scheduler, enabling the debugger to
+            provide a representation of this information in the user interface.
+            </para>
+            <para>
+            It is important to note that, when this method is called, all other threads in the process will
+            be frozen. Therefore, it's important to avoid synchronization with other threads that may lead to
+            blocking. If synchronization is necessary, the method should prefer to throw a <see cref="T:System.NotSupportedException"/>
+            than to block, which could cause a debugger to experience delays. Additionally, this method and
+            the enumerable returned must not modify any globally visible state.
+            </para>
+            <para>
+            The returned enumerable should never be null. If there are currently no queued tasks, an empty
+            enumerable should be returned instead.
+            </para>
+            <para>
+            For developers implementing a custom debugger, this method shouldn't be called directly, but
+            rather this functionality should be accessed through the internal wrapper method
+            GetScheduledTasksForDebugger:
+            <c>internal Task[] GetScheduledTasksForDebugger()</c>. This method returns an array of tasks,
+            rather than an enumerable. In order to retrieve a list of active schedulers, a debugger may use
+            another internal method: <c>internal static TaskScheduler[] GetTaskSchedulersForDebugger()</c>.
+            This static method returns an array of all active TaskScheduler instances.
+            GetScheduledTasksForDebugger then may be used on each of these scheduler instances to retrieve
+            the list of scheduled tasks for each.
+            </para>
+            </remarks>
+            <returns>An enumerable that allows traversal of tasks currently queued to this scheduler.
+            </returns>
+            <exception cref="T:System.NotSupportedException">
+            This scheduler is unable to generate a list of queued tasks at this time.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.GetThreadStatics">
+            <summary>
+            Retrieves some thread static state that can be cached and passed to multiple
+            TryRunInline calls, avoiding superflous TLS fetches.
+            </summary>
+            <returns>A bag of TLS state (or null if none exists).</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.TryRunInline(System.Threading.Tasks.Task,System.Boolean,System.Object)">
+            <summary>
+            Attempts to execute the target task synchronously.
+            </summary>
+            <param name="task">The task to run.</param>
+            <param name="taskWasPreviouslyQueued">True if the task may have been previously queued,
+            false if the task was absolutely not previously queued.</param>
+            <param name="threadStatics">The state retrieved from GetThreadStatics</param>
+            <returns>True if it ran, false otherwise.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.TryDequeue(System.Threading.Tasks.Task)">
+            <summary>
+            Attempts to dequeue a <see cref="T:System.Threading.Tasks.Task">Task</see> that was previously queued to
+            this scheduler.
+            </summary>
+            <param name="task">The <see cref="T:System.Threading.Tasks.Task">Task</see> to be dequeued.</param>
+            <returns>A Boolean denoting whether the <paramref name="task"/> argument was successfully dequeued.</returns>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="task"/> argument is null.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.NotifyWorkItemProgress">
+            <summary>
+            Notifies the scheduler that a work item has made progress.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.#ctor">
+            <summary>
+            Initializes the <see cref="T:System.Threading.Tasks.TaskScheduler"/>.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.Finalize">
+            <summary>
+            Frees all resources associated with this scheduler.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext">
+            <summary>
+            Creates a <see cref="T:System.Threading.Tasks.TaskScheduler"/>
+            associated with the current <see cref="T:System.Threading.SynchronizationContext"/>.
+            </summary>
+            <remarks>
+            All <see cref="T:System.Threading.Tasks.Task">Task</see> instances queued to 
+            the returned scheduler will be executed through a call to the
+            <see cref="M:System.Threading.SynchronizationContext.Post(System.Threading.SendOrPostCallback,System.Object)">Post</see> method
+            on that context.
+            </remarks>
+            <returns>
+            A <see cref="T:System.Threading.Tasks.TaskScheduler"/> associated with 
+            the current <see cref="T:System.Threading.SynchronizationContext">SynchronizationContext</see>, as
+            determined by <see cref="P:System.Threading.SynchronizationContext.Current">SynchronizationContext.Current</see>.
+            </returns>
+            <exception cref="T:System.InvalidOperationException">
+            The current SynchronizationContext may not be used as a TaskScheduler.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.TryExecuteTask(System.Threading.Tasks.Task)">
+            <summary>
+            Attempts to execute the provided <see cref="T:System.Threading.Tasks.Task">Task</see>
+            on this scheduler.
+            </summary>
+            <remarks>
+            <para>
+            Scheduler implementations are provided with <see cref="T:System.Threading.Tasks.Task">Task</see>
+            instances to be executed through either the <see cref="M:System.Threading.Tasks.TaskScheduler.QueueTask(System.Threading.Tasks.Task)"/> method or the
+            <see cref="M:System.Threading.Tasks.TaskScheduler.TryExecuteTaskInline(System.Threading.Tasks.Task,System.Boolean)"/> method. When the scheduler deems it appropriate to run the
+            provided task, <see cref="M:System.Threading.Tasks.TaskScheduler.TryExecuteTask(System.Threading.Tasks.Task)"/> should be used to do so. TryExecuteTask handles all
+            aspects of executing a task, including action invocation, exception handling, state management,
+            and lifecycle control.
+            </para>
+            <para>
+            <see cref="M:System.Threading.Tasks.TaskScheduler.TryExecuteTask(System.Threading.Tasks.Task)"/> must only be used for tasks provided to this scheduler by the .NET
+            Framework infrastructure. It should not be used to execute arbitrary tasks obtained through
+            custom mechanisms.
+            </para>
+            </remarks>
+            <param name="task">
+            A <see cref="T:System.Threading.Tasks.Task">Task</see> object to be executed.</param>
+            <exception cref="T:System.InvalidOperationException">
+            The <paramref name="task"/> is not associated with this scheduler.
+            </exception>
+            <returns>A Boolean that is true if <paramref name="task"/> was successfully executed, false if it
+            was not. A common reason for execution failure is that the task had previously been executed or
+            is in the process of being executed by another thread.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.GetScheduledTasksForDebugger">
+            <summary>
+            Provides an array of all queued <see cref="T:System.Threading.Tasks.Task">Task</see> instances
+            for the debugger.
+            </summary>
+            <remarks>
+            The returned array is populated through a call to <see cref="M:System.Threading.Tasks.TaskScheduler.GetScheduledTasks"/>.
+            Note that this function is only meant to be invoked by a debugger remotely. 
+            It should not be called by any other codepaths.
+            </remarks>
+            <returns>An array of <see cref="T:System.Threading.Tasks.Task">Task</see> instances.</returns> 
+            <exception cref="T:System.NotSupportedException">
+            This scheduler is unable to generate a list of queued tasks at this time.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.GetTaskSchedulersForDebugger">
+            <summary>
+            Provides an array of all active <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> 
+            instances for the debugger.
+            </summary>
+            <remarks>
+            This function is only meant to be invoked by a debugger remotely. 
+            It should not be called by any other codepaths.
+            </remarks>
+            <returns>An array of <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> instances.</returns> 
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.RegisterTaskScheduler(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Registers a new TaskScheduler instance in the global collection of schedulers.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskScheduler.UnregisterTaskScheduler(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Removes a TaskScheduler instance from the global collection of schedulers.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskScheduler.MaximumConcurrencyLevel">
+            <summary>
+            Indicates the maximum concurrency level this 
+            <see cref="T:System.Threading.Tasks.TaskScheduler"/>  is able to support.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskScheduler.RequiresAtomicStartTransition">
+            <summary>
+            Indicates whether this is a custom scheduler, in which case the safe code paths will be taken upon task entry
+            using a CAS to transition from queued state to executing.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskScheduler.Default">
+            <summary>
+            Gets the default <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> instance.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskScheduler.Current">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>
+            associated with the currently executing task.
+            </summary>
+            <remarks>
+            When not called from within a task, <see cref="P:System.Threading.Tasks.TaskScheduler.Current"/> will return the <see cref="P:System.Threading.Tasks.TaskScheduler.Default"/> scheduler.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.TaskScheduler.Id">
+            <summary>
+            Gets the unique ID for this <see cref="T:System.Threading.Tasks.TaskScheduler"/>.
+            </summary>
+        </member>
+        <member name="E:System.Threading.Tasks.TaskScheduler.UnobservedTaskException">
+            <summary>
+            Occurs when a faulted <see cref="T:System.Threading.Tasks.Task"/>'s unobserved exception is about to trigger exception escalation
+            policy, which, by default, would terminate the process.
+            </summary>
+            <remarks>
+            This AppDomain-wide event provides a mechanism to prevent exception
+            escalation policy (which, by default, terminates the process) from triggering. 
+            Each handler is passed a <see cref="T:System.Threading.Tasks.UnobservedTaskExceptionEventArgs"/>
+            instance, which may be used to examine the exception and to mark it as observed.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskScheduler.SystemThreadingTasks_TaskSchedulerDebugView">
+            <summary>
+            Nested class that provides debugger view for TaskScheduler
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.ThreadPoolTaskScheduler">
+            <summary>Default thread pool scheduler.</summary>
+        </member>
+        <member name="T:System.Threading.Tasks.SynchronizationContextTaskScheduler">
+            <summary>
+            A TaskScheduler implementation that executes all tasks queued to it through a call to 
+            <see cref="M:System.Threading.SynchronizationContext.Post(System.Threading.SendOrPostCallback,System.Object)"/> on the <see cref="T:System.Threading.SynchronizationContext"/> 
+            that its associated with. The default constructor for this class binds to the current <see cref="T:System.Threading.SynchronizationContext"/> 
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.SynchronizationContextTaskScheduler.#ctor">
+            <summary>
+            Constructs a SynchronizationContextTaskScheduler associated with <see cref="T:System.Threading.SynchronizationContext.Current"/> 
+            </summary>
+            <exception cref="T:System.InvalidOperationException">This constructor expects <see cref="T:System.Threading.SynchronizationContext.Current"/> to be set.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.SynchronizationContextTaskScheduler.QueueTask(System.Threading.Tasks.Task)">
+            <summary>
+            Implemetation of <see cref="T:System.Threading.Tasks.TaskScheduler.QueueTask"/> for this scheduler class.
+            
+            Simply posts the tasks to be executed on the associated <see cref="T:System.Threading.SynchronizationContext"/>.
+            </summary>
+            <param name="task"></param>
+        </member>
+        <member name="M:System.Threading.Tasks.SynchronizationContextTaskScheduler.TryExecuteTaskInline(System.Threading.Tasks.Task,System.Boolean)">
+            <summary>
+            Implementation of <see cref="T:System.Threading.Tasks.TaskScheduler.TryExecuteTaskInline"/>  for this scheduler class.
+            
+            The task will be executed inline only if the call happens within 
+            the associated <see cref="T:System.Threading.SynchronizationContext"/>.
+            </summary>
+            <param name="task"></param>
+            <param name="taskWasPreviouslyQueued"></param>
+        </member>
+        <member name="P:System.Threading.Tasks.SynchronizationContextTaskScheduler.MaximumConcurrencyLevel">
+            <summary>
+            Implementes the <see cref="T:System.Threading.Tasks.TaskScheduler.MaximumConcurrencyLevel"/> property for
+            this scheduler class.
+            
+            By default it returns 1, because a <see cref="T:System.Threading.SynchronizationContext"/> based
+            scheduler only supports execution on a single thread.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.UnobservedTaskExceptionEventArgs">
+            <summary>
+            Provides data for the event that is raised when a faulted <see cref="T:System.Threading.Tasks.Task"/>'s
+            exception goes unobserved.
+            </summary>
+            <remarks>
+            The Exception property is used to examine the exception without marking it
+            as observed, whereas the <see cref="M:System.Threading.Tasks.UnobservedTaskExceptionEventArgs.SetObserved"/> method is used to mark the exception
+            as observed.  Marking the exception as observed prevents it from triggering exception escalation policy
+            which, by default, terminates the process.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.UnobservedTaskExceptionEventArgs.#ctor(System.AggregateException)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.UnobservedTaskExceptionEventArgs"/> class
+            with the unobserved exception.
+            </summary>
+            <param name="exception">The Exception that has gone unobserved.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.UnobservedTaskExceptionEventArgs.SetObserved">
+            <summary>
+            Marks the <see cref="P:System.Threading.Tasks.UnobservedTaskExceptionEventArgs.Exception"/> as "observed," thus preventing it
+            from triggering exception escalation policy which, by default, terminates the process.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.UnobservedTaskExceptionEventArgs.Observed">
+            <summary>
+            Gets whether this exception has been marked as "observed."
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.UnobservedTaskExceptionEventArgs.Exception">
+            <summary>
+            The Exception that went unobserved.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskSchedulerException">
+            <summary>
+            Represents an exception used to communicate an invalid operation by a
+            <see cref="T:System.Threading.Tasks.TaskScheduler"/>.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskSchedulerException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/> class.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskSchedulerException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/>
+            class with a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskSchedulerException.#ctor(System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/>
+            class using the default error message and a reference to the inner exception that is the cause of
+            this exception.
+            </summary>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskSchedulerException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/>
+            class with a specified error message and a reference to the inner exception that is the cause of
+            this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+        </member>
+    </members>
+</doc>
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp71/ensureRedirect.xml b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp71/ensureRedirect.xml
new file mode 100644
index 0000000..e69de29
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp8/System.Runtime.xml b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp8/System.Runtime.xml
new file mode 100644
index 0000000..93cb00d
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp8/System.Runtime.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Runtime</name>
+    </assembly>
+    <members>
+        <member name="T:System.IProgress`1">
+            <summary>Defines a provider for progress updates.</summary>
+            <typeparam name="T">The type of progress update value.</typeparam>
+        </member>
+        <member name="M:System.IProgress`1.Report(`0)">
+            <summary>Reports a progress update.</summary>
+            <param name="value">The value of the updated progress.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncStateMachineAttribute">
+            <summary>Identities the async state machine type for this method.</summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.StateMachineAttribute">
+            <summary>Identities the state machine type for this method.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.StateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.StateMachineAttribute.StateMachineType">
+            <summary>Gets the type that implements the state machine.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncStateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerMemberNameAttribute">
+            <summary>
+            Allows you to obtain the method or property name of the caller to the method.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerLineNumberAttribute">
+            <summary>
+            Allows you to obtain the line number in the source file at which the method is called.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.CallerFilePathAttribute">
+            <summary>
+            Allows you to obtain the full path of the source file that contains the caller.
+            This is the file path at the time of compile.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IteratorStateMachineAttribute">
+            <summary>Identities the iterator state machine type for this method.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IteratorStateMachineAttribute.#ctor(System.Type)">
+            <summary>Initializes the attribute.</summary>
+            <param name="stateMachineType">The type that implements the state machine.</param>
+        </member>
+    </members>
+</doc>
diff --git a/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp8/System.Threading.Tasks.xml b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp8/System.Threading.Tasks.xml
new file mode 100644
index 0000000..6c77012
--- /dev/null
+++ b/external/rx/Rx/NET/Source/packages/Microsoft.Bcl.1.0.19/lib/portable-net40+sl4+win8+wp8/System.Threading.Tasks.xml
@@ -0,0 +1,8969 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Threading.Tasks</name>
+    </assembly>
+    <members>
+        <member name="T:System.AggregateException">
+            <summary>Represents one or more errors that occur during application execution.</summary>
+            <remarks>
+            <see cref="T:System.AggregateException"/> is used to consolidate multiple failures into a single, throwable
+            exception object.
+            </remarks>
+        </member>
+        <member name="M:System.AggregateException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class.
+            </summary>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with
+            a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with a specified error
+            message and a reference to the inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerException"/> argument
+            is null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.Collections.Generic.IEnumerable{System.Exception})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with
+            references to the inner exceptions that are the cause of this exception.
+            </summary>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.Exception[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with
+            references to the inner exceptions that are the cause of this exception.
+            </summary>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String,System.Collections.Generic.IEnumerable{System.Exception})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with a specified error
+            message and references to the inner exceptions that are the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String,System.Exception[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.AggregateException"/> class with a specified error
+            message and references to the inner exceptions that are the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.#ctor(System.String,System.Collections.Generic.IList{System.Exception})">
+            <summary>
+            Allocates a new aggregate exception with the specified message and list of inner exceptions.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerExceptions">The exceptions that are the cause of the current exception.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="innerExceptions"/> argument
+            is null.</exception>
+            <exception cref="T:System.ArgumentException">An element of <paramref name="innerExceptions"/> is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.GetBaseException">
+            <summary>
+            Returns the <see cref="T:System.AggregateException"/> that is the root cause of this exception.
+            </summary>
+        </member>
+        <member name="M:System.AggregateException.Handle(System.Func{System.Exception,System.Boolean})">
+            <summary>
+            Invokes a handler on each <see cref="T:System.Exception"/> contained by this <see cref="T:System.AggregateException"/>.
+            </summary>
+            <param name="predicate">The predicate to execute for each exception. The predicate accepts as an
+            argument the <see cref="T:System.Exception"/> to be processed and returns a Boolean to indicate
+            whether the exception was handled.</param>
+            <remarks>
+            Each invocation of the <paramref name="predicate"/> returns true or false to indicate whether the
+            <see cref="T:System.Exception"/> was handled. After all invocations, if any exceptions went
+            unhandled, all unhandled exceptions will be put into a new <see cref="T:System.AggregateException"/>
+            which will be thrown. Otherwise, the <see cref="M:System.AggregateException.Handle(System.Func{System.Exception,System.Boolean})"/> method simply returns. If any
+            invocations of the <paramref name="predicate"/> throws an exception, it will halt the processing
+            of any more exceptions and immediately propagate the thrown exception as-is.
+            </remarks>
+            <exception cref="T:System.AggregateException">An exception contained by this <see cref="T:System.AggregateException"/> was not handled.</exception>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="predicate"/> argument is
+            null.</exception>
+        </member>
+        <member name="M:System.AggregateException.Flatten">
+            <summary>
+            Flattens an <see cref="T:System.AggregateException"/> instances into a single, new instance.
+            </summary>
+            <returns>A new, flattened <see cref="T:System.AggregateException"/>.</returns>
+            <remarks>
+            If any inner exceptions are themselves instances of
+            <see cref="T:System.AggregateException"/>, this method will recursively flatten all of them. The
+            inner exceptions returned in the new <see cref="T:System.AggregateException"/>
+            will be the union of all of the the inner exceptions from exception tree rooted at the provided
+            <see cref="T:System.AggregateException"/> instance.
+            </remarks>
+        </member>
+        <member name="M:System.AggregateException.ToString">
+            <summary>
+            Creates and returns a string representation of the current <see cref="T:System.AggregateException"/>.
+            </summary>
+            <returns>A string representation of the current exception.</returns>
+        </member>
+        <member name="P:System.AggregateException.InnerExceptions">
+            <summary>
+            Gets a read-only collection of the <see cref="T:System.Exception"/> instances that caused the
+            current exception.
+            </summary>
+        </member>
+        <member name="T:System.Strings">
+            <summary>
+              A strongly-typed resource class, for looking up localized strings, etc.
+            </summary>
+        </member>
+        <member name="P:System.Strings.ResourceManager">
+            <summary>
+              Returns the cached ResourceManager instance used by this class.
+            </summary>
+        </member>
+        <member name="P:System.Strings.Culture">
+            <summary>
+              Overrides the current thread's CurrentUICulture property for all
+              resource lookups using this strongly typed resource class.
+            </summary>
+        </member>
+        <member name="P:System.Strings.AggregateException_ctor_DefaultMessage">
+            <summary>
+              Looks up a localized string similar to One or more errors occurred..
+            </summary>
+        </member>
+        <member name="P:System.Strings.AggregateException_ctor_InnerExceptionNull">
+            <summary>
+              Looks up a localized string similar to An element of innerExceptions was null..
+            </summary>
+        </member>
+        <member name="P:System.Strings.AggregateException_ToString">
+            <summary>
+              Looks up a localized string similar to {0}{1}---> (Inner Exception #{2}) {3}{4}{5}.
+            </summary>
+        </member>
+        <member name="P:System.Strings.CancellationToken_CreateLinkedToken_TokensIsEmpty">
+            <summary>
+              Looks up a localized string similar to No tokens were supplied..
+            </summary>
+        </member>
+        <member name="P:System.Strings.CancellationToken_SourceDisposed">
+            <summary>
+              Looks up a localized string similar to The CancellationTokenSource associated with this CancellationToken has been disposed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.CancellationTokenSource_Disposed">
+            <summary>
+              Looks up a localized string similar to The CancellationTokenSource has been disposed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentCollection_SyncRoot_NotSupported">
+            <summary>
+              Looks up a localized string similar to The SyncRoot property may not be used for the synchronization of concurrent collections..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_ArrayIncorrectType">
+            <summary>
+              Looks up a localized string similar to The array is multidimensional, or the type parameter for the set cannot be cast automatically to the type of the destination array..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_ArrayNotLargeEnough">
+            <summary>
+              Looks up a localized string similar to The index is equal to or greater than the length of the array, or the number of elements in the dictionary is greater than the available space from index to the end of the destination array..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_CapacityMustNotBeNegative">
+            <summary>
+              Looks up a localized string similar to The capacity argument must be greater than or equal to zero..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_ConcurrencyLevelMustBePositive">
+            <summary>
+              Looks up a localized string similar to The concurrencyLevel argument must be positive..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_IndexIsNegative">
+            <summary>
+              Looks up a localized string similar to The index argument is less than zero..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_ItemKeyIsNull">
+            <summary>
+              Looks up a localized string similar to TKey is a reference type and item.Key is null..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_KeyAlreadyExisted">
+            <summary>
+              Looks up a localized string similar to The key already existed in the dictionary..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_SourceContainsDuplicateKeys">
+            <summary>
+              Looks up a localized string similar to The source argument contains duplicate keys..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_TypeOfKeyIncorrect">
+            <summary>
+              Looks up a localized string similar to The key was of an incorrect type for this dictionary..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ConcurrentDictionary_TypeOfValueIncorrect">
+            <summary>
+              Looks up a localized string similar to The value was of an incorrect type for this dictionary..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Lazy_CreateValue_NoParameterlessCtorForT">
+            <summary>
+              Looks up a localized string similar to The lazily-initialized type does not have a public, parameterless constructor..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Lazy_StaticInit_InvalidOperation">
+            <summary>
+              Looks up a localized string similar to ValueFactory returned null..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ManualResetEventSlim_ctor_SpinCountOutOfRange">
+            <summary>
+              Looks up a localized string similar to The spinCount argument must be in the range 0 to {0}, inclusive..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ManualResetEventSlim_ctor_TooManyWaiters">
+            <summary>
+              Looks up a localized string similar to There are too many threads currently waiting on the event. A maximum of {0} waiting threads are supported..
+            </summary>
+        </member>
+        <member name="P:System.Strings.ManualResetEventSlim_Disposed">
+            <summary>
+              Looks up a localized string similar to The event has been disposed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.OperationCanceled">
+            <summary>
+              Looks up a localized string similar to The operation was canceled..
+            </summary>
+        </member>
+        <member name="P:System.Strings.SpinWait_SpinUntil_ArgumentNull">
+            <summary>
+              Looks up a localized string similar to The condition argument is null..
+            </summary>
+        </member>
+        <member name="P:System.Strings.SpinWait_SpinUntil_TimeoutWrong">
+            <summary>
+              Looks up a localized string similar to The timeout must represent a value between -1 and Int32.MaxValue, inclusive..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_ContinueWith_ESandLR">
+            <summary>
+              Looks up a localized string similar to The specified TaskContinuationOptions combined LongRunning and ExecuteSynchronously.  Synchronous continuations should not be long running..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_ContinueWith_NotOnAnything">
+            <summary>
+              Looks up a localized string similar to The specified TaskContinuationOptions excluded all continuation kinds..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_ctor_LRandSR">
+            <summary>
+              Looks up a localized string similar to (Internal)An attempt was made to create a LongRunning SelfReplicating task..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Delay_InvalidDelay">
+            <summary>
+              Looks up a localized string similar to The value needs to translate in milliseconds to -1 (signifying an infinite timeout), 0 or a positive integer less than or equal to Int32.MaxValue..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Delay_InvalidMillisecondsDelay">
+            <summary>
+              Looks up a localized string similar to The value needs to be either -1 (signifying an infinite timeout), 0 or a positive integer..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Dispose_NotCompleted">
+            <summary>
+              Looks up a localized string similar to A task may only be disposed if it is in a completion state (RanToCompletion, Faulted or Canceled)..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_FromAsync_LongRunning">
+            <summary>
+              Looks up a localized string similar to It is invalid to specify TaskCreationOptions.LongRunning in calls to FromAsync..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_FromAsync_PreferFairness">
+            <summary>
+              Looks up a localized string similar to It is invalid to specify TaskCreationOptions.PreferFairness in calls to FromAsync..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_FromAsync_SelfReplicating">
+            <summary>
+              Looks up a localized string similar to It is invalid to specify TaskCreationOptions.SelfReplicating in calls to FromAsync..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_FromAsync_TaskManagerShutDown">
+            <summary>
+              Looks up a localized string similar to FromAsync was called with a TaskManager that had already shut down..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_MultiTaskContinuation_EmptyTaskList">
+            <summary>
+              Looks up a localized string similar to The tasks argument contains no tasks..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_MultiTaskContinuation_FireOptions">
+            <summary>
+              Looks up a localized string similar to It is invalid to exclude specific continuation kinds for continuations off of multiple tasks..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_MultiTaskContinuation_NullTask">
+            <summary>
+              Looks up a localized string similar to The tasks argument included a null value..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_RunSynchronously_AlreadyStarted">
+            <summary>
+              Looks up a localized string similar to RunSynchronously may not be called on a task that was already started..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_RunSynchronously_Continuation">
+            <summary>
+              Looks up a localized string similar to RunSynchronously may not be called on a continuation task..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_RunSynchronously_Promise">
+            <summary>
+              Looks up a localized string similar to RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_RunSynchronously_TaskCompleted">
+            <summary>
+              Looks up a localized string similar to RunSynchronously may not be called on a task that has already completed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_AlreadyStarted">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a task that was already started..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_ContinuationTask">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a continuation task..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_NullAction">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a task with null action..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_Promise">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a promise-style task..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_Start_TaskCompleted">
+            <summary>
+              Looks up a localized string similar to Start may not be called on a task that has completed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_ThrowIfDisposed">
+            <summary>
+              Looks up a localized string similar to The task has been disposed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.Task_WaitMulti_NullTask">
+            <summary>
+              Looks up a localized string similar to The tasks array included at least one null element..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskAwaiter_TaskNotCompleted">
+            <summary>
+              Looks up a localized string similar to The awaited task has not yet completed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskCanceledException_ctor_DefaultMessage">
+            <summary>
+              Looks up a localized string similar to A task was canceled..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskCompletionSourceT_TrySetException_NoExceptions">
+            <summary>
+              Looks up a localized string similar to The exceptions collection was empty..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskCompletionSourceT_TrySetException_NullException">
+            <summary>
+              Looks up a localized string similar to The exceptions collection included at least one null element..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskExceptionHolder_UnhandledException">
+            <summary>
+              Looks up a localized string similar to A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskExceptionHolder_UnknownExceptionType">
+            <summary>
+              Looks up a localized string similar to (Internal)Expected an Exception or an IEnumerable<Exception>.
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskScheduler_ExecuteTask_TaskAlreadyExecuted">
+            <summary>
+              Looks up a localized string similar to ExecuteTask may not be called for a task which was already executed..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskScheduler_ExecuteTask_WrongTaskScheduler">
+            <summary>
+              Looks up a localized string similar to ExecuteTask may not be called for a task which was previously queued to a different TaskScheduler..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskScheduler_FromCurrentSynchronizationContext_NoCurrent">
+            <summary>
+              Looks up a localized string similar to The current SynchronizationContext may not be used as a TaskScheduler..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskScheduler_InconsistentStateAfterTryExecuteTaskInline">
+            <summary>
+              Looks up a localized string similar to The TryExecuteTaskInline call to the underlying scheduler succeeded, but the task body was not invoked..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskSchedulerException_ctor_DefaultMessage">
+            <summary>
+              Looks up a localized string similar to An exception was thrown by a TaskScheduler..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskT_ctor_SelfReplicating">
+            <summary>
+              Looks up a localized string similar to It is invalid to specify TaskCreationOptions.SelfReplicating for a Task<TResult>..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskT_DebuggerNoResult">
+            <summary>
+              Looks up a localized string similar to {Not yet computed}.
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskT_SetException_HasAnInitializer">
+            <summary>
+              Looks up a localized string similar to A task's Exception may only be set directly if the task was created without a function..
+            </summary>
+        </member>
+        <member name="P:System.Strings.TaskT_TransitionToFinal_AlreadyCompleted">
+            <summary>
+              Looks up a localized string similar to An attempt was made to transition a task to a final state when it had already completed..
+            </summary>
+        </member>
+        <member name="T:System.Collections.Concurrent.ConcurrentDictionary`2">
+            <summary>
+            Represents a thread-safe collection of keys and values.
+            </summary>
+            <typeparam name="TKey">The type of the keys in the dictionary.</typeparam>
+            <typeparam name="TValue">The type of the values in the dictionary.</typeparam>
+            <remarks>
+            All public and protected members of <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> are thread-safe and may be used
+            concurrently from multiple threads.
+            </remarks>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that is empty, has the default concurrency level, has the default initial capacity, and
+            uses the default comparer for the key type.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that is empty, has the specified concurrency level and capacity, and uses the default
+            comparer for the key type.
+            </summary>
+            <param name="concurrencyLevel">The estimated number of threads that will update the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> concurrently.</param>
+            <param name="capacity">The initial number of elements that the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            can contain.</param>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="concurrencyLevel"/> is
+            less than 1.</exception>
+            <exception cref="T:ArgumentOutOfRangeException"> <paramref name="capacity"/> is less than
+            0.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{`0,`1}})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that contains elements copied from the specified <see cref="T:System.Collections.IEnumerable{KeyValuePair{TKey,TValue}}"/>, has the default concurrency
+            level, has the default initial capacity, and uses the default comparer for the key type.
+            </summary>
+            <param name="collection">The <see cref="T:System.Collections.IEnumerable{KeyValuePair{TKey,TValue}}"/> whose elements are copied to
+            the new
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="collection"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException"><paramref name="collection"/> contains one or more
+            duplicate keys.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Collections.Generic.IEqualityComparer{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that is empty, has the specified concurrency level and capacity, and uses the specified
+            <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>.
+            </summary>
+            <param name="comparer">The <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>
+            implementation to use when comparing keys.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="comparer"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{`0,`1}},System.Collections.Generic.IEqualityComparer{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that contains elements copied from the specified <see cref="T:System.Collections.IEnumerable"/>, has the default concurrency level, has the default
+            initial capacity, and uses the specified
+            <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>.
+            </summary>
+            <param name="collection">The <see cref="T:System.Collections.IEnumerable{KeyValuePair{TKey,TValue}}"/> whose elements are copied to
+            the new
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</param>
+            <param name="comparer">The <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>
+            implementation to use when comparing keys.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="collection"/> is a null reference
+            (Nothing in Visual Basic). -or-
+            <paramref name="comparer"/> is a null reference (Nothing in Visual Basic).
+            </exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Int32,System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{`0,`1}},System.Collections.Generic.IEqualityComparer{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> 
+            class that contains elements copied from the specified <see cref="T:System.Collections.IEnumerable"/>, 
+            has the specified concurrency level, has the specified initial capacity, and uses the specified 
+            <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>.
+            </summary>
+            <param name="concurrencyLevel">The estimated number of threads that will update the 
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> concurrently.</param>
+            <param name="collection">The <see cref="T:System.Collections.IEnumerable{KeyValuePair{TKey,TValue}}"/> whose elements are copied to the new 
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</param>
+            <param name="comparer">The <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/> implementation to use 
+            when comparing keys.</param>
+            <exception cref="T:System.ArgumentNullException">
+            <paramref name="collection"/> is a null reference (Nothing in Visual Basic).
+            -or-
+            <paramref name="comparer"/> is a null reference (Nothing in Visual Basic).
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="concurrencyLevel"/> is less than 1.
+            </exception>
+            <exception cref="T:System.ArgumentException"><paramref name="collection"/> contains one or more duplicate keys.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.#ctor(System.Int32,System.Int32,System.Collections.Generic.IEqualityComparer{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            class that is empty, has the specified concurrency level, has the specified initial capacity, and
+            uses the specified <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>.
+            </summary>
+            <param name="concurrencyLevel">The estimated number of threads that will update the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> concurrently.</param>
+            <param name="capacity">The initial number of elements that the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            can contain.</param>
+            <param name="comparer">The <see cref="T:System.Collections.Generic.IEqualityComparer{TKey}"/>
+            implementation to use when comparing keys.</param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="concurrencyLevel"/> is less than 1. -or-
+            <paramref name="capacity"/> is less than 0.
+            </exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="comparer"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryAdd(`0,`1)">
+            <summary>
+            Attempts to add the specified key and value to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+            <param name="key">The key of the element to add.</param>
+            <param name="value">The value of the element to add. The value can be a null reference (Nothing
+            in Visual Basic) for reference types.</param>
+            <returns>true if the key/value pair was added to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            successfully; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            contains too many elements.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.ContainsKey(`0)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> contains the specified
+            key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</param>
+            <returns>true if the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> contains an element with
+            the specified key; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryRemove(`0,`1@)">
+            <summary>
+            Attempts to remove and return the the value with the specified key from the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+            <param name="key">The key of the element to remove and return.</param>
+            <param name="value">When this method returns, <paramref name="value"/> contains the object removed from the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> or the default value of <typeparamref name="TValue"/>
+            if the operation failed.</param>
+            <returns>true if an object was removed successfully; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryRemoveInternal(`0,`1@,System.Boolean,`1)">
+            <summary>
+            Removes the specified key from the dictionary if it exists and returns its associated value.
+            If matchValue flag is set, the key will be removed only if is associated with a particular
+            value.
+            </summary>
+            <param name="key">The key to search for and remove if it exists.</param>
+            <param name="value">The variable into which the removed value, if found, is stored.</param>
+            <param name="matchValue">Whether removal of the key is conditional on its value.</param>
+            <param name="oldValue">The conditional value to compare against if <paramref name="matchValue"/> is true</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryGetValue(`0,`1@)">
+            <summary>
+            Attempts to get the value associated with the specified key from the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+            <param name="key">The key of the value to get.</param>
+            <param name="value">When this method returns, <paramref name="value"/> contains the object from
+            the
+            <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> with the spedified key or the default value of
+            <typeparamref name="TValue"/>, if the operation failed.</param>
+            <returns>true if the key was found in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>;
+            otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryUpdate(`0,`1,`1)">
+            <summary>
+            Compares the existing value for the specified key with a specified value, and if they’re equal,
+            updates the key with a third value.
+            </summary>
+            <param name="key">The key whose value is compared with <paramref name="comparisonValue"/> and
+            possibly replaced.</param>
+            <param name="newValue">The value that replaces the value of the element with <paramref
+            name="key"/> if the comparison results in equality.</param>
+            <param name="comparisonValue">The value that is compared to the value of the element with
+            <paramref name="key"/>.</param>
+            <returns>true if the value with <paramref name="key"/> was equal to <paramref
+            name="comparisonValue"/> and replaced with <paramref name="newValue"/>; otherwise,
+            false.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null
+            reference.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.Clear">
+            <summary>
+            Removes all keys and values from the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#CopyTo(System.Collections.Generic.KeyValuePair{`0,`1}[],System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.Generic.ICollection"/> to an array of
+            type <see cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>, starting at the
+            specified array index.
+            </summary>
+            <param name="array">The one-dimensional array of type <see
+            cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>
+            that is the destination of the <see
+            cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/> elements copied from the <see
+            cref="T:System.Collections.ICollection"/>. The array must have zero-based indexing.</param>
+            <param name="index">The zero-based index in <paramref name="array"/> at which copying
+            begins.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="array"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="index"/> is less than
+            0.</exception>
+            <exception cref="T:System.ArgumentException"><paramref name="index"/> is equal to or greater than
+            the length of the <paramref name="array"/>. -or- The number of elements in the source <see
+            cref="T:System.Collections.ICollection"/>
+            is greater than the available space from <paramref name="index"/> to the end of the destination
+            <paramref name="array"/>.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.ToArray">
+            <summary>
+            Copies the key and value pairs stored in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> to a
+            new array.
+            </summary>
+            <returns>A new array containing a snapshot of key and value pairs copied from the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.CopyToPairs(System.Collections.Generic.KeyValuePair{`0,`1}[],System.Int32)">
+            <summary>
+            Copy dictionary contents to an array - shared implementation between ToArray and CopyTo.
+            
+            Important: the caller must hold all locks in m_locks before calling CopyToPairs.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.CopyToEntries(System.Collections.DictionaryEntry[],System.Int32)">
+            <summary>
+            Copy dictionary contents to an array - shared implementation between ToArray and CopyTo.
+            
+            Important: the caller must hold all locks in m_locks before calling CopyToEntries.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.CopyToObjects(System.Object[],System.Int32)">
+            <summary>
+            Copy dictionary contents to an array - shared implementation between ToArray and CopyTo.
+            
+            Important: the caller must hold all locks in m_locks before calling CopyToObjects.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetEnumerator">
+            <summary>Returns an enumerator that iterates through the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</summary>
+            <returns>An enumerator for the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</returns>
+            <remarks>
+            The enumerator returned from the dictionary is safe to use concurrently with
+            reads and writes to the dictionary, however it does not represent a moment-in-time snapshot
+            of the dictionary.  The contents exposed through the enumerator may contain modifications
+            made to the dictionary after <see cref="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetEnumerator"/> was called.
+            </remarks>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.TryAddInternal(`0,`1,System.Boolean,System.Boolean,`1@)">
+            <summary>
+            Shared internal implementation for inserts and updates.
+            If key exists, we always return false; and if updateIfExists == true we force update with value;
+            If key doesn't exist, we always add value and return true;
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(`0,System.Func{`0,`1})">
+            <summary>
+            Adds a key/value pair to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> 
+            if the key does not already exist.
+            </summary>
+            <param name="key">The key of the element to add.</param>
+            <param name="valueFactory">The function used to generate a value for the key</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="valueFactory"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <returns>The value for the key.  This will be either the existing value for the key if the
+            key is already in the dictionary, or the new value for the key as returned by valueFactory
+            if the key was not in the dictionary.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(`0,`1)">
+            <summary>
+            Adds a key/value pair to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> 
+            if the key does not already exist.
+            </summary>
+            <param name="key">The key of the element to add.</param>
+            <param name="value">the value to be added, if the key does not already exist</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <returns>The value for the key.  This will be either the existing value for the key if the 
+            key is already in the dictionary, or the new value if the key was not in the dictionary.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.AddOrUpdate(`0,System.Func{`0,`1},System.Func{`0,`1,`1})">
+            <summary>
+            Adds a key/value pair to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> if the key does not already 
+            exist, or updates a key/value pair in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> if the key 
+            already exists.
+            </summary>
+            <param name="key">The key to be added or whose value should be updated</param>
+            <param name="addValueFactory">The function used to generate a value for an absent key</param>
+            <param name="updateValueFactory">The function used to generate a new value for an existing key
+            based on the key's existing value</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="addValueFactory"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="updateValueFactory"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <returns>The new value for the key.  This will be either be the result of addValueFactory (if the key was 
+            absent) or the result of updateValueFactory (if the key was present).</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.AddOrUpdate(`0,`1,System.Func{`0,`1,`1})">
+            <summary>
+            Adds a key/value pair to the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> if the key does not already 
+            exist, or updates a key/value pair in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> if the key 
+            already exists.
+            </summary>
+            <param name="key">The key to be added or whose value should be updated</param>
+            <param name="addValue">The value to be added for an absent key</param>
+            <param name="updateValueFactory">The function used to generate a new value for an existing key based on 
+            the key's existing value</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException"><paramref name="updateValueFactory"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <returns>The new value for the key.  This will be either be the result of addValueFactory (if the key was 
+            absent) or the result of updateValueFactory (if the key was present).</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#IDictionary{TKey at TValue}#Add(`0,`1)">
+            <summary>
+            Adds the specified key and value to the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.
+            </summary>
+            <param name="key">The object to use as the key of the element to add.</param>
+            <param name="value">The object to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <exception cref="T:System.ArgumentException">
+            An element with the same key already exists in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#IDictionary{TKey at TValue}#Remove(`0)">
+            <summary>
+            Removes the element with the specified key from the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <returns>true if the element is successfully remove; otherwise false. This method also returns
+            false if
+            <paramref name="key"/> was not found in the original <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.
+            </returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#Add(System.Collections.Generic.KeyValuePair{`0,`1})">
+            <summary>
+            Adds the specified value to the <see cref="T:System.Collections.Generic.ICollection{TValue}"/>
+            with the specified key.
+            </summary>
+            <param name="keyValuePair">The <see cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>
+            structure representing the key and value to add to the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="keyValuePair"/> of <paramref
+            name="keyValuePair"/> is null.</exception>
+            <exception cref="T:System.OverflowException">The <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>
+            contains too many elements.</exception>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the
+            <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/></exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#Contains(System.Collections.Generic.KeyValuePair{`0,`1})">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.Generic.ICollection{TKey,TValue}"/>
+            contains a specific key and value.
+            </summary>
+            <param name="keyValuePair">The <see cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>
+            structure to locate in the <see
+            cref="T:System.Collections.Generic.ICollection{TValue}"/>.</param>
+            <returns>true if the <paramref name="keyValuePair"/> is found in the <see
+            cref="T:System.Collections.Generic.ICollection{TKey,TValue}"/>; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#Remove(System.Collections.Generic.KeyValuePair{`0,`1})">
+            <summary>
+            Removes a key and value from the dictionary.
+            </summary>
+            <param name="keyValuePair">The <see
+            cref="T:System.Collections.Generic.KeyValuePair{TKey,TValue}"/>
+            structure representing the key and value to remove from the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.</param>
+            <returns>true if the key and value represented by <paramref name="keyValuePair"/> is successfully
+            found and removed; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException">The Key property of <paramref
+            name="keyValuePair"/> is a null reference (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IEnumerable#GetEnumerator">
+            <summary>Returns an enumerator that iterates through the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</summary>
+            <returns>An enumerator for the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</returns>
+            <remarks>
+            The enumerator returned from the dictionary is safe to use concurrently with
+            reads and writes to the dictionary, however it does not represent a moment-in-time snapshot
+            of the dictionary.  The contents exposed through the enumerator may contain modifications
+            made to the dictionary after <see cref="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetEnumerator"/> was called.
+            </remarks>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Add(System.Object,System.Object)">
+            <summary>
+            Adds the specified key and value to the dictionary.
+            </summary>
+            <param name="key">The object to use as the key.</param>
+            <param name="value">The object to use as the value.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <exception cref="T:System.ArgumentException">
+            <paramref name="key"/> is of a type that is not assignable to the key type <typeparamref
+            name="TKey"/> of the <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>. -or-
+            <paramref name="value"/> is of a type that is not assignable to <typeparamref name="TValue"/>,
+            the type of values in the <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.
+            -or- A value with the same key already exists in the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.
+            </exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Contains(System.Object)">
+            <summary>
+            Gets whether the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> contains an
+            element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.</param>
+            <returns>true if the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> contains
+            an element with the specified key; otherwise, false.</returns>
+            <exception cref="T:System.ArgumentNullException"> <paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#GetEnumerator">
+            <summary>Provides an <see cref="T:System.Collections.Generics.IDictionaryEnumerator"/> for the
+            <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.</summary>
+            <returns>An <see cref="T:System.Collections.Generics.IDictionaryEnumerator"/> for the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.</returns>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see
+            cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"/> to an array, starting
+            at the specified array index.
+            </summary>
+            <param name="array">The one-dimensional array that is the destination of the elements copied from
+            the <see cref="T:System.Collections.ICollection"/>. The array must have zero-based
+            indexing.</param>
+            <param name="index">The zero-based index in <paramref name="array"/> at which copying
+            begins.</param>
+            <exception cref="T:System.ArgumentNullException"><paramref name="array"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="index"/> is less than
+            0.</exception>
+            <exception cref="T:System.ArgumentException"><paramref name="index"/> is equal to or greater than
+            the length of the <paramref name="array"/>. -or- The number of elements in the source <see
+            cref="T:System.Collections.ICollection"/>
+            is greater than the available space from <paramref name="index"/> to the end of the destination
+            <paramref name="array"/>.</exception>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GrowTable(System.Collections.Concurrent.ConcurrentDictionary{`0,`1}.Node[])">
+            <summary>
+            Replaces the internal table with a larger one. To prevent multiple threads from resizing the
+            table as a result of races, the table of buckets that was deemed too small is passed in as
+            an argument to GrowTable(). GrowTable() obtains a lock, and then checks whether the bucket
+            table has been replaced in the meantime or not.
+            </summary>
+            <param name="buckets">Reference to the bucket table that was deemed too small.</param>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetBucketAndLockNo(System.Int32,System.Int32@,System.Int32@,System.Int32)">
+            <summary>
+            Computes the bucket and lock number for a particular key. 
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.AcquireAllLocks(System.Int32@)">
+            <summary>
+            Acquires all locks for this hash table, and increments locksAcquired by the number
+            of locks that were successfully acquired. The locks are acquired in an increasing
+            order.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.AcquireLocks(System.Int32,System.Int32,System.Int32@)">
+            <summary>
+            Acquires a contiguous range of locks for this hash table, and increments locksAcquired
+            by the number of locks that were successfully acquired. The locks are acquired in an
+            increasing order.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.ReleaseLocks(System.Int32,System.Int32)">
+            <summary>
+            Releases a contiguous range of locks.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetKeys">
+            <summary>
+            Gets a collection containing the keys in the dictionary.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.GetValues">
+            <summary>
+            Gets a collection containing the values in the dictionary.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.Assert(System.Boolean)">
+            <summary>
+            A helper method for asserts.
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.OnSerializing(System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Get the data array to be serialized
+            </summary>
+        </member>
+        <member name="M:System.Collections.Concurrent.ConcurrentDictionary`2.OnDeserialized(System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Construct the dictionary from a previously seiralized one
+            </summary>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.Item(`0)">
+            <summary>
+            Gets or sets the value associated with the specified key.
+            </summary>
+            <param name="key">The key of the value to get or set.</param>
+            <value>The value associated with the specified key. If the specified key is not found, a get
+            operation throws a
+            <see cref="T:Sytem.Collections.Generic.KeyNotFoundException"/>, and a set operation creates a new
+            element with the specified key.</value>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.Collections.Generic.KeyNotFoundException">The property is retrieved and
+            <paramref name="key"/>
+            does not exist in the collection.</exception>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.Count">
+            <summary>
+            Gets the number of key/value pairs contained in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.
+            </summary>
+            <exception cref="T:System.OverflowException">The dictionary contains too many
+            elements.</exception>
+            <value>The number of key/value paris contained in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>.</value>
+            <remarks>Count has snapshot semantics and represents the number of items in the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/>
+            at the moment when Count was accessed.</remarks>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.IsEmpty">
+            <summary>
+            Gets a value that indicates whether the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> is empty.
+            </summary>
+            <value>true if the <see cref="T:System.Collections.Concurrent.ConcurrentDictionary`2"/> is empty; otherwise,
+            false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.Keys">
+            <summary>
+            Gets a collection containing the keys in the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.Generic.ICollection{TKey}"/> containing the keys in the
+            <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.Values">
+            <summary>
+            Gets a collection containing the values in the <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.Generic.ICollection{TValue}"/> containing the values in
+            the
+            <see cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#Generic#ICollection{System#Collections#Generic#KeyValuePair{TKey at TValue}}#IsReadOnly">
+            <summary>
+            Gets a value indicating whether the dictionary is read-only.
+            </summary>
+            <value>true if the <see cref="T:System.Collections.Generic.ICollection{TKey,TValue}"/> is
+            read-only; otherwise, false. For <see
+            cref="T:System.Collections.Generic.Dictionary{TKey,TValue}"/>, this property always returns
+            false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> has a fixed size.
+            </summary>
+            <value>true if the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> has a
+            fixed size; otherwise, false. For <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>, this property always
+            returns false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> is read-only.
+            </summary>
+            <value>true if the <see cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/> is
+            read-only; otherwise, false. For <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>, this property always
+            returns false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"/> containing the keys of the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.ICollection"/> containing the keys of the <see
+            cref="T:System.Collections.Generic.IDictionary{TKey,TValue}"/>.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"/> containing the values in the <see
+            cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <value>An <see cref="T:System.Collections.ICollection"/> containing the values in the <see
+            cref="T:System.Collections.IDictionary"/>.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#IDictionary#Item(System.Object)">
+            <summary>
+            Gets or sets the value associated with the specified key.
+            </summary>
+            <param name="key">The key of the value to get or set.</param>
+            <value>The value associated with the specified key, or a null reference (Nothing in Visual Basic)
+            if <paramref name="key"/> is not in the dictionary or <paramref name="key"/> is of a type that is
+            not assignable to the key type <typeparamref name="TKey"/> of the <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>.</value>
+            <exception cref="T:System.ArgumentNullException"><paramref name="key"/> is a null reference
+            (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">
+            A value is being assigned, and <paramref name="key"/> is of a type that is not assignable to the
+            key type <typeparamref name="TKey"/> of the <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>. -or- A value is being
+            assigned, and <paramref name="key"/> is of a type that is not assignable to the value type
+            <typeparamref name="TValue"/> of the <see
+            cref="T:System.Collections.Generic.ConcurrentDictionary{TKey,TValue}"/>
+            </exception>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#ICollection#IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"/> is
+            synchronized with the SyncRoot.
+            </summary>
+            <value>true if access to the <see cref="T:System.Collections.ICollection"/> is synchronized
+            (thread safe); otherwise, false. For <see
+            cref="T:System.Collections.Concurrent.ConcurrentDictionary{TKey,TValue}"/>, this property always
+            returns false.</value>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.System#Collections#ICollection#SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see
+            cref="T:System.Collections.ICollection"/>. This property is not supported.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The SyncRoot property is not supported.</exception>
+        </member>
+        <member name="P:System.Collections.Concurrent.ConcurrentDictionary`2.DefaultConcurrencyLevel">
+            <summary>
+            The number of concurrent writes for which to optimize by default.
+            </summary>
+        </member>
+        <member name="T:System.Collections.Concurrent.ConcurrentDictionary`2.Node">
+            <summary>
+            A node in a singly-linked list representing a particular hash table bucket.
+            </summary>
+        </member>
+        <member name="T:System.Collections.Concurrent.ConcurrentDictionary`2.DictionaryEnumerator">
+            <summary>
+            A private class to represent enumeration over the dictionary that implements the 
+            IDictionaryEnumerator interface.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncServices.ThrowAsync(System.Exception,System.Threading.SynchronizationContext)">
+            <summary>Throws the exception on the ThreadPool.</summary>
+            <param name="exception">The exception to propagate.</param>
+            <param name="targetContext">The target context on which to propagate the exception.  Null to use the ThreadPool.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncServices.PrepareExceptionForRethrow(System.Exception)">
+            <summary>Copies the exception's stack trace so its stack trace isn't overwritten.</summary>
+            <param name="exc">The exception to prepare.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder">
+            <summary>
+            Provides a builder for asynchronous methods that return <see cref="T:System.Threading.Tasks.Task"/>.
+            This type is intended for compiler use only.
+            </summary>
+            <remarks>
+            AsyncTaskMethodBuilder is a value type, and thus it is copied by value.
+            Prior to being copied, one of its Task, SetResult, or SetException members must be accessed,
+            or else the copies may end up building distinct Task instances.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IAsyncMethodBuilder">
+            <summary>Represents an asynchronous method builder.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.s_cachedCompleted">
+            <summary>A cached VoidTaskResult task used for builders that complete synchronously.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.m_builder">
+            <summary>The generic builder object to which this non-generic instance delegates.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetResult">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">RanToCompletion</see> state.
+            </summary>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetException(System.Exception)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">Faulted</see> state with the specified exception.
+            </summary>
+            <param name="exception">The <see cref="T:System.Exception"/> to use to fault the task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.SetNotificationForWaitCompletion(System.Boolean)">
+            <summary>
+            Called by the debugger to request notification when the first wait operation
+            (await, Wait, Result, etc.) on this builder's task completes.
+            </summary>
+            <param name="enabled">
+            true to enable notification; false to disable a previously set notification.
+            </param>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Task">
+            <summary>Gets the <see cref="T:System.Threading.Tasks.Task"/> for this builder.</summary>
+            <returns>The <see cref="T:System.Threading.Tasks.Task"/> representing the builder's asynchronous operation.</returns>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger, and only in a single-threaded manner
+            when no other threads are in the middle of accessing this property or this.Task.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodBuilderCore">
+            <summary>Holds state related to the builder's IAsyncStateMachine.</summary>
+            <remarks>This is a mutable struct.  Be very delicate with it.</remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.m_stateMachine">
+            <summary>A reference to the heap-allocated state machine object associated with this builder.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument is null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.GetCompletionAction``2(``0@,``1@)">
+            <summary>
+            Gets the Action to use with an awaiter's OnCompleted or UnsafeOnCompleted method.
+            On first invocation, the supplied state machine will be boxed.
+            </summary>
+            <typeparam name="TMethodBuilder">Specifies the type of the method builder used.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine used.</typeparam>
+            <param name="builder">The builder.</param>
+            <param name="stateMachine">The state machine.</param>
+            <returns>An Action to provide to the awaiter.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner">
+            <summary>Provides the ability to invoke a state machine's MoveNext method under a supplied ExecutionContext.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.m_context">
+            <summary>The context with which to run MoveNext.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.m_stateMachine">
+            <summary>The state machine whose MoveNext method should be invoked.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.#ctor(System.ExecutionContextLightup)">
+            <summary>Initializes the runner.</summary>
+            <param name="context">The context with which to run MoveNext.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.Run">
+            <summary>Invokes MoveNext under the provided context.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.s_invokeMoveNext">
+            <summary>Cached delegate used with ExecutionContext.Run.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.InvokeMoveNext(System.Object)">
+            <summary>Invokes the MoveNext method on the supplied IAsyncStateMachine.</summary>
+            <param name="stateMachine">The IAsyncStateMachine machine instance.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder">
+            <summary>
+            Provides a builder for asynchronous methods that return void.
+            This type is intended for compiler use only.
+            </summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_synchronizationContext">
+            <summary>The synchronization context associated with this operation.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_coreState">
+            <summary>State related to the IAsyncStateMachine.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.m_objectIdForDebugger">
+            <summary>An object used by the debugger to uniquely identify this builder.  Lazily initialized.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.#cctor">
+            <summary>Temporary support for disabling crashing if tasks go unobserved.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.PreventUnobservedTaskExceptions">
+            <summary>Registers with UnobservedTaskException to suppress exception crashing.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.s_preventUnobservedTaskExceptionsInvoked">
+            <summary>Non-zero if PreventUnobservedTaskExceptions has already been invoked.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.#ctor(System.Threading.SynchronizationContext)">
+            <summary>Initializes the <see cref="T:System.Runtime.CompilerServices.AsyncVoidMethodBuilder"/>.</summary>
+            <param name="synchronizationContext">The synchronizationContext associated with this operation. This may be null.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetResult">
+            <summary>Completes the method builder successfully.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.SetException(System.Exception)">
+            <summary>Faults the method builder with an exception.</summary>
+            <param name="exception">The exception that is the cause of this fault.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is not initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.NotifySynchronizationContextOfCompletion">
+            <summary>Notifies the current synchronization context that the operation completed.</summary>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncVoidMethodBuilder.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger and only in a single-threaded manner.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1">
+            <summary>
+            Provides a builder for asynchronous methods that return <see cref="T:System.Threading.Tasks.Task`1"/>.
+            This type is intended for compiler use only.
+            </summary>
+            <remarks>
+            AsyncTaskMethodBuilder{TResult} is a value type, and thus it is copied by value.
+            Prior to being copied, one of its Task, SetResult, or SetException members must be accessed,
+            or else the copies may end up building distinct Task instances.
+            </remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.s_defaultResultTask">
+            <summary>A cached task for default(TResult).</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_coreState">
+            <summary>State related to the IAsyncStateMachine.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_task">
+            <summary>The lazily-initialized task.</summary>
+            <remarks>Must be named m_task for debugger step-over to work correctly.</remarks>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.m_taskCompletionSource">
+            <summary>The lazily-initialized task completion source.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.#cctor">
+            <summary>Temporary support for disabling crashing if tasks go unobserved.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Create">
+            <summary>Initializes a new <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</summary>
+            <returns>The initialized <see cref="T:System.Runtime.CompilerServices.AsyncTaskMethodBuilder"/>.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Start``1(``0@)">
+            <summary>Initiates the builder's execution with the associated state machine.</summary>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="stateMachine">The state machine instance, passed by reference.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Associates the builder with the state machine it represents.</summary>
+            <param name="stateMachine">The heap-allocated state machine object.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="stateMachine"/> argument was null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The builder is incorrectly initialized.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.System#Runtime#CompilerServices#IAsyncMethodBuilder#PreBoxInitialization">
+            <summary>Perform any initialization necessary prior to lifting the builder to the heap.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AwaitOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AwaitUnsafeOnCompleted``2(``0@,``1@)">
+            <summary>
+            Schedules the specified state machine to be pushed forward when the specified awaiter completes.
+            </summary>
+            <typeparam name="TAwaiter">Specifies the type of the awaiter.</typeparam>
+            <typeparam name="TStateMachine">Specifies the type of the state machine.</typeparam>
+            <param name="awaiter">The awaiter.</param>
+            <param name="stateMachine">The state machine.</param>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(`0)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task`1"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">RanToCompletion</see> state with the specified result.
+            </summary>
+            <param name="result">The result to use to complete the task.</param>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetResult(System.Threading.Tasks.TaskCompletionSource{`0})">
+            <summary>
+            Completes the builder by using either the supplied completed task, or by completing
+            the builder's previously accessed task using default(TResult).
+            </summary>
+            <param name="completedTask">A task already completed with the value default(TResult).</param>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetException(System.Exception)">
+            <summary>
+            Completes the <see cref="T:System.Threading.Tasks.Task`1"/> in the 
+            <see cref="T:System.Threading.Tasks.TaskStatus">Faulted</see> state with the specified exception.
+            </summary>
+            <param name="exception">The <see cref="T:System.Exception"/> to use to fault the task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="exception"/> argument is null (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.InvalidOperationException">The task has already completed.</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.SetNotificationForWaitCompletion(System.Boolean)">
+            <summary>
+            Called by the debugger to request notification when the first wait operation
+            (await, Wait, Result, etc.) on this builder's task completes.
+            </summary>
+            <param name="enabled">
+            true to enable notification; false to disable a previously set notification.
+            </param>
+            <remarks>
+            This should only be invoked from within an asynchronous method,
+            and only by the debugger.
+            </remarks>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.GetTaskForResult(`0)">
+            <summary>
+            Gets a task for the specified result.  This will either
+            be a cached or new task, never null.
+            </summary>
+            <param name="result">The result for which we need a task.</param>
+            <returns>The completed task containing the result.</returns>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.CompletionSource">
+            <summary>Gets the lazily-initialized TaskCompletionSource.</summary>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.Task">
+            <summary>Gets the <see cref="T:System.Threading.Tasks.Task`1"/> for this builder.</summary>
+            <returns>The <see cref="T:System.Threading.Tasks.Task`1"/> representing the builder's asynchronous operation.</returns>
+        </member>
+        <member name="P:System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.ObjectIdForDebugger">
+            <summary>
+            Gets an object that may be used to uniquely identify this builder to the debugger.
+            </summary>
+            <remarks>
+            This property lazily instantiates the ID in a non-thread-safe manner.  
+            It must only be used by the debugger, and only in a single-threaded manner
+            when no other threads are in the middle of accessing this property or this.Task.
+            </remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1">
+            <summary>Provides a base class used to cache tasks of a specific return type.</summary>
+            <typeparam name="TResult">Specifies the type of results the cached tasks return.</typeparam>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.Singleton">
+            <summary>
+            A singleton cache for this result type.
+            This may be null if there are no cached tasks for this TResult.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.CreateCompleted(`0)">
+            <summary>Creates a non-disposable task.</summary>
+            <param name="result">The result for the task.</param>
+            <returns>The cacheable task.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.CreateCache">
+            <summary>Creates a cache.</summary>
+            <returns>A task cache for this result type.</returns>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.FromResult(`0)">
+            <summary>Gets a cached task if one exists.</summary>
+            <param name="result">The result for which we want a cached task.</param>
+            <returns>A cached task if one exists; otherwise, null.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache">
+            <summary>Provides a cache for Boolean tasks.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.m_true">
+            <summary>A true task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.m_false">
+            <summary>A false task.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodBooleanTaskCache.FromResult(System.Boolean)">
+            <summary>Gets a cached task for the Boolean result.</summary>
+            <param name="result">true or false</param>
+            <returns>A cached task for the Boolean result.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache">
+            <summary>Provides a cache for zero Int32 tasks.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.INCLUSIVE_INT32_MIN">
+            <summary>The minimum value, inclusive, for which we want a cached task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.EXCLUSIVE_INT32_MAX">
+            <summary>The maximum value, exclusive, for which we want a cached task.</summary>
+        </member>
+        <member name="F:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.Int32Tasks">
+            <summary>The cache of Task{Int32}.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.CreateInt32Tasks">
+            <summary>Creates an array of cached tasks for the values in the range [INCLUSIVE_MIN,EXCLUSIVE_MAX).</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.AsyncMethodTaskCache`1.AsyncMethodInt32TaskCache.FromResult(System.Int32)">
+            <summary>Gets a cached task for the zero Int32 result.</summary>
+            <param name="result">The integer value</param>
+            <returns>A cached task for the Int32 result or null if not cached.</returns>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.IAsyncStateMachine">
+            <summary>
+            Represents state machines generated for asynchronous methods.
+            This type is intended for compiler use only.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext">
+            <summary>Moves the state machine to its next state.</summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.IAsyncStateMachine.SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)">
+            <summary>Configures the state machine with a heap-allocated replica.</summary>
+            <param name="stateMachine">The heap-allocated replica.</param>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.ICriticalNotifyCompletion">
+            <summary>
+            Represents an awaiter used to schedule continuations when an await operation completes.
+            </summary>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.INotifyCompletion">
+            <summary>
+            Represents an operation that will schedule continuations when the operation completes.
+            </summary>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.INotifyCompletion.OnCompleted(System.Action)">
+            <summary>Schedules the continuation action to be invoked when the instance completes.</summary>
+            <param name="continuation">The action to invoke when the operation completes.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="continuation"/> argument is null (Nothing in Visual Basic).</exception>
+        </member>
+        <member name="M:System.Runtime.CompilerServices.ICriticalNotifyCompletion.UnsafeOnCompleted(System.Action)">
+            <summary>Schedules the continuation action to be invoked when the instance completes.</summary>
+            <param name="continuation">The action to invoke when the operation completes.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="continuation"/> argument is null (Nothing in Visual Basic).</exception>
+            <remarks>Unlike OnCompleted, UnsafeOnCompleted need not propagate ExecutionContext information.</remarks>
+        </member>
+        <member name="T:System.Runtime.CompilerServices.VoidTaskResult">
+            <summary>Used with Task(of void)</summary>
+        </member>
+        <member name="T:System.Threading.Tasks.IThreadPoolWorkItem">
+            <summary>
+            An interface similar to the one added in .NET 4.0.
+            </summary>
+        </member>
+        <member name="T:System.OperationCanceledException">
+            <summary>The exception that is thrown in a thread upon cancellation of an operation that the thread was executing.</summary>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor">
+            <summary>Initializes the exception.</summary>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.String)">
+            <summary>Initializes the exception.</summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.String,System.Exception)">
+            <summary>Initializes the exception.</summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.Threading.CancellationToken)">
+            <summary>Initializes the exception.</summary>
+            <param name="token">A cancellation token associated with the operation that was canceled.</param>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.String,System.Threading.CancellationToken)">
+            <summary>Initializes the exception.</summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="token">A cancellation token associated with the operation that was canceled.</param>
+        </member>
+        <member name="M:System.OperationCanceledException.#ctor(System.String,System.Exception,System.Threading.CancellationToken)">
+            <summary>Initializes the exception.</summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception.</param>
+            <param name="token">A cancellation token associated with the operation that was canceled.</param>
+        </member>
+        <member name="P:System.OperationCanceledException.CancellationToken">
+            <summary>Gets a token associated with the operation that was canceled.</summary>
+        </member>
+        <member name="T:System.Threading.StackCrawlMark">
+            <summary>
+            A dummy replacement for the .NET internal class StackCrawlMark.
+            </summary>
+        </member>
+        <member name="T:System.Threading.CancellationToken">
+            <summary>
+            Propogates notification that operations should be canceled.
+            </summary>
+            <remarks>
+            <para>
+            A <see cref="T:System.Threading.CancellationToken"/> may be created directly in an unchangeable canceled or non-canceled state
+            using the CancellationToken's constructors. However, to have a CancellationToken that can change 
+            from a non-canceled to a canceled state, 
+            <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> must be used.
+            CancellationTokenSource exposes the associated CancellationToken that may be canceled by the source through its 
+            <see cref="P:System.Threading.CancellationTokenSource.Token">Token</see> property. 
+            </para>
+            <para>
+            Once canceled, a token may not transition to a non-canceled state, and a token whose 
+            <see cref="P:System.Threading.CancellationToken.CanBeCanceled"/> is false will never change to one that can be canceled.
+            </para>
+            <para>
+            All members of this struct are thread-safe and may be used concurrently from multiple threads.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationToken.#ctor(System.Threading.CancellationTokenSource)">
+            <summary>
+            Internal constructor only a CancellationTokenSource should create a CancellationToken
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationToken.#ctor(System.Boolean)">
+            <summary>
+            Initializes the <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </summary>
+            <param name="canceled">
+            The canceled state for the token.
+            </param>
+            <remarks>
+            Tokens created with this constructor will remain in the canceled state specified
+            by the <paramref name="canceled"/> parameter.  If <paramref name="canceled"/> is false,
+            both <see cref="P:System.Threading.CancellationToken.CanBeCanceled"/> and <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> will be false.
+            If <paramref name="canceled"/> is true,
+            both <see cref="P:System.Threading.CancellationToken.CanBeCanceled"/> and <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> will be true. 
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Register(System.Action)">
+            <summary>
+            Registers a delegate that will be called when this <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.
+            </summary>
+            <remarks>
+            <para>
+            If this token is already in the canceled state, the
+            delegate will be run immediately and synchronously. Any exception the delegate generates will be
+            propogated out of this method call.
+            </para>
+            </remarks>
+            <param name="callback">The delegate to be executed when the <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.</param>
+            <returns>The <see cref="T:System.Threading.CancellationTokenRegistration"/> instance that can 
+            be used to deregister the callback.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="callback"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Register(System.Action,System.Boolean)">
+            <summary>
+            Registers a delegate that will be called when this 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.
+            </summary>
+            <remarks>
+            <para>
+            If this token is already in the canceled state, the
+            delegate will be run immediately and synchronously. Any exception the delegate generates will be
+            propogated out of this method call.
+            </para>
+            </remarks>
+            <param name="callback">The delegate to be executed when the <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.</param>
+            <param name="useSynchronizationContext">A Boolean value that indicates whether to capture
+            the current <see cref="T:System.Threading.SynchronizationContext">SynchronizationContext</see> and use it
+            when invoking the <paramref name="callback"/>.</param>
+            <returns>The <see cref="T:System.Threading.CancellationTokenRegistration"/> instance that can 
+            be used to deregister the callback.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="callback"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Register(System.Action{System.Object},System.Object)">
+            <summary>
+            Registers a delegate that will be called when this 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.
+            </summary>
+            <remarks>
+            <para>
+            If this token is already in the canceled state, the
+            delegate will be run immediately and synchronously. Any exception the delegate generates will be
+            propogated out of this method call.
+            </para>
+            </remarks>
+            <param name="callback">The delegate to be executed when the <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.</param>
+            <param name="state">The state to pass to the <paramref name="callback"/> when the delegate is invoked.  This may be null.</param>
+            <returns>The <see cref="T:System.Threading.CancellationTokenRegistration"/> instance that can 
+            be used to deregister the callback.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="callback"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Register(System.Action{System.Object},System.Object,System.Boolean)">
+            <summary>
+            Registers a delegate that will be called when this 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.
+            </summary>
+            <remarks>
+            <para>
+            If this token is already in the canceled state, the
+            delegate will be run immediately and synchronously. Any exception the delegate generates will be
+            propogated out of this method call.
+            </para>
+            </remarks>
+            <param name="callback">The delegate to be executed when the <see cref="T:System.Threading.CancellationToken">CancellationToken</see> is canceled.</param>
+            <param name="state">The state to pass to the <paramref name="callback"/> when the delegate is invoked.  This may be null.</param>
+            <param name="useSynchronizationContext">A Boolean value that indicates whether to capture
+            the current <see cref="T:System.Threading.SynchronizationContext">SynchronizationContext</see> and use it
+            when invoking the <paramref name="callback"/>.</param>
+            <returns>The <see cref="T:System.Threading.CancellationTokenRegistration"/> instance that can 
+            be used to deregister the callback.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="callback"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Equals(System.Threading.CancellationToken)">
+            <summary>
+            Determines whether the current <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instance is equal to the 
+            specified token.
+            </summary>
+            <param name="other">The other <see cref="T:System.Threading.CancellationToken">CancellationToken</see> to which to compare this
+            instance.</param>
+            <returns>True if the instances are equal; otherwise, false. Two tokens are equal if they are associated
+            with the same <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> or if they were both constructed 
+            from public CancellationToken constructors and their <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> values are equal.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationToken.Equals(System.Object)">
+            <summary>
+            Determines whether the current <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instance is equal to the 
+            specified <see cref="T:System.Object"/>.
+            </summary>
+            <param name="other">The other object to which to compare this instance.</param>
+            <returns>True if <paramref name="other"/> is a <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            and if the two instances are equal; otherwise, false. Two tokens are equal if they are associated
+            with the same <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> or if they were both constructed 
+            from public CancellationToken constructors and their <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> values are equal.</returns>
+            <exception cref="T:System.ObjectDisposedException">An associated <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.GetHashCode">
+            <summary>
+            Serves as a hash function for a <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </summary>
+            <returns>A hash code for the current <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instance.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationToken.op_Equality(System.Threading.CancellationToken,System.Threading.CancellationToken)">
+            <summary>
+            Determines whether two <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instances are equal.
+            </summary>
+            <param name="left">The first instance.</param>
+            <param name="right">The second instance.</param>
+            <returns>True if the instances are equal; otherwise, false.</returns>
+            <exception cref="T:System.ObjectDisposedException">An associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.op_Inequality(System.Threading.CancellationToken,System.Threading.CancellationToken)">
+            <summary>
+            Determines whether two <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instances are not equal.
+            </summary>
+            <param name="left">The first instance.</param>
+            <param name="right">The second instance.</param>
+            <returns>True if the instances are not equal; otherwise, false.</returns>
+            <exception cref="T:System.ObjectDisposedException">An associated <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationToken.ThrowIfCancellationRequested">
+            <summary>
+            Throws a <see cref="T:System.OperationCanceledException">OperationCanceledException</see> if
+            this token has had cancellation requested.
+            </summary>
+            <remarks>
+            This method provides functionality equivalent to:
+            <code>
+            if (token.IsCancellationRequested) 
+               throw new OperationCanceledException(token);
+            </code>
+            </remarks>
+            <exception cref="T:System.OperationCanceledException">The token has had cancellation requested.</exception>
+            <exception cref="T:System.ObjectDisposedException">The associated <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="P:System.Threading.CancellationToken.None">
+            <summary>
+            Returns an empty CancellationToken value.
+            </summary>
+            <remarks>
+            The <see cref="T:System.Threading.CancellationToken"/> value returned by this property will be non-cancelable by default.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.CancellationToken.IsCancellationRequested">
+            <summary>
+            Gets whether cancellation has been requested for this token.
+            </summary>
+            <value>Whether cancellation has been requested for this token.</value>
+            <remarks>
+            <para>
+            This property indicates whether cancellation has been requested for this token, 
+            either through the token initially being construted in a canceled state, or through
+            calling <see cref="M:System.Threading.CancellationTokenSource.Cancel">Cancel</see> 
+            on the token's associated <see cref="T:System.Threading.CancellationTokenSource"/>.
+            </para>
+            <para>
+            If this property is true, it only guarantees that cancellation has been requested.  
+            It does not guarantee that every registered handler
+            has finished executing, nor that cancellation requests have finished propagating
+            to all registered handlers.  Additional synchronization may be required,
+            particularly in situations where related objects are being canceled concurrently.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:System.Threading.CancellationToken.CanBeCanceled">
+            <summary>
+            Gets whether this token is capable of being in the canceled state.
+            </summary>
+            <remarks>
+            If CanBeCanceled returns false, it is guaranteed that the token will never transition
+            into a canceled state, meaning that <see cref="P:System.Threading.CancellationToken.IsCancellationRequested"/> will never
+            return true.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.CancellationToken.WaitHandle">
+            <summary>
+            Gets a <see cref="T:System.Threading.WaitHandle"/> that is signaled when the token is canceled.</summary>
+            <remarks>
+            Accessing this property causes a <see cref="T:System.Threading.WaitHandle">WaitHandle</see>
+            to be instantiated.  It is preferable to only use this property when necessary, and to then
+            dispose the associated <see cref="T:System.Threading.CancellationTokenSource"/> instance at the earliest opportunity (disposing
+            the source will dispose of this allocated handle).  The handle should not be closed or disposed directly.
+            </remarks>
+            <exception cref="T:System.ObjectDisposedException">The associated <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> has been disposed.</exception>
+        </member>
+        <member name="T:System.Threading.CancellationTokenRegistration">
+            <summary>
+            Represents a callback delegate that has been registered with a <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </summary>
+            <remarks>
+            To unregister a callback, dispose the corresponding Registration instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.TryDeregister">
+            <summary>
+            Attempts to deregister the item. If it's already being run, this may fail.
+            Entails a full memory fence.
+            </summary>
+            <returns>True if the callback was found and deregistered, false otherwise.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.Dispose">
+            <summary>
+            Disposes of the registration and unregisters the target callback from the associated 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            If the target callback is currently executing this method will wait until it completes, except
+            in the degenerate cases where a callback method deregisters itself.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.op_Equality(System.Threading.CancellationTokenRegistration,System.Threading.CancellationTokenRegistration)">
+            <summary>
+            Determines whether two <see
+            cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see>
+            instances are equal.
+            </summary>
+            <param name="left">The first instance.</param>
+            <param name="right">The second instance.</param>
+            <returns>True if the instances are equal; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.op_Inequality(System.Threading.CancellationTokenRegistration,System.Threading.CancellationTokenRegistration)">
+            <summary>
+            Determines whether two <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instances are not equal.
+            </summary>
+            <param name="left">The first instance.</param>
+            <param name="right">The second instance.</param>
+            <returns>True if the instances are not equal; otherwise, false.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.Equals(System.Object)">
+            <summary>
+            Determines whether the current <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instance is equal to the 
+            specified <see cref="T:System.Object"/>.
+            </summary> 
+            <param name="obj">The other object to which to compare this instance.</param>
+            <returns>True, if both this and <paramref name="obj"/> are equal. False, otherwise.
+            Two <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instances are equal if
+            they both refer to the output of a single call to the same Register method of a 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see>. 
+            </returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.Equals(System.Threading.CancellationTokenRegistration)">
+            <summary>
+            Determines whether the current <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instance is equal to the 
+            specified <see cref="T:System.Object"/>.
+            </summary> 
+            <param name="other">The other <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> to which to compare this instance.</param>
+            <returns>True, if both this and <paramref name="other"/> are equal. False, otherwise.
+            Two <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instances are equal if
+            they both refer to the output of a single call to the same Register method of a 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see>. 
+            </returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenRegistration.GetHashCode">
+            <summary>
+            Serves as a hash function for a <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration.</see>.
+            </summary>
+            <returns>A hash code for the current <see cref="T:System.Threading.CancellationTokenRegistration">CancellationTokenRegistration</see> instance.</returns>
+        </member>
+        <member name="T:System.Threading.CancellationTokenSource">
+            <summary>
+            Signals to a <see cref="T:System.Threading.CancellationToken"/> that it should be canceled.
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.CancellationTokenSource"/> is used to instantiate a <see cref="T:System.Threading.CancellationToken"/>
+            (via the source's <see cref="P:System.Threading.CancellationTokenSource.Token">Token</see> property)
+            that can be handed to operations that wish to be notified of cancellation or that can be used to
+            register asynchronous operations for cancellation. That token may have cancellation requested by
+            calling to the source's <see cref="M:System.Threading.CancellationTokenSource.Cancel">Cancel</see>
+            method.
+            </para>
+            <para>
+            All members of this class, except <see cref="M:System.Threading.CancellationTokenSource.Dispose">Dispose</see>, are thread-safe and may be used
+            concurrently from multiple threads.
+            </para>
+            </remarks>
+        </member>
+        <member name="F:System.Threading.CancellationTokenSource.m_threadIDExecutingCallbacks">
+            The ID of the thread currently executing the main body of CTS.Cancel()
+            this helps us to know if a call to ctr.Dispose() is running 'within' a cancellation callback.
+            This is updated as we move between the main thread calling cts.Cancel() and any syncContexts that are used to 
+            actually run the callbacks.
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.#ctor">
+            <summary>
+            Initializes the <see cref="T:System.Threading.CancellationTokenSource"/>.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.Cancel">
+            <summary>
+            Communicates a request for cancellation.
+            </summary>
+            <remarks>
+            <para>
+            The associated <see cref="T:System.Threading.CancellationToken"/> will be
+            notified of the cancellation and will transition to a state where 
+            <see cref="P:System.Threading.CancellationToken.IsCancellationRequested">IsCancellationRequested</see> returns true. 
+            Any callbacks or cancelable operations
+            registered with the <see cref="T:System.Threading.CancellationToken"/>  will be executed.
+            </para>
+            <para>
+            Cancelable operations and callbacks registered with the token should not throw exceptions.
+            However, this overload of Cancel will aggregate any exceptions thrown into a <see cref="T:System.AggregateException"/>,
+            such that one callback throwing an exception will not prevent other registered callbacks from being executed.
+            </para>
+            <para>
+            The <see cref="T:System.Threading.ExecutionContext"/> that was captured when each callback was registered
+            will be reestablished when the callback is invoked.
+            </para>
+            </remarks>
+            <exception cref="T:System.AggregateException">An aggregate exception containing all the exceptions thrown
+            by the registered callbacks on the associated <see cref="T:System.Threading.CancellationToken"/>.</exception>
+            <exception cref="T:System.ObjectDisposedException">This <see cref="T:System.Threading.CancellationTokenSource"/> has been disposed.</exception> 
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.Cancel(System.Boolean)">
+            <summary>
+            Communicates a request for cancellation.
+            </summary>
+            <remarks>
+            <para>
+            The associated <see cref="T:System.Threading.CancellationToken"/> will be
+            notified of the cancellation and will transition to a state where 
+            <see cref="P:System.Threading.CancellationToken.IsCancellationRequested">IsCancellationRequested</see> returns true. 
+            Any callbacks or cancelable operations
+            registered with the <see cref="T:System.Threading.CancellationToken"/>  will be executed.
+            </para>
+            <para>
+            Cancelable operations and callbacks registered with the token should not throw exceptions. 
+            If <paramref name="throwOnFirstException"/> is true, an exception will immediately propagate out of the
+            call to Cancel, preventing the remaining callbacks and cancelable operations from being processed.
+            If <paramref name="throwOnFirstException"/> is false, this overload will aggregate any 
+            exceptions thrown into a <see cref="T:System.AggregateException"/>,
+            such that one callback throwing an exception will not prevent other registered callbacks from being executed.
+            </para>
+            <para>
+            The <see cref="T:System.Threading.ExecutionContext"/> that was captured when each callback was registered
+            will be reestablished when the callback is invoked.
+            </para>
+            </remarks>
+            <param name="throwOnFirstException">Specifies whether exceptions should immediately propagate.</param>
+            <exception cref="T:System.AggregateException">An aggregate exception containing all the exceptions thrown
+            by the registered callbacks on the associated <see cref="T:System.Threading.CancellationToken"/>.</exception>
+            <exception cref="T:System.ObjectDisposedException">This <see cref="T:System.Threading.CancellationTokenSource"/> has been disposed.</exception> 
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.Dispose">
+            <summary>
+            Releases the resources used by this <see cref="T:System.Threading.CancellationTokenSource" />.
+            </summary>
+            <remarks>
+            This method is not thread-safe for any other concurrent calls.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.ThrowIfDisposed">
+            <summary>
+            Throws an exception if the source has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.InternalGetStaticSource(System.Boolean)">
+            <summary>
+            InternalGetStaticSource()
+            </summary>
+            <param name="set">Whether the source should be set.</param>
+            <returns>A static source to be shared among multiple tokens.</returns>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.InternalRegister(System.Action{System.Object},System.Object,System.Threading.SynchronizationContext)">
+            <summary>
+            Registers a callback object. If cancellation has already occurred, the
+            callback will have been run by the time this method returns.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.NotifyCancellation(System.Boolean)">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(System.Boolean)">
+            <summary>
+            Invoke the Canceled event.
+            </summary>
+            <remarks>
+            The handlers are invoked synchronously in LIFO order.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.CreateLinkedTokenSource(System.Threading.CancellationToken,System.Threading.CancellationToken)">
+            <summary>
+            Creates a <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that will be in the canceled state
+            when any of the source tokens are in the canceled state.
+            </summary>
+            <param name="token1">The first <see cref="T:System.Threading.CancellationToken">CancellationToken</see> to observe.</param>
+            <param name="token2">The second <see cref="T:System.Threading.CancellationToken">CancellationToken</see> to observe.</param>
+            <returns>A <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that is linked 
+            to the source tokens.</returns>
+            <exception cref="T:System.ObjectDisposedException">A <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> associated with
+            one of the source tokens has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.CancellationTokenSource.CreateLinkedTokenSource(System.Threading.CancellationToken[])">
+            <summary>
+            Creates a <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that will be in the canceled state
+            when any of the source tokens are in the canceled state.
+            </summary>
+            <param name="tokens">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see> instances to observe.</param>
+            <returns>A <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> that is linked 
+            to the source tokens.</returns>
+            <exception cref="T:System.ArgumentNullException"><paramref name="tokens"/> is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">A <see
+            cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see> associated with
+            one of the source tokens has been disposed.</exception>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.IsCancellationRequested">
+            <summary>
+            Gets whether cancellation has been requested for this <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see>.
+            </summary>
+            <value>Whether cancellation has been requested for this <see cref="T:System.Threading.CancellationTokenSource">CancellationTokenSource</see>.</value>
+            <remarks>
+            <para>
+            This property indicates whether cancellation has been requested for this token source, such as
+            due to a call to its
+            <see cref="M:System.Threading.CancellationTokenSource.Cancel">Cancel</see> method.
+            </para>
+            <para>
+            If this property returns true, it only guarantees that cancellation has been requested. It does not
+            guarantee that every handler registered with the corresponding token has finished executing, nor
+            that cancellation requests have finished propagating to all registered handlers. Additional
+            synchronization may be required, particularly in situations where related objects are being
+            canceled concurrently.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.IsCancellationCompleted">
+            <summary>
+            A simple helper to determine whether cancellation has finished.
+            </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.IsDisposed">
+            <summary>
+            A simple helper to determine whether disposal has occured.
+            </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.ThreadIDExecutingCallbacks">
+            <summary>
+            The ID of the thread that is running callbacks.
+            </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.Token">
+            <summary>
+            Gets the <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            associated with this <see cref="T:System.Threading.CancellationTokenSource"/>.
+            </summary>
+            <value>The <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            associated with this <see cref="T:System.Threading.CancellationTokenSource"/>.</value>
+            <exception cref="T:System.ObjectDisposedException">The token source has been
+            disposed.</exception>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.CanBeCanceled">
+             <summary>
+            
+             </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.WaitHandle">
+             <summary>
+            
+             </summary>
+        </member>
+        <member name="P:System.Threading.CancellationTokenSource.ExecutingCallback">
+            <summary>
+            The currently executing callback
+            </summary>
+        </member>
+        <member name="T:System.Threading.CancellationCallbackInfo">
+            <summary>
+            A helper class for collating the various bits of information required to execute 
+            cancellation callbacks.
+            </summary>
+        </member>
+        <member name="M:System.Threading.CancellationCallbackInfo.ExecuteCallback">
+            <summary>
+            InternalExecuteCallbackSynchronously_GeneralPath
+            This will be called on the target synchronization context, however, we still need to restore the required execution context
+            </summary>
+        </member>
+        <member name="T:System.Threading.SparselyPopulatedArray`1">
+            <summary>
+            A sparsely populated array.  Elements can be sparse and some null, but this allows for
+            lock-free additions and growth, and also for constant time removal (by nulling out).
+            </summary>
+            <typeparam name="T">The kind of elements contained within.</typeparam>
+        </member>
+        <member name="M:System.Threading.SparselyPopulatedArray`1.#ctor(System.Int32)">
+            <summary>
+            Allocates a new array with the given initial size.
+            </summary>
+            <param name="initialSize">How many array slots to pre-allocate.</param>
+        </member>
+        <member name="M:System.Threading.SparselyPopulatedArray`1.Add(`0)">
+            <summary>
+            Adds an element in the first available slot, beginning the search from the tail-to-head.
+            If no slots are available, the array is grown.  The method doesn't return until successful.
+            </summary>
+            <param name="element">The element to add.</param>
+            <returns>Information about where the add happened, to enable O(1) deregistration.</returns>
+        </member>
+        <member name="P:System.Threading.SparselyPopulatedArray`1.Tail">
+            <summary>
+            The tail of the doubly linked list.
+            </summary>
+        </member>
+        <member name="T:System.Threading.SparselyPopulatedArrayAddInfo`1">
+            <summary>
+            A struct to hold a link to the exact spot in an array an element was inserted, enabling
+            constant time removal later on.
+            </summary>
+        </member>
+        <member name="T:System.Threading.SparselyPopulatedArrayFragment`1">
+            <summary>
+            A fragment of a sparsely populated array, doubly linked.
+            </summary>
+            <typeparam name="T">The kind of elements contained within.</typeparam>
+        </member>
+        <member name="T:System.Threading.LazyInitializer">
+            <summary>
+            Provides lazy initialization routines.
+            </summary>
+            <remarks>
+            These routines avoid needing to allocate a dedicated, lazy-initialization instance, instead using
+            references to ensure targets have been initialized as they are accessed.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitialized``1(``0@)">
+            <summary>
+            Initializes a target reference type with the type's default constructor if the target has not
+            already been initialized.
+            </summary>
+            <typeparam name="T">The refence type of the reference to be initialized.</typeparam>
+            <param name="target">A reference of type <typeparamref name="T"/> to initialize if it has not
+            already been initialized.</param>
+            <returns>The initialized reference of type <typeparamref name="T"/>.</returns>
+            <exception cref="T:System.MissingMemberException">Type <typeparamref name="T"/> does not have a default
+            constructor.</exception>
+            <exception cref="T:System.MemberAccessException">
+            Permissions to access the constructor of type <typeparamref name="T"/> were missing.
+            </exception>
+            <remarks>
+            <para>
+            This method may only be used on reference types. To ensure initialization of value
+            types, see other overloads of EnsureInitialized.
+            </para>
+            <para>
+            This method may be used concurrently by multiple threads to initialize <paramref name="target"/>.  
+            In the event that multiple threads access this method concurrently, multiple instances of <typeparamref name="T"/>
+            may be created, but only one will be stored into <paramref name="target"/>. In such an occurrence, this method will not dispose of the
+            objects that were not stored.  If such objects must be disposed, it is up to the caller to determine 
+            if an object was not used and to then dispose of the object appropriately.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitialized``1(``0@,System.Func{``0})">
+            <summary>
+            Initializes a target reference type using the specified function if it has not already been
+            initialized.
+            </summary>
+            <typeparam name="T">The reference type of the reference to be initialized.</typeparam>
+            <param name="target">The reference of type <typeparamref name="T"/> to initialize if it has not
+            already been initialized.</param>
+            <param name="valueFactory">The <see cref="T:System.Func{T}"/> invoked to initialize the
+            reference.</param>
+            <returns>The initialized reference of type <typeparamref name="T"/>.</returns>
+            <exception cref="T:System.MissingMemberException">Type <typeparamref name="T"/> does not have a
+            default constructor.</exception>
+            <exception cref="T:System.InvalidOperationException"><paramref name="valueFactory"/> returned
+            null.</exception>
+            <remarks>
+            <para>
+            This method may only be used on reference types, and <paramref name="valueFactory"/> may
+            not return a null reference (Nothing in Visual Basic). To ensure initialization of value types or
+            to allow null reference types, see other overloads of EnsureInitialized.
+            </para>
+            <para>
+            This method may be used concurrently by multiple threads to initialize <paramref name="target"/>.  
+            In the event that multiple threads access this method concurrently, multiple instances of <typeparamref name="T"/>
+            may be created, but only one will be stored into <paramref name="target"/>. In such an occurrence, this method will not dispose of the
+            objects that were not stored.  If such objects must be disposed, it is up to the caller to determine 
+            if an object was not used and to then dispose of the object appropriately.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitializedCore``1(``0@,System.Func{``0})">
+            <summary>
+            Initialize the target using the given delegate (slow path).
+            </summary>
+            <typeparam name="T">The reference type of the reference to be initialized.</typeparam>
+            <param name="target">The variable that need to be initialized</param>
+            <param name="valueFactory">The delegate that will be executed to initialize the target</param>
+            <returns>The initialized variable</returns>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitialized``1(``0@,System.Boolean@,System.Object@)">
+            <summary>
+            Initializes a target reference or value type with its default constructor if it has not already
+            been initialized.
+            </summary>
+            <typeparam name="T">The type of the reference to be initialized.</typeparam>
+            <param name="target">A reference or value of type <typeparamref name="T"/> to initialize if it
+            has not already been initialized.</param>
+            <param name="initialized">A reference to a boolean that determines whether the target has already
+            been initialized.</param>
+            <param name="syncLock">A reference to an object used as the mutually exclusive lock for initializing
+            <paramref name="target"/>.</param>
+            <returns>The initialized value of type <typeparamref name="T"/>.</returns>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitialized``1(``0@,System.Boolean@,System.Object@,System.Func{``0})">
+            <summary>
+            Initializes a target reference or value type with a specified function if it has not already been
+            initialized.
+            </summary>
+            <typeparam name="T">The type of the reference to be initialized.</typeparam>
+            <param name="target">A reference or value of type <typeparamref name="T"/> to initialize if it
+            has not already been initialized.</param>
+            <param name="initialized">A reference to a boolean that determines whether the target has already
+            been initialized.</param>
+            <param name="syncLock">A reference to an object used as the mutually exclusive lock for initializing
+            <paramref name="target"/>.</param>
+            <param name="valueFactory">The <see cref="T:System.Func{T}"/> invoked to initialize the
+            reference or value.</param>
+            <returns>The initialized value of type <typeparamref name="T"/>.</returns>
+        </member>
+        <member name="M:System.Threading.LazyInitializer.EnsureInitializedCore``1(``0@,System.Boolean@,System.Object@,System.Func{``0})">
+            <summary>
+            Ensure the target is initialized and return the value (slow path). This overload permits nulls
+            and also works for value type targets. Uses the supplied function to create the value.
+            </summary>
+            <typeparam name="T">The type of target.</typeparam>
+            <param name="target">A reference to the target to be initialized.</param>
+            <param name="initialized">A reference to a location tracking whether the target has been initialized.</param>
+            <param name="syncLock">A reference to a location containing a mutual exclusive lock.</param>
+            <param name="valueFactory">
+            The <see cref="T:System.Func{T}"/> to invoke in order to produce the lazily-initialized value.
+            </param>
+            <returns>The initialized object.</returns>
+        </member>
+        <member name="T:System.Threading.ManualResetEventSlim">
+            <summary>
+            Provides a slimmed down version of <see cref="T:System.Threading.ManualResetEvent"/>.
+            </summary>
+            <remarks>
+            All public and protected members of <see cref="T:System.Threading.ManualResetEventSlim"/> are thread-safe and may be used
+            concurrently from multiple threads, with the exception of Dispose, which
+            must only be used when all other operations on the <see cref="T:System.Threading.ManualResetEventSlim"/> have
+            completed, and Reset, which should only be used when no other threads are
+            accessing the event.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.ManualResetEventSlim"/>
+            class with an initial state of nonsignaled.
+            </summary>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.#ctor(System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.ManualResetEventSlim"/>
+            class with a Boolen value indicating whether to set the intial state to signaled.
+            </summary>
+            <param name="initialState">true to set the initial state signaled; false to set the initial state
+            to nonsignaled.</param>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.#ctor(System.Boolean,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:System.Threading.ManualResetEventSlim"/>
+            class with a Boolen value indicating whether to set the intial state to signaled and a specified
+            spin count.
+            </summary>
+            <param name="initialState">true to set the initial state to signaled; false to set the initial state
+            to nonsignaled.</param>
+            <param name="spinCount">The number of spin waits that will occur before falling back to a true
+            wait.</param>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="spinCount"/> is less than
+            0 or greater than the maximum allowed value.</exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Initialize(System.Boolean,System.Int32)">
+            <summary>
+            Initializes the internal state of the event.
+            </summary>
+            <param name="initialState">Whether the event is set initially or not.</param>
+            <param name="spinCount">The spin count that decides when the event will block.</param>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.EnsureLockObjectCreated">
+            <summary>
+            Helper to ensure the lock object is created before first use.
+            </summary>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.LazyInitializeEvent">
+            <summary>
+            This method lazily initializes the event object. It uses CAS to guarantee that
+            many threads racing to call this at once don't result in more than one event
+            being stored and used. The event will be signaled or unsignaled depending on
+            the state of the thin-event itself, with synchronization taken into account.
+            </summary>
+            <returns>True if a new event was created and stored, false otherwise.</returns>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Set">
+            <summary>
+            Sets the state of the event to signaled, which allows one or more threads waiting on the event to
+            proceed.
+            </summary>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Set(System.Boolean)">
+            <summary>
+            Private helper to actually perform the Set.
+            </summary>
+            <param name="duringCancellation">Indicates whether we are calling Set() during cancellation.</param>
+            <exception cref="T:System.OperationCanceledException">The object has been canceled.</exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Reset">
+            <summary>
+            Sets the state of the event to nonsignaled, which causes threads to block.
+            </summary>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.ManualResetEventSlim"/>, <see cref="M:System.Threading.ManualResetEventSlim.Reset"/> is not
+            thread-safe and may not be used concurrently with other members of this instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set.
+            </summary>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+            <remarks>
+            The caller of this method blocks indefinitely until the current instance is set. The caller will
+            return immediately if the event is currently in a set state.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.Threading.CancellationToken)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> receives a signal,
+            while observing a <see cref="T:System.Threading.CancellationToken"/>.
+            </summary>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to
+            observe.</param>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+            <exception cref="T:System.OperationCanceledExcepton"><paramref name="cancellationToken"/> was
+            canceled.</exception>
+            <remarks>
+            The caller of this method blocks indefinitely until the current instance is set. The caller will
+            return immediately if the event is currently in a set state.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.TimeSpan)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set, using a
+            <see cref="T:System.TimeSpan"/> to measure the time interval.
+            </summary>
+            <param name="timeout">A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds
+            to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <returns>true if the <see cref="T:System.Threading.ManualResetEventSlim"/> was set; otherwise,
+            false.</returns>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="timeout"/> is a negative
+            number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater
+            than <see cref="F:System.Int32.MaxValue"/>.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.TimeSpan,System.Threading.CancellationToken)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set, using a
+            <see cref="T:System.TimeSpan"/> to measure the time interval, while observing a <see cref="T:System.Threading.CancellationToken"/>.
+            </summary>
+            <param name="timeout">A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds
+            to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to
+            observe.</param>
+            <returns>true if the <see cref="T:System.Threading.ManualResetEventSlim"/> was set; otherwise,
+            false.</returns>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="timeout"/> is a negative
+            number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater
+            than <see cref="F:System.Int32.MaxValue"/>.</exception>
+            <exception cref="T:System.Threading.OperationCanceledException"><paramref name="cancellationToken"/> was canceled.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.Int32)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set, using a
+            32-bit signed integer to measure the time interval.
+            </summary>
+            <param name="millisecondsTimeout">The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/>(-1) to wait indefinitely.</param>
+            <returns>true if the <see cref="T:System.Threading.ManualResetEventSlim"/> was set; otherwise,
+            false.</returns>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="millisecondsTimeout"/> is a
+            negative number other than -1, which represents an infinite time-out.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Wait(System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Blocks the current thread until the current <see cref="T:System.Threading.ManualResetEventSlim"/> is set, using a
+            32-bit signed integer to measure the time interval, while observing a <see cref="T:System.Threading.CancellationToken"/>.
+            </summary>
+            <param name="millisecondsTimeout">The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/>(-1) to wait indefinitely.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to
+            observe.</param>
+            <returns>true if the <see cref="T:System.Threading.ManualResetEventSlim"/> was set; otherwise,
+            false.</returns>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="millisecondsTimeout"/> is a
+            negative number other than -1, which represents an infinite time-out.</exception>
+            <exception cref="T:System.InvalidOperationException">
+            The maximum number of waiters has been exceeded.
+            </exception>
+            <exception cref="T:System.Threading.OperationCanceledException"><paramref name="cancellationToken"/> was canceled.</exception>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Dispose">
+            <summary>
+            Releases all resources used by the current instance of <see cref="T:System.Threading.ManualResetEventSlim"/>.
+            </summary>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.ManualResetEventSlim"/>, <see cref="M:System.Threading.ManualResetEventSlim.Dispose"/> is not
+            thread-safe and may not be used concurrently with other members of this instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.Dispose(System.Boolean)">
+            <summary>
+            When overridden in a derived class, releases the unmanaged resources used by the 
+            <see cref="T:System.Threading.ManualResetEventSlim"/>, and optionally releases the managed resources.
+            </summary>
+            <param name="disposing">true to release both managed and unmanaged resources;
+            false to release only unmanaged resources.</param>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.ManualResetEventSlim"/>, <see cref="M:System.Threading.ManualResetEventSlim.Dispose(System.Boolean)"/> is not
+            thread-safe and may not be used concurrently with other members of this instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.ThrowIfDisposed">
+            <summary>
+            Throw ObjectDisposedException if the MRES is disposed
+            </summary>
+        </member>
+        <member name="F:System.Threading.ManualResetEventSlim.s_cancellationTokenCallback">
+            <summary>
+            Private helper method to wake up waiters when a cancellationToken gets canceled.
+            </summary>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.UpdateStateAtomically(System.Int32,System.Int32)">
+            <summary>
+            Private helper method for updating parts of a bit-string state value.
+            Mainly called from the IsSet and Waiters properties setters
+            </summary>
+            <remarks>
+            Note: the parameter types must be int as CompareExchange cannot take a Uint
+            </remarks>
+            <param name="newBits">The new value</param>
+            <param name="updateBitsMask">The mask used to set the bits</param>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.ExtractStatePortionAndShiftRight(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Private helper method - performs Mask and shift, particular helpful to extract a field from a packed word.
+            eg ExtractStatePortionAndShiftRight(0x12345678, 0xFF000000, 24) => 0x12, ie extracting the top 8-bits as a simple integer 
+            
+            ?? is there a common place to put this rather than being private to MRES?
+            </summary>
+            <param name="state"></param>
+            <param name="mask"></param>
+            <param name="rightBitShiftCount"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.ExtractStatePortion(System.Int32,System.Int32)">
+            <summary>
+            Performs a Mask operation, but does not perform the shift.
+            This is acceptable for boolean values for which the shift is unnecessary
+            eg (val & Mask) != 0 is an appropriate way to extract a boolean rather than using
+            ((val & Mask) >> shiftAmount) == 1
+            
+            ?? is there a common place to put this rather than being private to MRES?
+            </summary>
+            <param name="state"></param>
+            <param name="mask"></param>
+        </member>
+        <member name="M:System.Threading.ManualResetEventSlim.UpdateTimeOut(System.Int64,System.Int32)">
+            <summary>
+            Helper function to measure and update the wait time
+            </summary>
+            <param name="startTimeTicks"> The first time (in Ticks) observed when the wait started.</param>
+            <param name="originalWaitMillisecondsTimeout">The orginal wait timeoutout in milliseconds.</param>
+            <returns>The new wait time in milliseconds, -1 if the time expired, -2 if overflow in counters
+            has occurred.</returns>
+        </member>
+        <member name="P:System.Threading.ManualResetEventSlim.WaitHandle">
+            <summary>
+            Gets the underlying <see cref="T:System.Threading.WaitHandle"/> object for this <see cref="T:System.Threading.ManualResetEventSlim"/>.
+            </summary>
+            <value>The underlying <see cref="T:System.Threading.WaitHandle"/> event object fore this <see cref="T:System.Threading.ManualResetEventSlim"/>.</value>
+            <remarks>
+            Accessing this property forces initialization of an underlying event object if one hasn't
+            already been created.  To simply wait on this <see cref="T:System.Threading.ManualResetEventSlim"/>, 
+            the public Wait methods should be preferred.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.ManualResetEventSlim.IsSet">
+            <summary>
+            Gets whether the event is set.
+            </summary>
+            <value>true if the event has is set; otherwise, false.</value>
+        </member>
+        <member name="P:System.Threading.ManualResetEventSlim.SpinCount">
+            <summary>
+            Gets the number of spin waits that will be occur before falling back to a true wait.
+            </summary>
+        </member>
+        <member name="P:System.Threading.ManualResetEventSlim.Waiters">
+            <summary>
+            How many threads are waiting.
+            </summary>
+        </member>
+        <member name="T:System.Threading.SpinWait">
+            <summary>
+            Provides support for spin-based waiting.
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.SpinWait"/> encapsulates common spinning logic. On single-processor machines, yields are
+            always used instead of busy waits, and on computers with Intel™ processors employing Hyper-Threading™
+            technology, it helps to prevent hardware thread starvation. SpinWait encapsulates a good mixture of
+            spinning and true yielding.
+            </para>
+            <para>
+            <see cref="T:System.Threading.SpinWait"/> is a value type, which means that low-level code can utilize SpinWait without
+            fear of unnecessary allocation overheads. SpinWait is not generally useful for ordinary applications.
+            In most cases, you should use the synchronization classes provided by the .NET Framework, such as
+            <see cref="T:System.Threading.Monitor"/>. For most purposes where spin waiting is required, however,
+            the <see cref="T:System.Threading.SpinWait"/> type should be preferred over the System.Threading.Thread.SpinWait method.
+            </para>
+            <para>
+            While SpinWait is designed to be used in concurrent applications, it is not designed to be
+            used from multiple threads concurrently.  SpinWait's members are not thread-safe.  If multiple
+            threads must spin, each should use its own instance of SpinWait.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.SpinWait.SpinOnce">
+            <summary>
+            Performs a single spin.
+            </summary>
+            <remarks>
+            This is typically called in a loop, and may change in behavior based on the number of times a
+            <see cref="M:System.Threading.SpinWait.SpinOnce"/> has been called thus far on this instance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.SpinWait.Reset">
+            <summary>
+            Resets the spin counter.
+            </summary>
+            <remarks>
+            This makes <see cref="M:System.Threading.SpinWait.SpinOnce"/> and <see cref="P:System.Threading.SpinWait.NextSpinWillYield"/> behave as though no calls
+            to <see cref="M:System.Threading.SpinWait.SpinOnce"/> had been issued on this instance. If a <see cref="T:System.Threading.SpinWait"/> instance
+            is reused many times, it may be useful to reset it to avoid yielding too soon.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean})">
+            <summary>
+            Spins until the specified condition is satisfied.
+            </summary>
+            <param name="condition">A delegate to be executed over and over until it returns true.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="condition"/> argument is null.</exception>
+        </member>
+        <member name="M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean},System.TimeSpan)">
+            <summary>
+            Spins until the specified condition is satisfied or until the specified timeout is expired.
+            </summary>
+            <param name="condition">A delegate to be executed over and over until it returns true.</param>
+            <param name="timeout">
+            A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds to wait, 
+            or a TimeSpan that represents -1 milliseconds to wait indefinitely.</param>
+            <returns>True if the condition is satisfied within the timeout; otherwise, false</returns>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="condition"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="timeout"/> is a negative number
+            other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater than
+            <see cref="F:System.Int32.MaxValue"/>.</exception>
+        </member>
+        <member name="M:System.Threading.SpinWait.SpinUntil(System.Func{System.Boolean},System.Int32)">
+            <summary>
+            Spins until the specified condition is satisfied or until the specified timeout is expired.
+            </summary>
+            <param name="condition">A delegate to be executed over and over until it returns true.</param>
+            <param name="millisecondsTimeout">The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to wait indefinitely.</param>
+            <returns>True if the condition is satisfied within the timeout; otherwise, false</returns>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="condition"/> argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException"><paramref name="millisecondsTimeout"/> is a
+            negative number other than -1, which represents an infinite time-out.</exception>
+        </member>
+        <member name="P:System.Threading.SpinWait.Count">
+            <summary>
+            Gets the number of times <see cref="M:System.Threading.SpinWait.SpinOnce"/> has been called on this instance.
+            </summary>
+        </member>
+        <member name="P:System.Threading.SpinWait.NextSpinWillYield">
+            <summary>
+            Gets whether the next call to <see cref="M:System.Threading.SpinWait.SpinOnce"/> will yield the processor, triggering a
+            forced context switch.
+            </summary>
+            <value>Whether the next call to <see cref="M:System.Threading.SpinWait.SpinOnce"/> will yield the processor, triggering a
+            forced context switch.</value>
+            <remarks>
+            On a single-CPU machine, <see cref="M:System.Threading.SpinWait.SpinOnce"/> always yields the processor. On machines with
+            multiple CPUs, <see cref="M:System.Threading.SpinWait.SpinOnce"/> may yield after an unspecified number of calls.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.PlatformHelper">
+            <summary>
+            A helper class to get the number of preocessors, it updates the numbers of processors every sampling interval
+            </summary>
+        </member>
+        <member name="P:System.Threading.PlatformHelper.ProcessorCount">
+            <summary>
+            Gets the number of available processors
+            </summary>
+        </member>
+        <member name="P:System.Threading.PlatformHelper.IsSingleProcessor">
+            <summary>
+            Gets whether the current machine has only a single processor.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.Task`1">
+            <summary>
+            Represents an asynchronous operation that produces a result at some time in the future.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by this <see cref="T:System.Threading.Tasks.Task`1"/>.
+            </typeparam>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.Tasks.Task`1"/> instances may be created in a variety of ways. The most common approach is by
+            using the task's <see cref="P:System.Threading.Tasks.Task`1.Factory"/> property to retrieve a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance that can be used to create tasks for several
+            purposes. For example, to create a <see cref="T:System.Threading.Tasks.Task`1"/> that runs a function, the factory's StartNew
+            method may be used:
+            <code>
+            // C# 
+            var t = Task<int>.Factory.StartNew(() => GenerateResult());
+            - or -
+            var t = Task.Factory.StartNew(() => GenerateResult());
+            
+            ' Visual Basic 
+            Dim t = Task<int>.Factory.StartNew(Function() GenerateResult())
+            - or -
+            Dim t = Task.Factory.StartNew(Function() GenerateResult())
+            </code>
+            </para>
+            <para>
+            The <see cref="T:System.Threading.Tasks.Task`1"/> class also provides constructors that initialize the task but that do not
+            schedule it for execution. For performance reasons, the StartNew method should be the
+            preferred mechanism for creating and scheduling computational tasks, but for scenarios where creation
+            and scheduling must be separated, the constructors may be used, and the task's 
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see>
+            method may then be used to schedule the task for execution at a later time.
+            </para>
+            <para>
+            All members of <see cref="T:System.Threading.Tasks.Task`1"/>, except for 
+            <see cref="M:System.Threading.Tasks.Task.Dispose">Dispose</see>, are thread-safe
+            and may be used from multiple threads concurrently.
+            </para>
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.Task">
+            <summary>
+            Represents an asynchronous operation.
+            </summary>
+            <remarks>
+            <para>
+            <see cref="T:System.Threading.Tasks.Task"/> instances may be created in a variety of ways. The most common approach is by
+            using the Task type's <see cref="P:System.Threading.Tasks.Task.Factory"/> property to retrieve a <see cref="T:System.Threading.Tasks.TaskFactory"/> instance that can be used to create tasks for several
+            purposes. For example, to create a <see cref="T:System.Threading.Tasks.Task"/> that runs an action, the factory's StartNew
+            method may be used:
+            <code>
+            // C# 
+            var t = Task.Factory.StartNew(() => DoAction());
+            
+            ' Visual Basic 
+            Dim t = Task.Factory.StartNew(Function() DoAction())
+            </code>
+            </para>
+            <para>
+            The <see cref="T:System.Threading.Tasks.Task"/> class also provides constructors that initialize the Task but that do not
+            schedule it for execution. For performance reasons, TaskFactory's StartNew method should be the
+            preferred mechanism for creating and scheduling computational tasks, but for scenarios where creation
+            and scheduling must be separated, the constructors may be used, and the task's <see cref="M:System.Threading.Tasks.Task.Start"/>
+            method may then be used to schedule the task for execution at a later time.
+            </para>
+            <para>
+            All members of <see cref="T:System.Threading.Tasks.Task"/>, except for <see cref="M:System.Threading.Tasks.Task.Dispose"/>, are thread-safe
+            and may be used from multiple threads concurrently.
+            </para>
+            <para>
+            For operations that return values, the <see cref="T:System.Threading.Tasks.Task`1"/> class
+            should be used.
+            </para>
+            <para>
+            For developers implementing custom debuggers, several internal and private members of Task may be
+            useful (these may change from release to release). The Int32 m_taskId field serves as the backing
+            store for the <see cref="P:System.Threading.Tasks.Task.Id"/> property, however accessing this field directly from a debugger may be
+            more efficient than accessing the same value through the property's getter method (the
+            s_taskIdCounter Int32 counter is used to retrieve the next available ID for a Task). Similarly, the
+            Int32 m_stateFlags field stores information about the current lifecycle stage of the Task,
+            information also accessible through the <see cref="P:System.Threading.Tasks.Task.Status"/> property. The m_action System.Object
+            field stores a reference to the Task's delegate, and the m_stateObject System.Object field stores the
+            async state passed to the Task by the developer. Finally, for debuggers that parse stack frames, the
+            InternalWait method serves a potential marker for when a Task is entering a wait operation.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#cctor">
+            <summary>
+            A type initializer that runs with the appropriate permissions.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the Task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="action"/> argument is null.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action,System.Threading.CancellationToken)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action and <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the Task.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            that will be assigned to the new Task.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="action"/> argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action and creation options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the Task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action and creation options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the Task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action{System.Object},System.Object)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action and state.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action{System.Object},System.Object,System.Threading.CancellationToken)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action, state, snd options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new task.</param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action{System.Object},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action, state, snd options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the Task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Action{System.Object},System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task"/> with the specified action, state, snd options.
+            </summary>
+            <param name="action">The delegate that represents the code to execute in the task.</param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the Task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="action"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.#ctor(System.Object,System.Object,System.Threading.Tasks.Task,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            An internal constructor used by the factory methods on task and its descendent(s).
+            This variant does not capture the ExecutionContext; it is up to the caller to do that.
+            </summary>
+            <param name="action">An action to execute.</param>
+            <param name="state">Optional state to pass to the action.</param>
+            <param name="parent">Parent of Task.</param>
+            <param name="cancellationToken">A CancellationToken for the task.</param>
+            <param name="scheduler">A task scheduler under which the task will run.</param>
+            <param name="creationOptions">Options to control its execution.</param>
+            <param name="internalOptions">Internal options to control its execution</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.TaskConstructorCore(System.Object,System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Common logic used by the following internal ctors:
+                Task()
+                Task(object action, object state, Task parent, TaskCreationOptions options, TaskScheduler taskScheduler)
+            
+            ASSUMES THAT m_creatingTask IS ALREADY SET.
+            
+            </summary>
+            <param name="action">Action for task to execute.</param>
+            <param name="state">Object to which to pass to action (may be null)</param>
+            <param name="scheduler">Task scheduler on which to run thread (only used by continuation tasks).</param>
+            <param name="cancellationToken">A CancellationToken for the Task.</param>
+            <param name="creationOptions">Options to customize behavior of Task.</param>
+            <param name="internalOptions">Internal options to customize behavior of Task.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.DeregisterCancellationCallback">
+            <summary>
+            Checks if we registered a CT callback during construction, and deregisters it. 
+            This should be called when we know the registration isn't useful anymore. Specifically from Finish() if the task has completed
+            successfully or with an exception.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.PossiblyCaptureContext(System.Threading.StackCrawlMark@)">
+            <summary>
+            Captures the ExecutionContext so long as flow isn't suppressed.
+            </summary>
+            <param name="stackMark">A stack crawl mark pointing to the frame of the caller.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.AddNewChild">
+            <summary>
+            Internal function that will be called by a new child task to add itself to 
+            the children list of the parent (this).
+            
+            Since a child task can only be created from the thread executing the action delegate
+            of this task, reentrancy is neither required nor supported. This should not be called from
+            anywhere other than the task construction/initialization codepaths.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Start">
+            <summary>
+            Starts the <see cref="T:System.Threading.Tasks.Task"/>, scheduling it for execution to the current <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>.
+            </summary>
+            <remarks>
+            A task may only be started and run only once.  Any attempts to schedule a task a second time
+            will result in an exception.
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">
+            The <see cref="T:System.Threading.Tasks.Task"/> is not in a valid state to be started. It may have already been started,
+            executed, or canceled, or it may have been created in a manner that doesn't support direct
+            scheduling.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> instance has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Start(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Starts the <see cref="T:System.Threading.Tasks.Task"/>, scheduling it for execution to the specified <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>.
+            </summary>
+            <remarks>
+            A task may only be started and run only once. Any attempts to schedule a task a second time will
+            result in an exception.
+            </remarks>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> with which to associate
+            and execute this task.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.InvalidOperationException">
+            The <see cref="T:System.Threading.Tasks.Task"/> is not in a valid state to be started. It may have already been started,
+            executed, or canceled, or it may have been created in a manner that doesn't support direct
+            scheduling.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> instance has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.RunSynchronously">
+            <summary>
+            Runs the <see cref="T:System.Threading.Tasks.Task"/> synchronously on the current <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>.
+            </summary>
+            <remarks>
+            <para>
+            A task may only be started and run only once. Any attempts to schedule a task a second time will
+            result in an exception.
+            </para>
+            <para>
+            Tasks executed with <see cref="M:System.Threading.Tasks.Task.RunSynchronously"/> will be associated with the current <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see>.
+            </para>
+            <para>
+            If the target scheduler does not support running this Task on the current thread, the Task will
+            be scheduled for execution on the scheduler, and the current thread will block until the
+            Task has completed execution.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">
+            The <see cref="T:System.Threading.Tasks.Task"/> is not in a valid state to be started. It may have already been started,
+            executed, or canceled, or it may have been created in a manner that doesn't support direct
+            scheduling.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> instance has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.RunSynchronously(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Runs the <see cref="T:System.Threading.Tasks.Task"/> synchronously on the <see cref="T:System.Threading.Tasks.TaskScheduler">scheduler</see> provided.
+            </summary>
+            <remarks>
+            <para>
+            A task may only be started and run only once. Any attempts to schedule a task a second time will
+            result in an exception.
+            </para>
+            <para>
+            If the target scheduler does not support running this Task on the current thread, the Task will
+            be scheduled for execution on the scheduler, and the current thread will block until the
+            Task has completed execution.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">
+            The <see cref="T:System.Threading.Tasks.Task"/> is not in a valid state to be started. It may have already been started,
+            executed, or canceled, or it may have been created in a manner that doesn't support direct
+            scheduling.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> instance has been disposed.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="scheduler"/> parameter
+            is null.</exception>
+            <param name="scheduler">The scheduler on which to attempt to run this task inline.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ThrowIfDisposed">
+            <summary>
+            Throws an exception if the task has been disposed, and hence can no longer be accessed.
+            </summary>
+            <exception cref="T:System.ObjectDisposedException">The task has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.SetCompleted">
+            <summary>
+            Sets the internal completion event.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Dispose">
+            <summary>
+            Disposes the <see cref="T:System.Threading.Tasks.Task"/>, releasing all of its unmanaged resources.  
+            </summary>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.Tasks.Task"/>, this method is not thread-safe.
+            Also, <see cref="M:System.Threading.Tasks.Task.Dispose"/> may only be called on a <see cref="T:System.Threading.Tasks.Task"/> that is in one of
+            the final states: <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>,
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">
+            The exception that is thrown if the <see cref="T:System.Threading.Tasks.Task"/> is not in 
+            one of the final states: <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>,
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </exception>       
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Dispose(System.Boolean)">
+            <summary>
+            Disposes the <see cref="T:System.Threading.Tasks.Task"/>, releasing all of its unmanaged resources.  
+            </summary>
+            <param name="disposing">
+            A Boolean value that indicates whether this method is being called due to a call to <see cref="M:System.Threading.Tasks.Task.Dispose"/>.
+            </param>
+            <remarks>
+            Unlike most of the members of <see cref="T:System.Threading.Tasks.Task"/>, this method is not thread-safe.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ScheduleAndStart(System.Boolean)">
+            <summary>
+            Schedules the task for execution.
+            </summary>
+            <param name="needsProtection">If true, TASK_STATE_STARTED bit is turned on in
+            an atomic fashion, making sure that TASK_STATE_CANCELED does not get set
+            underneath us.  If false, TASK_STATE_STARTED bit is OR-ed right in.  This
+            allows us to streamline things a bit for StartNew(), where competing cancellations
+            are not a problem.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.AddException(System.Object)">
+            <summary>
+            Adds an exception to the list of exceptions this task has thrown.
+            </summary>
+            <param name="exceptionObject">An object representing either an Exception or a collection of Exceptions.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.GetExceptions(System.Boolean)">
+            <summary>
+            Returns a list of exceptions by aggregating the holder's contents. Or null if
+            no exceptions have been thrown.
+            </summary>
+            <param name="includeTaskCanceledExceptions">Whether to include a TCE if cancelled.</param>
+            <returns>An aggregate exception, or null if no exceptions have been caught.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ThrowIfExceptional(System.Boolean)">
+            <summary>
+            Throws an aggregate exception if the task contains exceptions. 
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.UpdateExceptionObservedStatus">
+            <summary>
+            Checks whether this is an attached task, and whether we are being called by the parent task.
+            And sets the TASK_STATE_EXCEPTIONOBSERVEDBYPARENT status flag based on that.
+            
+            This is meant to be used internally when throwing an exception, and when WaitAll is gathering 
+            exceptions for tasks it waited on. If this flag gets set, the implicit wait on children 
+            will skip exceptions to prevent duplication.
+            
+            This should only be called when this task has completed with an exception
+            
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Finish(System.Boolean)">
+             <summary>
+             Signals completion of this particular task.
+            
+             The bUserDelegateExecuted parameter indicates whether this Finish() call comes following the
+             full execution of the user delegate. 
+             
+             If bUserDelegateExecuted is false, it mean user delegate wasn't invoked at all (either due to
+             a cancellation request, or because this task is a promise style Task). In this case, the steps
+             involving child tasks (i.e. WaitForChildren) will be skipped.
+             
+             </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FinishStageTwo">
+            <summary>
+            FinishStageTwo is to be executed as soon as we known there are no more children to complete. 
+            It can happen i) either on the thread that originally executed this task (if no children were spawned, or they all completed by the time this task's delegate quit)
+                         ii) or on the thread that executed the last child.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FinishStageThree">
+            <summary>
+            Final stage of the task completion code path. Notifies the parent (if any) that another of its childre are done, and runs continuations.
+            This function is only separated out from FinishStageTwo because these two operations are also needed to be called from CancellationCleanupLogic()
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ProcessChildCompletion(System.Threading.Tasks.Task)">
+            <summary>
+            This is called by children of this task when they are completed.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.AddExceptionsFromChildren">
+            <summary>
+            This is to be called just before the task does its final state transition. 
+            It traverses the list of exceptional children, and appends their aggregate exceptions into this one's exception list
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FinishThreadAbortedTask(System.Boolean,System.Boolean)">
+            <summary>
+            Special purpose Finish() entry point to be used when the task delegate throws a ThreadAbortedException
+            This makes a note in the state flags so that we avoid any costly synchronous operations in the finish codepath
+            such as inlined continuations
+            </summary>
+            <param name="bTAEAddedToExceptionHolder">
+            Indicates whether the ThreadAbortException was added to this task's exception holder. 
+            This should always be true except for the case of non-root self replicating task copies.
+            </param>
+            <param name="delegateRan">Whether the delegate was executed.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Execute">
+            <summary>
+            Executes the task. This method will only be called once, and handles bookeeping associated with
+            self-replicating tasks, in addition to performing necessary exception marshaling.
+            </summary>
+            <exception cref="T:System.ObjectDisposedException">The task has already been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.System#Threading#Tasks#IThreadPoolWorkItem#ExecuteWorkItem">
+            <summary>
+            IThreadPoolWorkItem override, which is the entry function for this task when the TP scheduler decides to run it.
+            
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ExecuteEntry(System.Boolean)">
+            <summary>
+            Outermost entry function to execute this task. Handles all aspects of executing a task on the caller thread.
+            Currently this is called by IThreadPoolWorkItem.ExecuteWorkItem(), and TaskManager.TryExecuteInline. 
+            
+            </summary>
+            <param name="bPreventDoubleExecution"> Performs atomic updates to prevent double execution. Should only be set to true
+            in codepaths servicing user provided TaskSchedulers. The ConcRT or ThreadPool schedulers don't need this. </param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.InnerInvoke">
+            <summary>
+            The actual code which invokes the body of the task. This can be overriden in derived types.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.InnerInvokeWithArg(System.Threading.Tasks.Task)">
+            <summary>
+            Alternate InnerInvoke prototype to be called from ExecuteSelfReplicating() so that
+            the Parallel Debugger can discover the actual task being invoked. 
+            Details: Here, InnerInvoke is actually being called on the rootTask object while we are actually executing the
+            childTask. And the debugger needs to discover the childTask, so we pass that down as an argument.
+            The NoOptimization and NoInlining flags ensure that the childTask pointer is retained, and that this
+            function appears on the callstack.
+            </summary>
+            <param name="childTask"></param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.HandleException(System.Exception)">
+            <summary>
+            Performs whatever handling is necessary for an unhandled exception. Normally
+            this just entails adding the exception to the holder object. 
+            </summary>
+            <param name="unhandledException">The exception that went unhandled.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during
+            the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait(System.TimeSpan)">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <param name="timeout">
+            A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <returns>
+            true if the <see cref="T:System.Threading.Tasks.Task"/> completed execution within the allotted time; otherwise, false.
+            </returns>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="timeout"/> is a negative number other than -1 milliseconds, which represents an
+            infinite time-out -or- timeout is greater than
+            <see cref="F:System.Int32.MaxValue"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait(System.Threading.CancellationToken)">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for the task to complete.
+            </param>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/>
+            has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait(System.Int32)">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.</param>
+            <returns>true if the <see cref="T:System.Threading.Tasks.Task"/> completed execution within the allotted time; otherwise,
+            false.
+            </returns>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/>
+            has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.Wait(System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Waits for the <see cref="T:System.Threading.Tasks.Task"/> to complete execution.
+            </summary>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for the task to complete.
+            </param>
+            <returns>
+            true if the <see cref="T:System.Threading.Tasks.Task"/> completed execution within the allotted time; otherwise, false.
+            </returns>
+            <exception cref="T:System.AggregateException">
+            The <see cref="T:System.Threading.Tasks.Task"/> was canceled -or- an exception was thrown during the execution of the <see cref="T:System.Threading.Tasks.Task"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/>
+            has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.InternalWait(System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            The core wait function, which is only accesible internally. It's meant to be used in places in TPL code where 
+            the current context is known or cached.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.InternalCancel(System.Boolean)">
+            <summary>
+            Cancels the <see cref="T:System.Threading.Tasks.Task"/>.
+            </summary>
+            <param name="bCancelNonExecutingOnly"> Indiactes whether we should only cancel non-invoked tasks.
+            For the default scheduler this option will only be serviced through TryDequeue.
+            For custom schedulers we also attempt an atomic state transition.</param>
+            <returns>true if the task was successfully canceled; otherwise, false.</returns>
+            <exception cref="T:System.ObjectDisposedException">The <see cref="T:System.Threading.Tasks.Task"/>
+            has been disposed.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.SetCancellationAcknowledged">
+            <summary>
+            Sets the task's cancellation acknowledged flag.
+            </summary>    
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FinishContinuations">
+            <summary>
+            Runs all of the continuations, as appropriate.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWithIsRightKind(System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Helper function to determine whether the current task is in the state desired by the
+            continuation kind under evaluation. Three possibilities exist: the task failed with
+            an unhandled exception (OnFailed), the task was canceled before running (OnAborted),
+            or the task completed successfully (OnCompletedSuccessfully).  Note that the last
+            one includes completing due to cancellation.
+            </summary>
+            <param name="options">The continuation options under evaluation.</param>
+            <returns>True if the continuation should be run given the task's current state.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task})">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken"> The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task},System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes.  When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed. If the continuation criteria specified through the <paramref name="continuationOptions"/> parameter are not met, the continuation task will be canceled
+            instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith(System.Action{System.Threading.Tasks.Task},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its
+            execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed. If the criteria specified through the <paramref name="continuationOptions"/> parameter
+            are not met, the continuation task will be canceled instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0})">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0},System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes.  When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed. If the continuation criteria specified through the <paramref name="continuationOptions"/> parameter are not met, the continuation task will be canceled
+            instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWith``1(System.Func{System.Threading.Tasks.Task,``0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task"/> completes.
+            </summary>
+            <typeparam name="TResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its
+            execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed. If the criteria specified through the <paramref name="continuationOptions"/> parameter
+            are not met, the continuation task will be canceled instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.CreationOptionsFromContinuationOptions(System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskCreationOptions@,System.Threading.Tasks.InternalTaskOptions@)">
+            <summary>
+            Converts TaskContinuationOptions to TaskCreationOptions, and also does
+            some validity checking along the way.
+            </summary>
+            <param name="continuationOptions">Incoming TaskContinuationOptions</param>
+            <param name="creationOptions">Outgoing TaskCreationOptions</param>
+            <param name="internalOptions">Outgoing InternalTaskOptions</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.ContinueWithCore(System.Threading.Tasks.Task,System.Threading.Tasks.TaskScheduler,System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Registers the continuation and possibly runs it (if the task is already finished).
+            </summary>
+            <param name="continuationTask">The continuation task itself.</param>
+            <param name="scheduler">TaskScheduler with which to associate continuation task.</param>
+            <param name="options">Restrictions on when the continuation becomes active.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[])">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.TimeSpan)">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <returns>
+            true if all of the <see cref="T:System.Threading.Tasks.Task"/> instances completed execution within the allotted time;
+            otherwise, false.
+            </returns>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="timeout">
+            A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="timeout"/> is a negative number other than -1 milliseconds, which represents an
+            infinite time-out -or- timeout is greater than
+            <see cref="F:System.Int32.MaxValue"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.Int32)">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <returns>
+            true if all of the <see cref="T:System.Threading.Tasks.Task"/> instances completed execution within the allotted time;
+            otherwise, false.
+            </returns>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.</param>
+            <param name="tasks">An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.Threading.CancellationToken)">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <returns>
+            true if all of the <see cref="T:System.Threading.Tasks.Task"/> instances completed execution within the allotted time;
+            otherwise, false.
+            </returns>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for the tasks to complete.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Waits for all of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <returns>
+            true if all of the <see cref="T:System.Threading.Tasks.Task"/> instances completed execution within the allotted time;
+            otherwise, false.
+            </returns>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for the tasks to complete.
+            </param>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.AggregateException">
+            At least one of the <see cref="T:System.Threading.Tasks.Task"/> instances was canceled -or- an exception was thrown during
+            the execution of at least one of the <see cref="T:System.Threading.Tasks.Task"/> instances.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAllSTAAnd64Aware(System.Threading.WaitHandle[],System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Waits for a set of handles in a STA-aware way.  In other words, it will wait for each
+            of the events individually if we're on a STA thread, because MsgWaitForMultipleObjectsEx
+            can't do a true wait-all due to its hidden message queue event. This is not atomic,
+            of course, but we only wait on one-way (MRE) events anyway so this is OK.
+            </summary>
+            <param name="waitHandles">An array of wait handles to wait on.</param>
+            <param name="millisecondsTimeout">The timeout to use during waits.</param>
+            <param name="cancellationToken">The cancellationToken that enables a wait to be canceled.</param>
+            <returns>True if all waits succeeded, false if a timeout occurred.</returns>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.FastWaitAll(System.Threading.Tasks.Task[])">
+            <summary>
+            Internal WaitAll implementation which is meant to be used with small number of tasks,
+            optimized for Parallel.Invoke and other structured primitives.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.AddExceptionsForCompletedTask(System.Collections.Generic.List{System.Exception}@,System.Threading.Tasks.Task)">
+            <summary>
+            This internal function is only meant to be called by WaitAll()
+            If the completed task is canceled or it has other exceptions, here we will add those
+            into the passed in exception list (which will be lazily initialized here).
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[])">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <returns>The index of the completed task in the <paramref name="tasks"/> array argument.</returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[],System.TimeSpan)">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="timeout">
+            A <see cref="T:System.TimeSpan"/> that represents the number of milliseconds to wait, or a <see cref="T:System.TimeSpan"/> that represents -1 milliseconds to wait indefinitely.
+            </param>
+            <returns>
+            The index of the completed task in the <paramref name="tasks"/> array argument, or -1 if the
+            timeout occurred.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="timeout"/> is a negative number other than -1 milliseconds, which represents an
+            infinite time-out -or- timeout is greater than
+            <see cref="F:System.Int32.MaxValue"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[],System.Threading.CancellationToken)">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for a task to complete.
+            </param>
+            <returns>
+            The index of the completed task in the <paramref name="tasks"/> array argument.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[],System.Int32)">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.
+            </param>
+            <returns>
+            The index of the completed task in the <paramref name="tasks"/> array argument, or -1 if the
+            timeout occurred.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.WaitAny(System.Threading.Tasks.Task[],System.Int32,System.Threading.CancellationToken)">
+            <summary>
+            Waits for any of the provided <see cref="T:System.Threading.Tasks.Task"/> objects to complete execution.
+            </summary>
+            <param name="tasks">
+            An array of <see cref="T:System.Threading.Tasks.Task"/> instances on which to wait.
+            </param>
+            <param name="millisecondsTimeout">
+            The number of milliseconds to wait, or <see cref="F:System.Threading.Timeout.Infinite"/> (-1) to
+            wait indefinitely.
+            </param>
+            <param name="cancellationToken">
+            A <see cref="P:System.Threading.Tasks.Task.CancellationToken"/> to observe while waiting for a task to complete.
+            </param>
+            <returns>
+            The index of the completed task in the <paramref name="tasks"/> array argument, or -1 if the
+            timeout occurred.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="tasks"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="tasks"/> argument contains a null element.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            <paramref name="millisecondsTimeout"/> is a negative number other than -1, which represents an
+            infinite time-out.
+            </exception>
+            <exception cref="T:System.OperationCanceledException2">
+            The <paramref name="cancellationToken"/> was canceled.
+            </exception>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.Id">
+            <summary>
+            Gets a unique ID for this <see cref="T:System.Threading.Tasks.Task">Task</see> instance.
+            </summary>
+            <remarks>
+            Task IDs are assigned on-demand and do not necessarily represent the order in the which Task
+            instances were created.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.CurrentId">
+            <summary>
+            Returns the unique ID of the currently executing <see cref="T:System.Threading.Tasks.Task">Task</see>.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.InternalCurrent">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.Task">Task</see> instance currently executing, or
+            null if none exists.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.Exception">
+            <summary>
+            Gets the <see cref="T:System.AggregateException">Exception</see> that caused the <see cref="T:System.Threading.Tasks.Task">Task</see> to end prematurely. If the <see cref="T:System.Threading.Tasks.Task">Task</see> completed successfully or has not yet thrown any
+            exceptions, this will return null.
+            </summary>
+            <remarks>
+            Tasks that throw unhandled exceptions store the resulting exception and propagate it wrapped in a
+            <see cref="T:System.AggregateException"/> in calls to <see cref="M:System.Threading.Tasks.Task.Wait">Wait</see>
+            or in accesses to the <see cref="P:System.Threading.Tasks.Task.Exception"/> property.  Any exceptions not observed by the time
+            the Task instance is garbage collected will be propagated on the finalizer thread.
+            </remarks>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task">Task</see>
+            has been disposed.
+            </exception>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.Status">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskStatus">TaskStatus</see> of this Task. 
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsCanceled">
+            <summary>
+            Gets whether this <see cref="T:System.Threading.Tasks.Task">Task</see> instance has completed
+            execution due to being canceled.
+            </summary>
+            <remarks>
+            A <see cref="T:System.Threading.Tasks.Task">Task</see> will complete in Canceled state either if its <see cref="P:System.Threading.Tasks.Task.CancellationToken">CancellationToken</see> 
+            was marked for cancellation before the task started executing, or if the task acknowledged the cancellation request on 
+            its already signaled CancellationToken by throwing an 
+            <see cref="T:System.OperationCanceledException">OperationCanceledException2</see> that bears the same 
+            <see cref="T:System.Threading.CancellationToken">CancellationToken</see>.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsCancellationRequested">
+            <summary>
+            Returns true if this task has a cancellation token and it was signaled.
+            To be used internally in execute entry codepaths.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.CancellationToken">
+            <summary>
+            This internal property provides access to the CancellationToken that was set on the task 
+            when it was constructed.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsCancellationAcknowledged">
+            <summary>
+            Gets whether this <see cref="T:System.Threading.Tasks.Task"/> threw an OperationCanceledException2 while its CancellationToken was signaled.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsCompleted">
+            <summary>
+            Gets whether this <see cref="T:System.Threading.Tasks.Task">Task</see> has completed.
+            </summary>
+            <remarks>
+            <see cref="P:System.Threading.Tasks.Task.IsCompleted"/> will return true when the Task is in one of the three
+            final states: <see cref="F:System.Threading.Tasks.TaskStatus.RanToCompletion">RanToCompletion</see>,
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">Faulted</see>, or
+            <see cref="F:System.Threading.Tasks.TaskStatus.Canceled">Canceled</see>.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsDisposed">
+            <summary>
+            Checks whether this task has been disposed.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.CreationOptions">
+            <summary>
+            Gets the <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used
+            to create this task.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.System#IAsyncResult#AsyncWaitHandle">
+            <summary>
+            Gets a <see cref="T:System.Threading.WaitHandle"/> that can be used to wait for the task to
+            complete.
+            </summary>
+            <remarks>
+            Using the wait functionality provided by <see cref="M:System.Threading.Tasks.Task.Wait"/>
+            should be preferred over using <see cref="P:System.IAsyncResult.AsyncWaitHandle"/> for similar
+            functionality.
+            </remarks>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task"/> has been disposed.
+            </exception>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.AsyncState">
+            <summary>
+            Gets the state object supplied when the <see cref="T:System.Threading.Tasks.Task">Task</see> was created,
+            or null if none was supplied.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.System#IAsyncResult#CompletedSynchronously">
+            <summary>
+            Gets an indication of whether the asynchronous operation completed synchronously.
+            </summary>
+            <value>true if the asynchronous operation completed synchronously; otherwise, false.</value>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.ExecutingTaskScheduler">
+            <summary>
+            Provides access to the TaskScheduler responsible for executing this Task.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.Factory">
+            <summary>
+            Provides access to factory methods for creating <see cref="T:System.Threading.Tasks.Task"/> and <see cref="T:System.Threading.Tasks.Task`1"/> instances.
+            </summary>
+            <remarks>
+            The factory returned from <see cref="P:System.Threading.Tasks.Task.Factory"/> is a default instance
+            of <see cref="T:System.Threading.Tasks.TaskFactory"/>, as would result from using
+            the default constructor on TaskFactory.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.CompletedEvent">
+            <summary>
+            Provides an event that can be used to wait for completion.
+            Only called by Wait*(), which means that we really do need to instantiate a completion event.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsSelfReplicatingRoot">
+            <summary>
+            Determines whether this is the root task of a self replicating group.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsChildReplica">
+            <summary>
+            Determines whether the task is a replica itself.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.ExceptionRecorded">
+            <summary>
+            The property formerly known as IsFaulted.
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsFaulted">
+            <summary>
+            Gets whether the <see cref="T:System.Threading.Tasks.Task"/> completed due to an unhandled exception.
+            </summary>
+            <remarks>
+            If <see cref="P:System.Threading.Tasks.Task.IsFaulted"/> is true, the Task's <see cref="P:System.Threading.Tasks.Task.Status"/> will be equal to
+            <see cref="F:System.Threading.Tasks.TaskStatus.Faulted">TaskStatus.Faulted</see>, and its
+            <see cref="P:System.Threading.Tasks.Task.Exception"/> property will be non-null.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsExceptionObservedByParent">
+            <summary>
+            Checks whether the TASK_STATE_EXCEPTIONOBSERVEDBYPARENT status flag is set,
+            This will only be used by the implicit wait to prevent double throws
+            
+            </summary>
+        </member>
+        <member name="P:System.Threading.Tasks.Task.IsDelegateInvoked">
+            <summary>
+            Checks whether the body was ever invoked. Used by task scheduler code to verify custom schedulers actually ran the task.
+            </summary>
+        </member>
+        <member name="T:System.Threading.Tasks.Task.TaskContinuation">
+            <summary>
+            A structure to hold continuation information.
+            </summary>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.TaskContinuation.#ctor(System.Threading.Tasks.Task,System.Threading.Tasks.TaskScheduler,System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Constructs a new continuation structure.
+            </summary>
+            <param name="task">The task to be activated.</param>
+            <param name="options">The continuation options.</param>
+            <param name="scheduler">The scheduler to use for the continuation.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task.TaskContinuation.Run(System.Threading.Tasks.Task,System.Boolean)">
+            <summary>
+            Invokes the continuation for the target completion task.
+            </summary>
+            <param name="completedTask">The completed task.</param>
+            <param name="bCanInlineContinuationTask">Whether the continuation can be inlined.</param>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0})">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0},System.Threading.CancellationToken)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to be assigned to this task.</param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0},System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function and creation options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0},System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function and creation options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified function and state.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="state">An object representing data to be used by the action.</param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object,System.Threading.CancellationToken)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified action, state, and options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="state">An object representing data to be used by the function.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to be assigned to the new task.</param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified action, state, and options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="state">An object representing data to be used by the function.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Initializes a new <see cref="T:System.Threading.Tasks.Task`1"/> with the specified action, state, and options.
+            </summary>
+            <param name="function">
+            The delegate that represents the code to execute in the task. When the function has completed,
+            the task's <see cref="P:System.Threading.Tasks.Task`1.Result"/> property will be set to return the result value of the function.
+            </param>
+            <param name="state">An object representing data to be used by the function.</param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to be assigned to the new task.</param>
+            <param name="creationOptions">
+            The <see cref="T:System.Threading.Tasks.TaskCreationOptions">TaskCreationOptions</see> used to
+            customize the task's behavior.
+            </param>
+            <exception cref="T:System.ArgumentException">
+            The <paramref name="function"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="creationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskCreationOptions"/>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{`0},System.Threading.Tasks.Task,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a new future object.
+            </summary>
+            <param name="parent">The parent task for this future.</param>
+            <param name="valueSelector">A function that yields the future value.</param>
+            <param name="scheduler">The task scheduler which will be used to execute the future.</param>
+            <param name="cancellationToken">The CancellationToken for the task.</param>
+            <param name="creationOptions">Options to control the future's behavior.</param>
+            <param name="internalOptions">Internal options to control the future's behavior.</param>
+            <exception cref="T:ArgumentOutOfRangeException">The <paramref name="creationOptions"/> argument specifies
+            a SelfReplicating <see cref="T:System.Threading.Tasks.Task`1"/>, which is illegal."/>.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.#ctor(System.Func{System.Object,`0},System.Object,System.Threading.Tasks.Task,System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.InternalTaskOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a new future object.
+            </summary>
+            <param name="parent">The parent task for this future.</param>
+            <param name="state">An object containing data to be used by the action; may be null.</param>
+            <param name="valueSelector">A function that yields the future value.</param>
+            <param name="cancellationToken">The CancellationToken for the task.</param>
+            <param name="scheduler">The task scheduler which will be used to execute the future.</param>
+            <param name="creationOptions">Options to control the future's behavior.</param>
+            <param name="internalOptions">Internal options to control the future's behavior.</param>
+            <exception cref="T:ArgumentOutOfRangeException">The <paramref name="creationOptions"/> argument specifies
+            a SelfReplicating <see cref="T:System.Threading.Tasks.Task`1"/>, which is illegal."/>.</exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.InvokeFuture(System.Object)">
+            <summary>
+            Evaluates the value selector of the Task which is passed in as an object and stores the result.
+            </summary>        
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}})">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}},System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed. If the continuation criteria specified through the <paramref name="continuationOptions"/> parameter are not met, the continuation task will be canceled
+            instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith(System.Action{System.Threading.Tasks.Task{`0}},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <param name="continuationAction">
+            An action to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new continuation task.</param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its
+            execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task"/> will not be scheduled for execution until the current task has
+            completed. If the criteria specified through the <paramref name="continuationOptions"/> parameter
+            are not met, the continuation task will be canceled instead of scheduled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationAction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0})">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current
+            task has completed, whether it completes due to running to completion successfully, faulting due
+            to an unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0},System.Threading.CancellationToken)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new task.</param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current
+            task has completed, whether it completes due to running to completion successfully, faulting due
+            to an unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0},System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes.  When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0},System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be
+            passed the completed task as an argument.
+            </param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            <para>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current
+            task has completed, whether it completes due to running to completion successfully, faulting due
+            to an unhandled exception, or exiting out early due to being canceled.
+            </para>
+            <para>
+            The <paramref name="continuationFunction"/>, when executed, should return a <see cref="T:System.Threading.Tasks.Task`1"/>. This task's completion state will be transferred to the task returned
+            from the ContinueWith call.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+        </member>
+        <member name="M:System.Threading.Tasks.Task`1.ContinueWith``1(System.Func{System.Threading.Tasks.Task{`0},``0},System.Threading.CancellationToken,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates a continuation that executes when the target <see cref="T:System.Threading.Tasks.Task`1"/> completes.
+            </summary>
+            <typeparam name="TNewResult">
+            The type of the result produced by the continuation.
+            </typeparam>
+            <param name="continuationFunction">
+            A function to run when the <see cref="T:System.Threading.Tasks.Task`1"/> completes. When run, the delegate will be passed as
+            an argument this completed task.
+            </param>
+            <param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> that will be assigned to the new task.</param>
+            <param name="continuationOptions">
+            Options for when the continuation is scheduled and how it behaves. This includes criteria, such
+            as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled">OnlyOnCanceled</see>, as
+            well as execution options, such as <see cref="F:System.Threading.Tasks.TaskContinuationOptions.ExecuteSynchronously">ExecuteSynchronously</see>.
+            </param>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler"/> to associate with the continuation task and to use for its
+            execution.
+            </param>
+            <returns>A new continuation <see cref="T:System.Threading.Tasks.Task`1"/>.</returns>
+            <remarks>
+            <para>
+            The returned <see cref="T:System.Threading.Tasks.Task`1"/> will not be scheduled for execution until the current task has
+            completed, whether it completes due to running to completion successfully, faulting due to an
+            unhandled exception, or exiting out early due to being canceled.
+            </para>
+            <para>
+            The <paramref name="continuationFunction"/>, when executed, should return a <see cref="T:System.Threading.Tasks.Task`1"/>.
+            This task's completion state will be transferred to the task returned from the
+            ContinueWith call.
+            </para>
+            </remarks>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="continuationFunction"/> argument is null.
+            </exception>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The <paramref name="continuationOptions"/> argument specifies an invalid value for <see cref="T:System.Threading.Tasks.TaskContinuationOptions">TaskContinuationOptions</see>.
+            </exception>
+            <exception cref="T:System.ArgumentNullException">
+            The <paramref name="scheduler"/> argument is null.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">
+            The <see cref="T:System.Threading.Tasks.Task`1"/> has been disposed.
+            </exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+        </member>
+        <member name="P:System.Threading.Tasks.Task`1.Result">
+            <summary>
+            Gets the result value of this <see cref="T:System.Threading.Tasks.Task`1"/>.
+            </summary>
+            <remarks>
+            The get accessor for this property ensures that the asynchronous operation is complete before
+            returning. Once the result of the computation is available, it is stored and will be returned
+            immediately on later calls to <see cref="P:System.Threading.Tasks.Task`1.Result"/>.
+            </remarks>
+        </member>
+        <member name="P:System.Threading.Tasks.Task`1.Factory">
+            <summary>
+            Provides access to factory methods for creating <see cref="T:System.Threading.Tasks.Task`1"/> instances.
+            </summary>
+            <remarks>
+            The factory returned from <see cref="P:System.Threading.Tasks.Task`1.Factory"/> is a default instance
+            of <see cref="T:System.Threading.Tasks.TaskFactory`1"/>, as would result from using
+            the default constructor on the factory type.
+            </remarks>
+        </member>
+        <member name="T:System.Threading.Tasks.TaskFactory`1">
+            <summary>
+            Provides support for creating and scheduling
+            <see cref="T:System.Threading.Tasks.Task{TResult}">Task{TResult}</see> objects.
+            </summary>
+            <typeparam name="TResult">The type of the results that are available though 
+            the <see cref="T:System.Threading.Tasks.Task{TResult}">Task{TResult}</see> objects that are associated with 
+            the methods in this class.</typeparam>
+            <remarks>
+            <para>
+            There are many common patterns for which tasks are relevant. The <see cref="T:System.Threading.Tasks.TaskFactory`1"/>
+            class encodes some of these patterns into methods that pick up default settings, which are
+            configurable through its constructors.
+            </para>
+            <para>
+            A default instance of <see cref="T:System.Threading.Tasks.TaskFactory`1"/> is available through the
+            <see cref="P:System.Threading.Tasks.Task`1.Factory">Task{TResult}.Factory</see> property.
+            </para>
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the default configuration.
+            </summary>
+            <remarks>
+            This constructor creates a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with a default configuration. The
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor(System.Threading.CancellationToken)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the default configuration.
+            </summary>
+            <param name="cancellationToken">The default <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned 
+            to tasks created by this <see cref="T:System.Threading.Tasks.TaskFactory"/> unless another CancellationToken is explicitly specified 
+            while calling the factory methods.</param>
+            <remarks>
+            This constructor creates a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with a default configuration. The
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor(System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the specified configuration.
+            </summary>
+            <param name="scheduler">
+            The <see cref="T:System.Threading.Tasks.TaskScheduler">
+            TaskScheduler</see> to use to schedule any tasks created with this TaskFactory{TResult}. A null value
+            indicates that the current TaskScheduler should be used.
+            </param>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to
+            <see cref="F:System.Threading.Tasks.TaskCreationOptions.None">TaskCreationOptions.None</see>, the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <see cref="F:System.Threading.Tasks.TaskContinuationOptions.None">TaskContinuationOptions.None</see>,
+            and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is
+            initialized to <paramref name="scheduler"/>, unless it's null, in which case the property is
+            initialized to the current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor(System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the specified configuration.
+            </summary>
+            <param name="creationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskCreationOptions">
+            TaskCreationOptions</see> to use when creating tasks with this TaskFactory{TResult}.
+            </param>
+            <param name="continuationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> to use when creating continuation tasks with this TaskFactory{TResult}.
+            </param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The exception that is thrown when the
+            <paramref name="creationOptions"/> argument or the <paramref name="continuationOptions"/>
+            argument specifies an invalid value.
+            </exception>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to <paramref name="creationOptions"/>,
+            the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <paramref name="continuationOptions"/>, and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is initialized to the
+            current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.#ctor(System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskContinuationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Initializes a <see cref="T:System.Threading.Tasks.TaskFactory`1"/> instance with the specified configuration.
+            </summary>
+            <param name="cancellationToken">The default <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned 
+            to tasks created by this <see cref="T:System.Threading.Tasks.TaskFactory"/> unless another CancellationToken is explicitly specified 
+            while calling the factory methods.</param>
+            <param name="creationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskCreationOptions">
+            TaskCreationOptions</see> to use when creating tasks with this TaskFactory{TResult}.
+            </param>
+            <param name="continuationOptions">
+            The default <see cref="T:System.Threading.Tasks.TaskContinuationOptions">
+            TaskContinuationOptions</see> to use when creating continuation tasks with this TaskFactory{TResult}.
+            </param>
+            <param name="scheduler">
+            The default <see cref="T:System.Threading.Tasks.TaskScheduler">
+            TaskScheduler</see> to use to schedule any Tasks created with this TaskFactory{TResult}. A null value
+            indicates that TaskScheduler.Current should be used.
+            </param>
+            <exception cref="T:ArgumentOutOfRangeException">
+            The exception that is thrown when the
+            <paramref name="creationOptions"/> argument or the <paramref name="continuationOptions"/>
+            argumentspecifies an invalid value.
+            </exception>
+            <remarks>
+            With this constructor, the
+            <see cref="T:System.Threading.Tasks.TaskCreationOptions"/> property is initialized to <paramref name="creationOptions"/>,
+            the
+            <see cref="T:System.Threading.Tasks.TaskContinuationOptions"/> property is initialized to <paramref name="continuationOptions"/>, and the <see cref="T:System.Threading.Tasks.TaskScheduler">TaskScheduler</see> property is initialized to
+            <paramref name="scheduler"/>, unless it's null, in which case the property is initialized to the
+            current scheduler (see <see cref="P:System.Threading.Tasks.TaskScheduler.Current">TaskScheduler.Current</see>).
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{`0})">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{`0},System.Threading.CancellationToken)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned to the new task.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:System.ObjectDisposedException">The provided <see cref="T:System.Threading.CancellationToken">CancellationToken</see>
+            has already been disposed.
+            </exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{`0},System.Threading.Tasks.TaskCreationOptions)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <returns>The started <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</returns>
+            <exception cref="T:System.ArgumentNullException">The exception that is thrown when the <paramref name="function"/>
+            argument is null.</exception>
+            <exception cref="T:ArgumentOutOfRangeException">The exception that is thrown when the
+            <paramref name="creationOptions"/> argument specifies an invalid TaskCreationOptions
+            value.</exception>
+            <remarks>
+            Calling StartNew is functionally equivalent to creating a <see cref="T:System.Threading.Tasks.Task`1"/> using one
+            of its constructors and then calling
+            <see cref="M:System.Threading.Tasks.Task.Start">Start</see> to schedule it for execution.
+            However, unless creation and scheduling must be separated, StartNew is the recommended approach
+            for both simplicity and performance.
+            </remarks>
+        </member>
+        <member name="M:System.Threading.Tasks.TaskFactory`1.StartNew(System.Func{`0},System.Threading.CancellationToken,System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)">
+            <summary>
+            Creates and starts a <see cref="T:System.Threading.Tasks.Task{TResult}"/>.
+            </summary>
+            <param name="function">A function delegate that returns the future result to be available through
+            the <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="creationOptions">A TaskCreationOptions value that controls the behavior of the
+            created
+            <see cref="T:System.Threading.Tasks.Task{TResult}"/>.</param>
+            <param name="cancellationToken">The <see cref="P:System.Threading.Tasks.TaskFactory`1.CancellationToken"/> that will be assigned to the new task.</