Remove outdated reactive guide and add section about Reactive Streams to flow.md
diff --git a/README.md b/README.md
index e31d6f2..862ce16 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,6 @@
 * Guides and manuals: 
   * [Guide to kotlinx.coroutines by example](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html) (**read it first**)
   * [Guide to UI programming with coroutines](ui/coroutines-guide-ui.md)
-  * [Guide to reactive streams with coroutines](reactive/coroutines-guide-reactive.md)
   * [Debugging capabilities in kotlinx.coroutines](docs/debugging.md)
 * [Compatibility policy and experimental annotations](docs/compatibility.md)
 * [Change log for kotlinx.coroutines](CHANGES.md)
diff --git a/coroutines-guide.md b/coroutines-guide.md
index 4a7fb67..bebd0d0 100644
--- a/coroutines-guide.md
+++ b/coroutines-guide.md
@@ -79,6 +79,7 @@
     * <a name='upstream-exceptions-only'></a>[Upstream exceptions only](docs/flow.md#upstream-exceptions-only)
   * <a name='imperative-versus-declarative'></a>[Imperative versus declarative](docs/flow.md#imperative-versus-declarative)
   * <a name='launching-flow'></a>[Launching flow](docs/flow.md#launching-flow)
+  * <a name='flow-and-reactive-streams'></a>[Flow and Reactive Streams](docs/flow.md#flow-and-reactive-streams)
 <!--- TOC_REF docs/channels.md -->
 * <a name='channels'></a>[Channels](docs/channels.md#channels)
   * <a name='channel-basics'></a>[Channel basics](docs/channels.md#channel-basics)
diff --git a/docs/coroutines-guide.md b/docs/coroutines-guide.md
index 5f41d06..e3f18d2 100644
--- a/docs/coroutines-guide.md
+++ b/docs/coroutines-guide.md
@@ -28,6 +28,5 @@
 ## Additional references
 
 * [Guide to UI programming with coroutines](../ui/coroutines-guide-ui.md)
-* [Guide to reactive streams with coroutines](../reactive/coroutines-guide-reactive.md)
 * [Coroutines design document (KEEP)](https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md)
 * [Full kotlinx.coroutines API reference](https://kotlin.github.io/kotlinx.coroutines)
diff --git a/docs/flow.md b/docs/flow.md
index 2a3ffb5..7837a54 100644
--- a/docs/flow.md
+++ b/docs/flow.md
@@ -58,6 +58,7 @@
     * [Upstream exceptions only](#upstream-exceptions-only)
   * [Imperative versus declarative](#imperative-versus-declarative)
   * [Launching flow](#launching-flow)
+  * [Flow and Reactive Streams](#flow-and-reactive-streams)
 
 <!--- END_TOC -->
 
@@ -1794,6 +1795,18 @@
 Note that [launchIn] also returns a [Job], which can be used to [cancel][Job.cancel] the corresponding flow collection
 coroutine only without cancelling the whole scope or to [join][Job.join] it.
  
+### Flow and Reactive Streams
+
+For those who are familiar with [Reactive Streams](https://www.reactive-streams.org/) or reactive frameworks such as RxJava and project Reactor, 
+design of the Flow may look very familiar.
+
+Indeed, its design was inspired by Reactive Streams and its various implementations. But Flow main goal is to have as simple design as possible, 
+be Kotlin and suspension friendly and respect structured concurrency. Achieving this goal would be impossible without reactive pioneers and their tremendous work. You can read the complete story in [Reactive Streams and Kotlin Flows](https://medium.com/@elizarov/reactive-streams-and-kotlin-flows-bfd12772cda4) article.
+
+While being different, conceptually, Flow *is* a reactive stream and it is possible to convert it to the reactive (spec and TCK compliant) Publisher and vice versa.
+Such converters are provided by `kotlinx.coroutines` out-of-the-box and can be found in corresponding reactive modules (`kotlinx-coroutines-reactive` for Reactive Streams, `kotlinx-coroutines-reactor` for Project Reactor and `kotlinx-coroutines-rx2` for RxJava2).
+Integration modules include conversions from and to `Flow`, integration with Reactor's `Context` and suspension-friendly ways to work with various reactive entities.
+ 
 <!-- stdlib references -->
 
 [collections]: https://kotlinlang.org/docs/reference/collections-overview.html 
diff --git a/reactive/coroutines-guide-reactive.md b/reactive/coroutines-guide-reactive.md
deleted file mode 100644
index 0eff27b..0000000
--- a/reactive/coroutines-guide-reactive.md
+++ /dev/null
@@ -1,1078 +0,0 @@
-<!--- INCLUDE .*/example-reactive-([a-z]+)-([0-9]+)\.kt 
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.$$1$$2
-
--->
-<!--- KNIT     kotlinx-coroutines-rx2/test/guide/.*\.kt -->
-<!--- TEST_OUT kotlinx-coroutines-rx2/test/guide/test/GuideReactiveTest.kt
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.test
-
-import kotlinx.coroutines.guide.test.*
-import org.junit.Test
-
-class GuideReactiveTest : ReactiveTestBase() {
--->
-
-# Guide to reactive streams with coroutines
-
-This guide explains the key differences between Kotlin coroutines and reactive streams and shows 
-how they can be used together for the greater good. Prior familiarity with the basic coroutine concepts
-that are covered in [Guide to kotlinx.coroutines](../docs/coroutines-guide.md) is not required, 
-but is a big plus. If you are familiar with reactive streams, you may find this guide
-a better introduction into the world of coroutines.
-
-There are several modules in `kotlinx.coroutines` project that are related to reactive streams:
-
-* [kotlinx-coroutines-reactive](kotlinx-coroutines-reactive) -- utilities for [Reactive Streams](https://www.reactive-streams.org)
-* [kotlinx-coroutines-reactor](kotlinx-coroutines-reactor) -- utilities for [Reactor](https://projectreactor.io)
-* [kotlinx-coroutines-rx2](kotlinx-coroutines-rx2) -- utilities for [RxJava 2.x](https://github.com/ReactiveX/RxJava)
-
-This guide is mostly based on [Reactive Streams](https://www.reactive-streams.org) specification and uses
-its `Publisher` interface with some examples based on [RxJava 2.x](https://github.com/ReactiveX/RxJava),
-which implements reactive streams specification.
-
-You are welcome to clone 
-[`kotlinx.coroutines` project](https://github.com/Kotlin/kotlinx.coroutines)
-from GitHub to your workstation in order to
-run all the presented examples. They are contained in 
-[reactive/kotlinx-coroutines-rx2/test/guide](kotlinx-coroutines-rx2/test/guide)
-directory of the project.
- 
-## Table of contents
-
-<!--- TOC -->
-
-* [Differences between reactive streams and channels](#differences-between-reactive-streams-and-channels)
-  * [Basics of iteration](#basics-of-iteration)
-  * [Subscription and cancellation](#subscription-and-cancellation)
-  * [Backpressure](#backpressure)
-  * [Rx Subject vs BroadcastChannel](#rx-subject-vs-broadcastchannel)
-* [Operators](#operators)
-  * [Range](#range)
-  * [Fused filter-map hybrid](#fused-filter-map-hybrid)
-  * [Take until](#take-until)
-  * [Merge](#merge)
-* [Coroutine context](#coroutine-context)
-  * [Threads with Rx](#threads-with-rx)
-  * [Threads with coroutines](#threads-with-coroutines)
-  * [Rx observeOn](#rx-observeon)
-  * [Coroutine context to rule them all](#coroutine-context-to-rule-them-all)
-  * [Unconfined context](#unconfined-context)
-
-<!--- END_TOC -->
-
-## Differences between reactive streams and channels
-
-This section outlines key differences between reactive streams and coroutine-based channels. 
-
-### Basics of iteration
-
-The [Channel] is somewhat similar concept to the following reactive stream classes:
-
-* Reactive stream [Publisher](https://github.com/reactive-streams/reactive-streams-jvm/blob/master/api/src/main/java/org/reactivestreams/Publisher.java);
-* Rx Java 1.x [Observable](https://reactivex.io/RxJava/javadoc/rx/Observable.html);
-* Rx Java 2.x [Flowable](https://reactivex.io/RxJava/2.x/javadoc/), which implements `Publisher`.
-
-They all describe an asynchronous stream of elements (aka items in Rx), either infinite or finite, 
-and all of them support backpressure.
-  
-However, the `Channel` always represents a _hot_ stream of items, using Rx terminology. Elements are being sent
-into the channel by producer coroutines and are received from it by consumer coroutines. 
-Every [receive][ReceiveChannel.receive] invocation consumes an element from the channel. 
-Let us illustrate it with the following example:
-
-<!--- INCLUDE
-import kotlinx.coroutines.*
-import kotlinx.coroutines.channels.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    // create a channel that produces numbers from 1 to 3 with 200ms delays between them
-    val source = produce<Int> {
-        println("Begin") // mark the beginning of this coroutine in output
-        for (x in 1..3) {
-            delay(200) // wait for 200ms
-            send(x) // send number x to the channel
-        }
-    }
-    // print elements from the source
-    println("Elements:")
-    source.consumeEach { // consume elements from it
-        println(it)
-    }
-    // print elements from the source AGAIN
-    println("Again:")
-    source.consumeEach { // consume elements from it
-        println(it)
-    }
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-01.kt).
-
-This code produces the following output: 
-
-```text
-Elements:
-Begin
-1
-2
-3
-Again:
-```
-
-<!--- TEST -->
-
-Notice how the "Begin" line was printed just once, because the [produce] _coroutine builder_, when it is executed,
-launches one coroutine to produce a stream of elements. All the produced elements are consumed 
-with [ReceiveChannel.consumeEach][consumeEach] 
-extension function. There is no way to receive the elements from this
-channel again. The channel is closed when the producer coroutine is over and an attempt to receive 
-from it again cannot receive anything.
-
-Let us rewrite this code using the [publish] coroutine builder from `kotlinx-coroutines-reactive` module
-instead of [produce] from `kotlinx-coroutines-core` module. The code stays the same, 
-but where `source` used to have the [ReceiveChannel] type, it now has the reactive streams' 
-[Publisher](https://www.reactive-streams.org/reactive-streams-1.0.0-javadoc/org/reactivestreams/Publisher.html) 
-type, and where [consumeEach] was used to _consume_ elements from the channel, 
-now [collect][org.reactivestreams.Publisher.collect] is used to _collect_ elements from the publisher. 
-
-<!--- INCLUDE
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    // create a publisher that produces numbers from 1 to 3 with 200ms delays between them
-    val source = publish<Int> {
-    //           ^^^^^^^  <---  Difference from the previous examples is here
-        println("Begin") // mark the beginning of this coroutine in output
-        for (x in 1..3) {
-            delay(200) // wait for 200ms
-            send(x) // send number x to the channel
-        }
-    }
-    // print elements from the source
-    println("Elements:")
-    source.collect { // collect elements from it
-        println(it)
-    }
-    // print elements from the source AGAIN
-    println("Again:")
-    source.collect { // collect elements from it
-        println(it)
-    }
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-02.kt).
-
-Now the output of this code changes to:
-
-```text
-Elements:
-Begin
-1
-2
-3
-Again:
-Begin
-1
-2
-3
-```
-
-<!--- TEST -->
-
-This example highlights the key difference between a reactive stream and a channel. A reactive stream is a higher-order
-functional concept. While the channel _is_ a stream of elements, the reactive stream defines a recipe on how the stream of 
-elements is produced. It becomes the actual stream of elements when _collected_. Each collector may receive the same or
-a different stream of elements, depending on how the corresponding implementation of `Publisher` works.
-
-The [publish] coroutine builder used in the above example does not launch a coroutine,
-but every [collect][org.reactivestreams.Publisher.collect] invocation does.
-There are two of them here and that is why we see "Begin" printed twice. 
-
-In Rx lingo, this kind of publisher is called _cold_. Many standard Rx operators produce cold streams, too. We can collect
-them from a coroutine, and every collector gets the same stream of elements.
-
-> Note that we can replicate the same behaviour that we saw with channels by using Rx 
-[publish](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#publish()) 
-operator and [connect](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/flowables/ConnectableFlowable.html#connect())
-method with it.
-
-### Subscription and cancellation
-
-In the second example from the previous section, `source.collect { ... }` was used to collect all elements. 
-Instead, we can open a channel using [openSubscription][org.reactivestreams.Publisher.openSubscription]
-and iterate over it. In this way, we can have finer-grained control over our iteration 
-(using `break`, for example), as shown below:
-
-<!--- INCLUDE
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.channels.*
-import kotlinx.coroutines.reactive.*
--->
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    val source = Flowable.range(1, 5) // a range of five numbers
-        .doOnSubscribe { println("OnSubscribe") } // provide some insight
-        .doOnComplete { println("OnComplete") }   // ...
-        .doFinally { println("Finally") }         // ... into what's going on
-    var cnt = 0 
-    source.openSubscription().consume { // open channel to the source
-        for (x in this) { // iterate over the channel to receive elements from it
-            println(x)
-            if (++cnt >= 3) break // break when 3 elements are printed
-        }
-        // Note: `consume` cancels the channel when this block of code is complete
-    }
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-03.kt).
-
-It produces the following output:
- 
-```text
-OnSubscribe
-1
-2
-3
-Finally
-```
-
-<!--- TEST -->
-
-With an explicit `openSubscription` we should [cancel][ReceiveChannel.cancel] the corresponding 
-subscription to unsubscribe from the source, but there is no need to call `cancel` explicitly -- 
-[consume] does that for us under the hood.
-The installed 
-[doFinally](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#doFinally(io.reactivex.functions.Action))
-listener prints "Finally" to confirm that the subscription is actually being closed. Note that "OnComplete"
-is never printed because we did not consume all of the elements.
-
-We do not need to use an explicit `cancel` either if we `collect` all the elements:
-
-<!--- INCLUDE
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    val source = Flowable.range(1, 5) // a range of five numbers
-        .doOnSubscribe { println("OnSubscribe") } // provide some insight
-        .doOnComplete { println("OnComplete") }   // ...
-        .doFinally { println("Finally") }         // ... into what's going on
-    // collect the source fully
-    source.collect { println(it) }
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-04.kt).
-
-We get the following output:
-
-```text
-OnSubscribe
-1
-2
-3
-OnComplete
-Finally
-4
-5
-```
-
-<!--- TEST -->
-
-Notice how "OnComplete" and "Finally" are printed before the lasts elements "4" and "5". 
-It happens because our `main` function in this
-example is a coroutine that we start with the [runBlocking] coroutine builder.
-Our main coroutine receives on the flowable using the `source.collect { ... }` expression.
-The main coroutine is _suspended_ while it waits for the source to emit an item.
-When the last items are emitted by `Flowable.range(1, 5)` it
-_resumes_ the main coroutine, which gets dispatched onto the main thread to print this
- last element at a later point in time, while the source completes and prints "Finally".
-
-### Backpressure
-
-Backpressure is one of the most interesting and complex aspects of reactive streams. Coroutines can 
-_suspend_ and they provide a natural answer to handling backpressure. 
-
-In Rx Java 2.x, the backpressure-capable class is called 
-[Flowable](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html).
-In the following example, we use [rxFlowable] coroutine builder from `kotlinx-coroutines-rx2` module to define a 
-flowable that sends three integers from 1 to 3. 
-It prints a message to the output before invocation of the
-suspending [send][SendChannel.send] function, so that we can study how it operates.
-
-The integers are generated in the context of the main thread, but the subscription is shifted 
-to another thread using Rx
-[observeOn](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#observeOn(io.reactivex.Scheduler,%20boolean,%20int))
-operator with a buffer of size 1. 
-The subscriber is slow. It takes 500 ms to process each item, which is simulated using `Thread.sleep`.
-
-<!--- INCLUDE
-import io.reactivex.schedulers.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.rx2.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun main() = runBlocking<Unit> { 
-    // coroutine -- fast producer of elements in the context of the main thread
-    val source = rxFlowable {
-        for (x in 1..3) {
-            send(x) // this is a suspending function
-            println("Sent $x") // print after successfully sent item
-        }
-    }
-    // subscribe on another thread with a slow subscriber using Rx
-    source
-        .observeOn(Schedulers.io(), false, 1) // specify buffer size of 1 item
-        .doOnComplete { println("Complete") }
-        .subscribe { x ->
-            Thread.sleep(500) // 500ms to process each item
-            println("Processed $x")
-        }
-    delay(2000) // suspend the main thread for a few seconds
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-05.kt).
-
-The output of this code nicely illustrates how backpressure works with coroutines:
-
-```text
-Sent 1
-Processed 1
-Sent 2
-Processed 2
-Sent 3
-Processed 3
-Complete
-```
-
-<!--- TEST -->
-
-We see here how the producer coroutine puts the first element in the buffer and is suspended while trying to send another 
-one. Only after the consumer processes the first item, the producer sends the second one and resumes, etc.
-
-
-### Rx Subject vs BroadcastChannel
- 
-RxJava has a concept of [Subject](https://github.com/ReactiveX/RxJava/wiki/Subject) which is an object that
-effectively broadcasts elements to all its subscribers. The matching concept in the coroutines world is called a 
-[BroadcastChannel]. There is a variety of subjects in Rx with 
-[BehaviorSubject](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/subjects/BehaviorSubject.html) being
-the one used to manage state:
-
-<!--- INCLUDE
-import io.reactivex.subjects.BehaviorSubject
--->
-
-```kotlin
-fun main() {
-    val subject = BehaviorSubject.create<String>()
-    subject.onNext("one")
-    subject.onNext("two") // updates the state of BehaviorSubject, "one" value is lost
-    // now subscribe to this subject and print everything
-    subject.subscribe(System.out::println)
-    subject.onNext("three")
-    subject.onNext("four")
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-06.kt).
-
-This code prints the current state of the subject on subscription and all its further updates:
-
-
-```text
-two
-three
-four
-```
-
-<!--- TEST -->
-
-You can subscribe to subjects from a coroutine just as with any other reactive stream:
-   
-<!--- INCLUDE 
-import io.reactivex.subjects.BehaviorSubject
-import kotlinx.coroutines.*
-import kotlinx.coroutines.rx2.collect
--->   
-   
-```kotlin
-fun main() = runBlocking<Unit> {
-    val subject = BehaviorSubject.create<String>()
-    subject.onNext("one")
-    subject.onNext("two")
-    // now launch a coroutine to print everything
-    GlobalScope.launch(Dispatchers.Unconfined) { // launch coroutine in unconfined context
-        subject.collect { println(it) }
-    }
-    subject.onNext("three")
-    subject.onNext("four")
-}
-```   
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-07.kt).
-
-The result is the same:
-
-```text
-two
-three
-four
-```
-
-<!--- TEST -->
-
-Here we use the [Dispatchers.Unconfined] coroutine context to launch a consuming coroutine with the same behavior as subscription in Rx. 
-It basically means that the launched coroutine is going to be immediately executed in the same thread that 
-is emitting elements. Contexts are covered in more details in a [separate section](#coroutine-context).
-
-The advantage of coroutines is that it is easy to get conflation behavior for single-threaded UI updates. 
-A typical UI application does not need to react to every state change. Only the most recent state is relevant.
-A sequence of back-to-back updates to the application state needs to get reflected in UI only once, 
-as soon as the UI thread is free. For the following example we are going to simulate this by launching 
-a consuming coroutine in the context of the main thread and use the [yield] function to simulate a break in the 
-sequence of updates and to release the main thread:
-
-<!--- INCLUDE
-import io.reactivex.subjects.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.rx2.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    val subject = BehaviorSubject.create<String>()
-    subject.onNext("one")
-    subject.onNext("two")
-    // now launch a coroutine to print the most recent update
-    launch { // use the context of the main thread for a coroutine
-        subject.collect { println(it) }
-    }
-    subject.onNext("three")
-    subject.onNext("four")
-    yield() // yield the main thread to the launched coroutine <--- HERE
-    subject.onComplete() // now complete the subject's sequence to cancel the consumer, too    
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-08.kt).
-
-Now the coroutine processes (prints) only the most recent update:
-
-```text
-four
-```
-
-<!--- TEST -->
-
-The corresponding behavior in the pure coroutines world is implemented by [ConflatedBroadcastChannel] 
-that provides the same logic on top of coroutine channels directly, 
-without going through the bridge to the reactive streams:
-
-<!--- INCLUDE
-import kotlinx.coroutines.channels.*
-import kotlinx.coroutines.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    val broadcast = ConflatedBroadcastChannel<String>()
-    broadcast.offer("one")
-    broadcast.offer("two")
-    // now launch a coroutine to print the most recent update
-    launch { // use the context of the main thread for a coroutine
-        broadcast.consumeEach { println(it) }
-    }
-    broadcast.offer("three")
-    broadcast.offer("four")
-    yield() // yield the main thread to the launched coroutine
-    broadcast.close() // now close the broadcast channel to cancel the consumer, too    
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-basic-09.kt).
-
-It produces the same output as the previous example based on `BehaviorSubject`:
-
-```text
-four
-```
-
-<!--- TEST -->
-
-Another implementation of [BroadcastChannel] is `ArrayBroadcastChannel` with an array-based buffer of
-a specified `capacity`. It can be created with `BroadcastChannel(capacity)`. 
-It delivers every event to every
-subscriber as soon as their corresponding subscriptions are opened. It corresponds to 
-[PublishSubject](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/subjects/PublishSubject.html) in Rx.
-The capacity of the buffer in the constructor of `ArrayBroadcastChannel` controls the numbers of elements
-that can be sent before the sender is suspended waiting for a receiver to receive those elements.
-
-## Operators
-
-Full-featured reactive stream libraries, like Rx, come with 
-[a very large set of operators](https://reactivex.io/documentation/operators.html) to create, transform, combine
-and otherwise process the corresponding streams. Creating your own operators with support for
-back-pressure is [notoriously](https://akarnokd.blogspot.ru/2015/05/pitfalls-of-operator-implementations.html)
-[difficult](https://github.com/ReactiveX/RxJava/wiki/Writing-operators-for-2.0).
-
-Coroutines and channels are designed to provide an opposite experience. There are no built-in operators, 
-but processing streams of elements is extremely simple and back-pressure is supported automatically 
-without you having to explicitly think about it.
-
-This section shows a coroutine-based implementation of several reactive stream operators.  
-
-### Range
-
-Let's roll out own implementation of 
-[range](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#range(int,%20int))
-operator for the reactive streams' `Publisher` interface. The asynchronous clean-slate implementation of this operator for
-reactive streams is explained in 
-[this blog post](https://akarnokd.blogspot.ru/2017/03/java-9-flow-api-asynchronous-integer.html).
-It takes a lot of code.
-Here is the corresponding code with coroutines:
-
-<!--- INCLUDE
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlin.coroutines.CoroutineContext
--->
-
-```kotlin
-fun CoroutineScope.range(context: CoroutineContext, start: Int, count: Int) = publish<Int>(context) {
-    for (x in start until start + count) send(x)
-}
-```
-
-Here, `CoroutineScope` and `context` are used instead of an `Executor` and all the backpressure aspects are taken care
-of by the coroutines machinery. Note that this implementation depends only on the small reactive streams library
-that defines the `Publisher` interface and its friends.
-
-Using it from a coroutine is straightforward:
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    // Range inherits parent job from runBlocking, but overrides dispatcher with Dispatchers.Default
-    range(Dispatchers.Default, 1, 5).collect { println(it) }
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-operators-01.kt).
-
-The result of this code is quite expected:
-   
-```text
-1
-2
-3
-4
-5
-```
-
-<!--- TEST -->
-
-### Fused filter-map hybrid
-
-Reactive operators like 
-[filter](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#filter(io.reactivex.functions.Predicate)) and 
-[map](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#map(io.reactivex.functions.Function))
-are trivial to implement with coroutines. For a bit of challenge and showcase, let us combine them
-into the single `fusedFilterMap` operator: 
-
-<!--- INCLUDE
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import org.reactivestreams.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun <T, R> Publisher<T>.fusedFilterMap(
-    context: CoroutineContext,   // the context to execute this coroutine in
-    predicate: (T) -> Boolean,   // the filter predicate
-    mapper: (T) -> R             // the mapper function
-) = publish<R>(context) {
-    collect {                    // collect the source stream 
-        if (predicate(it))       // filter part
-            send(mapper(it))     // map part
-    }        
-}
-```
-
-Using `range` from the previous example we can test our `fusedFilterMap` 
-by filtering for even numbers and mapping them to strings:
-
-<!--- INCLUDE
-
-fun CoroutineScope.range(start: Int, count: Int) = publish<Int> {
-    for (x in start until start + count) send(x)
-}
--->
-
-```kotlin
-fun main() = runBlocking<Unit> {
-   range(1, 5)
-       .fusedFilterMap(Dispatchers.Unconfined, { it % 2 == 0}, { "$it is even" })
-       .collect { println(it) } // print all the resulting strings
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-operators-02.kt).
-
-It is not hard to see that the result is going to be:
-
-```text
-2 is even
-4 is even
-```
-
-<!--- TEST -->
-
-### Take until
-
-Let's implement our own version of
-[takeUntil](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#takeUntil(org.reactivestreams.Publisher))
-operator. It is quite [tricky](https://akarnokd.blogspot.ru/2015/05/pitfalls-of-operator-implementations.html) 
-as subscriptions to two streams need to be tracked and managed. 
-We need to relay all the elements from the source stream until the other stream either completes or 
-emits anything. However, we have the [select] expression to rescue us in the coroutines implementation:
-
-<!--- INCLUDE
-import kotlinx.coroutines.channels.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlinx.coroutines.selects.*
-import org.reactivestreams.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun <T, U> Publisher<T>.takeUntil(context: CoroutineContext, other: Publisher<U>) = publish<T>(context) {
-    this@takeUntil.openSubscription().consume { // explicitly open channel to Publisher<T>
-        val current = this
-        other.openSubscription().consume { // explicitly open channel to Publisher<U>
-            val other = this
-            whileSelect {
-                other.onReceive { false }            // bail out on any received element from `other`
-                current.onReceive { send(it); true } // resend element from this channel and continue
-            }
-        }
-    }
-}
-```
-
-This code is using [whileSelect] as a nicer shortcut to `while(select{...}) {}` loop and Kotlin's
-[consume] expressions to close the channels on exit, which unsubscribes from the corresponding publishers. 
-
-The following hand-written combination of 
-[range](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#range(int,%20int)) with 
-[interval](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#interval(long,%20java.util.concurrent.TimeUnit,%20io.reactivex.Scheduler))
-is used for testing. It is coded using a `publish` coroutine builder 
-(its pure-Rx implementation is shown in later sections):
-
-```kotlin
-fun CoroutineScope.rangeWithInterval(time: Long, start: Int, count: Int) = publish<Int> {
-    for (x in start until start + count) { 
-        delay(time) // wait before sending each number
-        send(x)
-    }
-}
-```
-
-The following code shows how `takeUntil` works: 
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    val slowNums = rangeWithInterval(200, 1, 10)         // numbers with 200ms interval
-    val stop = rangeWithInterval(500, 1, 10)             // the first one after 500ms
-    slowNums.takeUntil(Dispatchers.Unconfined, stop).collect { println(it) } // let's test it
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-operators-03.kt).
-
-Producing 
-
-```text
-1
-2
-```
-
-<!--- TEST -->
-
-### Merge
-
-There are always at least two ways for processing multiple streams of data with coroutines. One way involving
-[select] was shown in the previous example. The other way is just to launch multiple coroutines. Let
-us implement 
-[merge](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#merge(org.reactivestreams.Publisher))
-operator using the latter approach:
-
-<!--- INCLUDE
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import org.reactivestreams.*
-import kotlin.coroutines.*
--->
-
-```kotlin
-fun <T> Publisher<Publisher<T>>.merge(context: CoroutineContext) = publish<T>(context) {
-  collect { pub -> // for each publisher collected
-      launch {  // launch a child coroutine
-          pub.collect { send(it) } // resend all element from this publisher
-      }
-  }
-}
-```
-
-Notice that all the coroutines that are
-being launched here are the children of the `publish`
-coroutine and will get cancelled when the `publish` coroutine is cancelled or is otherwise completed. 
-Moreover, since the parent coroutine waits until all the children are complete, this implementation fully
-merges all the received streams.
-
-For a test, let us start with the `rangeWithInterval` function from the previous example and write a 
-producer that sends its results twice with some delay:
-
-<!--- INCLUDE
-
-fun CoroutineScope.rangeWithInterval(time: Long, start: Int, count: Int) = publish<Int> {
-    for (x in start until start + count) { 
-        delay(time) // wait before sending each number
-        send(x)
-    }
-}
--->
-
-```kotlin
-fun CoroutineScope.testPub() = publish<Publisher<Int>> {
-    send(rangeWithInterval(250, 1, 4)) // number 1 at 250ms, 2 at 500ms, 3 at 750ms, 4 at 1000ms 
-    delay(100) // wait for 100 ms
-    send(rangeWithInterval(500, 11, 3)) // number 11 at 600ms, 12 at 1100ms, 13 at 1600ms
-    delay(1100) // wait for 1.1s - done in 1.2 sec after start
-}
-```
-
-The test code is to use `merge` on `testPub` and to display the results:
-
-```kotlin
-fun main() = runBlocking<Unit> {
-    testPub().merge(Dispatchers.Unconfined).collect { println(it) } // print the whole stream
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-operators-04.kt).
-
-And the results should be: 
-
-```text
-1
-2
-11
-3
-4
-12
-13
-```
-
-<!--- TEST -->
-
-## Coroutine context
-
-All the example operators that are shown in the previous section have an explicit
-[CoroutineContext](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.coroutines/-coroutine-context/) 
-parameter. In the Rx world it roughly corresponds to 
-a [Scheduler](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Scheduler.html).
-
-### Threads with Rx
-
-The following example shows the basics of threading context management with Rx.
-Here `rangeWithIntervalRx` is an implementation of `rangeWithInterval` function using Rx 
-`zip`, `range`, and `interval` operators.
-
-<!--- INCLUDE
-import io.reactivex.*
-import io.reactivex.functions.BiFunction
-import io.reactivex.schedulers.Schedulers
-import java.util.concurrent.TimeUnit
--->
-
-```kotlin
-fun rangeWithIntervalRx(scheduler: Scheduler, time: Long, start: Int, count: Int): Flowable<Int> = 
-    Flowable.zip(
-        Flowable.range(start, count),
-        Flowable.interval(time, TimeUnit.MILLISECONDS, scheduler),
-        BiFunction { x, _ -> x })
-
-fun main() {
-    rangeWithIntervalRx(Schedulers.computation(), 100, 1, 3)
-        .subscribe { println("$it on thread ${Thread.currentThread().name}") }
-    Thread.sleep(1000)
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-context-01.kt).
-
-We are explicitly passing the 
-[Schedulers.computation()](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/schedulers/Schedulers.html#computation()) 
-scheduler to our `rangeWithIntervalRx` operator and
-it is going to be executed in Rx computation thread pool. The output is going to be similar to the following one:
-
-```text
-1 on thread RxComputationThreadPool-1
-2 on thread RxComputationThreadPool-1
-3 on thread RxComputationThreadPool-1
-```
-
-<!--- TEST FLEXIBLE_THREAD -->
-
-### Threads with coroutines
-
-In the world of coroutines `Schedulers.computation()` roughly corresponds to [Dispatchers.Default], 
-so the previous example is similar to the following one:
-
-<!--- INCLUDE
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlin.coroutines.CoroutineContext
--->
-
-```kotlin
-fun rangeWithInterval(context: CoroutineContext, time: Long, start: Int, count: Int) = publish<Int>(context) {
-    for (x in start until start + count) { 
-        delay(time) // wait before sending each number
-        send(x)
-    }
-}
-
-fun main() {
-    Flowable.fromPublisher(rangeWithInterval(Dispatchers.Default, 100, 1, 3))
-        .subscribe { println("$it on thread ${Thread.currentThread().name}") }
-    Thread.sleep(1000)
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-context-02.kt).
-
-The produced output is going to be similar to:
-
-```text
-1 on thread ForkJoinPool.commonPool-worker-1
-2 on thread ForkJoinPool.commonPool-worker-1
-3 on thread ForkJoinPool.commonPool-worker-1
-```
-
-<!--- TEST LINES_START -->
-
-Here we've used Rx 
-[subscribe](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#subscribe(io.reactivex.functions.Consumer))
-operator that does not have its own scheduler and operates on the same thread that the publisher -- on a default
-shared pool of threads in this example.
-
-### Rx observeOn 
-
-In Rx you use special operators to modify the threading context for operations in the chain. You
-can find some [good guides](https://tomstechnicalblog.blogspot.ru/2016/02/rxjava-understanding-observeon-and.html)
-about them, if you are not familiar. 
-
-For example, there is
-[observeOn](https://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html#observeOn(io.reactivex.Scheduler)) 
-operator. Let us modify the previous example to observe using `Schedulers.computation()`:   
-
-<!--- INCLUDE
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import io.reactivex.schedulers.Schedulers
-import kotlin.coroutines.CoroutineContext
--->
-
-```kotlin
-fun rangeWithInterval(context: CoroutineContext, time: Long, start: Int, count: Int) = publish<Int>(context) {
-    for (x in start until start + count) { 
-        delay(time) // wait before sending each number
-        send(x)
-    }
-}
-
-fun main() {
-    Flowable.fromPublisher(rangeWithInterval(Dispatchers.Default, 100, 1, 3))
-        .observeOn(Schedulers.computation())                           // <-- THIS LINE IS ADDED
-        .subscribe { println("$it on thread ${Thread.currentThread().name}") }
-    Thread.sleep(1000)
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-context-03.kt).
-
-Here is the difference in output, notice "RxComputationThreadPool":
-
-```text
-1 on thread RxComputationThreadPool-1
-2 on thread RxComputationThreadPool-1
-3 on thread RxComputationThreadPool-1
-```
-
-<!--- TEST FLEXIBLE_THREAD -->
-
-### Coroutine context to rule them all
-
-A coroutine is always working in some context. For example, let us start a coroutine
-in the main thread with [runBlocking] and iterate over the result of the Rx version of `rangeWithIntervalRx` operator, 
-instead of using Rx `subscribe` operator:
-
-<!--- INCLUDE
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import io.reactivex.functions.BiFunction
-import io.reactivex.schedulers.Schedulers
-import java.util.concurrent.TimeUnit
--->
-
-```kotlin
-fun rangeWithIntervalRx(scheduler: Scheduler, time: Long, start: Int, count: Int): Flowable<Int> =
-    Flowable.zip(
-        Flowable.range(start, count),
-        Flowable.interval(time, TimeUnit.MILLISECONDS, scheduler),
-        BiFunction { x, _ -> x })
-
-fun main() = runBlocking<Unit> {
-    rangeWithIntervalRx(Schedulers.computation(), 100, 1, 3)
-        .collect { println("$it on thread ${Thread.currentThread().name}") }
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-context-04.kt).
-
-The resulting messages are going to be printed in the main thread:
-
-```text
-1 on thread main
-2 on thread main
-3 on thread main
-```
-
-<!--- TEST LINES_START -->
-
-### Unconfined context
-
-Most Rx operators do not have any specific thread (scheduler) associated with them and are working 
-in whatever thread they happen to be invoked. We've seen it in the example with the `subscribe` operator 
-in the [threads with Rx](#threads-with-rx) section.
- 
-In the world of coroutines, [Dispatchers.Unconfined] context serves a similar role. Let us modify our previous example,
-but instead of iterating over the source `Flowable` from the `runBlocking` coroutine that is confined 
-to the main thread, we launch a new coroutine in the `Dispatchers.Unconfined` context, while the main coroutine
-simply waits for its completion using [Job.join]:
-
-<!--- INCLUDE
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import io.reactivex.functions.BiFunction
-import io.reactivex.schedulers.Schedulers
-import java.util.concurrent.TimeUnit
--->
-
-```kotlin
-fun rangeWithIntervalRx(scheduler: Scheduler, time: Long, start: Int, count: Int): Flowable<Int> =
-    Flowable.zip(
-        Flowable.range(start, count),
-        Flowable.interval(time, TimeUnit.MILLISECONDS, scheduler),
-        BiFunction { x, _ -> x })
-
-fun main() = runBlocking<Unit> {
-    val job = launch(Dispatchers.Unconfined) { // launch a new coroutine in Unconfined context (without its own thread pool)
-        rangeWithIntervalRx(Schedulers.computation(), 100, 1, 3)
-            .collect { println("$it on thread ${Thread.currentThread().name}") }
-    }
-    job.join() // wait for our coroutine to complete
-}
-```
-
-> You can get full code [here](kotlinx-coroutines-rx2/test/guide/example-reactive-context-05.kt).
-
-Now, the output shows that the code of the coroutine is executing in the Rx computation thread pool, just
-like our initial example using the Rx `subscribe` operator.
-
-```text
-1 on thread RxComputationThreadPool-1
-2 on thread RxComputationThreadPool-1
-3 on thread RxComputationThreadPool-1
-```
-
-<!--- TEST LINES_START -->
-
-Note that the [Dispatchers.Unconfined] context should be used with care. It may improve the overall performance on certain tests,
-due to the increased stack-locality of operations and less scheduling overhead, but it also produces deeper stacks 
-and makes it harder to reason about asynchronicity of the code that is using it. 
-
-If a coroutine sends an element to a channel, then the thread that invoked the 
-[send][SendChannel.send] may start executing the code of the coroutine with the [Dispatchers.Unconfined] dispatcher.
-The original producer coroutine that invoked `send`  is paused until the unconfined consumer coroutine hits its next
-suspension point. This is very similar to a lock-step single-threaded `onNext` execution in the Rx world in the absense
-of thread-shifting operators. It is a normal default for Rx, because operators are usually doing very small chunks
-of work and you have to combine many operators for a complex processing. However, this is unusual with coroutines, 
-where you can have an arbitrary complex processing in a coroutine. Usually, you only need to chain stream-processing
-coroutines for complex pipelines with fan-in and fan-out between multiple worker coroutines.
-
-<!--- MODULE kotlinx-coroutines-core -->
-<!--- INDEX kotlinx.coroutines -->
-[runBlocking]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html
-[Dispatchers.Unconfined]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-unconfined.html
-[yield]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html
-[Dispatchers.Default]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-dispatchers/-default.html
-[Job.join]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/join.html
-<!--- INDEX kotlinx.coroutines.channels -->
-[Channel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-channel/index.html
-[ReceiveChannel.receive]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/receive.html
-[produce]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/produce.html
-[consumeEach]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/consume-each.html
-[ReceiveChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/index.html
-[ReceiveChannel.cancel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-receive-channel/cancel.html
-[consume]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/consume.html
-[SendChannel.send]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-send-channel/send.html
-[BroadcastChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-broadcast-channel/index.html
-[ConflatedBroadcastChannel]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.channels/-conflated-broadcast-channel/index.html
-<!--- INDEX kotlinx.coroutines.selects -->
-[select]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/select.html
-[whileSelect]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.selects/while-select.html
-<!--- MODULE kotlinx-coroutines-reactive -->
-<!--- INDEX kotlinx.coroutines.reactive -->
-[publish]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/publish.html
-[org.reactivestreams.Publisher.collect]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/collect.html
-[org.reactivestreams.Publisher.openSubscription]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-reactive/kotlinx.coroutines.reactive/org.reactivestreams.-publisher/open-subscription.html
-<!--- MODULE kotlinx-coroutines-rx2 -->
-<!--- INDEX kotlinx.coroutines.rx2 -->
-[rxFlowable]: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-rx2/kotlinx.coroutines.rx2/rx-flowable.html
-<!--- END -->
-
-
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-01.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-01.kt
deleted file mode 100644
index f3bc344..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-01.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic01
-
-import kotlinx.coroutines.*
-import kotlinx.coroutines.channels.*
-import kotlin.coroutines.*
-
-fun main() = runBlocking<Unit> {
-    // create a channel that produces numbers from 1 to 3 with 200ms delays between them
-    val source = produce<Int> {
-        println("Begin") // mark the beginning of this coroutine in output
-        for (x in 1..3) {
-            delay(200) // wait for 200ms
-            send(x) // send number x to the channel
-        }
-    }
-    // print elements from the source
-    println("Elements:")
-    source.consumeEach { // consume elements from it
-        println(it)
-    }
-    // print elements from the source AGAIN
-    println("Again:")
-    source.consumeEach { // consume elements from it
-        println(it)
-    }
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-02.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-02.kt
deleted file mode 100644
index 0e0ff2e..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-02.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic02
-
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlin.coroutines.*
-
-fun main() = runBlocking<Unit> {
-    // create a publisher that produces numbers from 1 to 3 with 200ms delays between them
-    val source = publish<Int> {
-    //           ^^^^^^^  <---  Difference from the previous examples is here
-        println("Begin") // mark the beginning of this coroutine in output
-        for (x in 1..3) {
-            delay(200) // wait for 200ms
-            send(x) // send number x to the channel
-        }
-    }
-    // print elements from the source
-    println("Elements:")
-    source.collect { // collect elements from it
-        println(it)
-    }
-    // print elements from the source AGAIN
-    println("Again:")
-    source.collect { // collect elements from it
-        println(it)
-    }
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-03.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-03.kt
deleted file mode 100644
index b84fc08..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-03.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic03
-
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.channels.*
-import kotlinx.coroutines.reactive.*
-
-fun main() = runBlocking<Unit> {
-    val source = Flowable.range(1, 5) // a range of five numbers
-        .doOnSubscribe { println("OnSubscribe") } // provide some insight
-        .doOnComplete { println("OnComplete") }   // ...
-        .doFinally { println("Finally") }         // ... into what's going on
-    var cnt = 0 
-    source.openSubscription().consume { // open channel to the source
-        for (x in this) { // iterate over the channel to receive elements from it
-            println(x)
-            if (++cnt >= 3) break // break when 3 elements are printed
-        }
-        // Note: `consume` cancels the channel when this block of code is complete
-    }
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-04.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-04.kt
deleted file mode 100644
index a08c41f..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-04.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic04
-
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlin.coroutines.*
-
-fun main() = runBlocking<Unit> {
-    val source = Flowable.range(1, 5) // a range of five numbers
-        .doOnSubscribe { println("OnSubscribe") } // provide some insight
-        .doOnComplete { println("OnComplete") }   // ...
-        .doFinally { println("Finally") }         // ... into what's going on
-    // collect the source fully
-    source.collect { println(it) }
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-05.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-05.kt
deleted file mode 100644
index e6428b9..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-05.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic05
-
-import io.reactivex.schedulers.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.rx2.*
-import kotlin.coroutines.*
-
-fun main() = runBlocking<Unit> { 
-    // coroutine -- fast producer of elements in the context of the main thread
-    val source = rxFlowable {
-        for (x in 1..3) {
-            send(x) // this is a suspending function
-            println("Sent $x") // print after successfully sent item
-        }
-    }
-    // subscribe on another thread with a slow subscriber using Rx
-    source
-        .observeOn(Schedulers.io(), false, 1) // specify buffer size of 1 item
-        .doOnComplete { println("Complete") }
-        .subscribe { x ->
-            Thread.sleep(500) // 500ms to process each item
-            println("Processed $x")
-        }
-    delay(2000) // suspend the main thread for a few seconds
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-06.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-06.kt
deleted file mode 100644
index 1f3747f..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-06.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic06
-
-import io.reactivex.subjects.BehaviorSubject
-
-fun main() {
-    val subject = BehaviorSubject.create<String>()
-    subject.onNext("one")
-    subject.onNext("two") // updates the state of BehaviorSubject, "one" value is lost
-    // now subscribe to this subject and print everything
-    subject.subscribe(System.out::println)
-    subject.onNext("three")
-    subject.onNext("four")
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-07.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-07.kt
deleted file mode 100644
index b4cc9fc..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-07.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic07
-
-import io.reactivex.subjects.BehaviorSubject
-import kotlinx.coroutines.*
-import kotlinx.coroutines.rx2.collect
-
-fun main() = runBlocking<Unit> {
-    val subject = BehaviorSubject.create<String>()
-    subject.onNext("one")
-    subject.onNext("two")
-    // now launch a coroutine to print everything
-    GlobalScope.launch(Dispatchers.Unconfined) { // launch coroutine in unconfined context
-        subject.collect { println(it) }
-    }
-    subject.onNext("three")
-    subject.onNext("four")
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-08.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-08.kt
deleted file mode 100644
index 8e17ac9..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-08.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic08
-
-import io.reactivex.subjects.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.rx2.*
-import kotlin.coroutines.*
-
-fun main() = runBlocking<Unit> {
-    val subject = BehaviorSubject.create<String>()
-    subject.onNext("one")
-    subject.onNext("two")
-    // now launch a coroutine to print the most recent update
-    launch { // use the context of the main thread for a coroutine
-        subject.collect { println(it) }
-    }
-    subject.onNext("three")
-    subject.onNext("four")
-    yield() // yield the main thread to the launched coroutine <--- HERE
-    subject.onComplete() // now complete the subject's sequence to cancel the consumer, too    
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-09.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-09.kt
deleted file mode 100644
index 738c4ab..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-basic-09.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.basic09
-
-import kotlinx.coroutines.channels.*
-import kotlinx.coroutines.*
-import kotlin.coroutines.*
-
-fun main() = runBlocking<Unit> {
-    val broadcast = ConflatedBroadcastChannel<String>()
-    broadcast.offer("one")
-    broadcast.offer("two")
-    // now launch a coroutine to print the most recent update
-    launch { // use the context of the main thread for a coroutine
-        broadcast.consumeEach { println(it) }
-    }
-    broadcast.offer("three")
-    broadcast.offer("four")
-    yield() // yield the main thread to the launched coroutine
-    broadcast.close() // now close the broadcast channel to cancel the consumer, too    
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-01.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-01.kt
deleted file mode 100644
index b12e92a..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-01.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.context01
-
-import io.reactivex.*
-import io.reactivex.functions.BiFunction
-import io.reactivex.schedulers.Schedulers
-import java.util.concurrent.TimeUnit
-
-fun rangeWithIntervalRx(scheduler: Scheduler, time: Long, start: Int, count: Int): Flowable<Int> = 
-    Flowable.zip(
-        Flowable.range(start, count),
-        Flowable.interval(time, TimeUnit.MILLISECONDS, scheduler),
-        BiFunction { x, _ -> x })
-
-fun main() {
-    rangeWithIntervalRx(Schedulers.computation(), 100, 1, 3)
-        .subscribe { println("$it on thread ${Thread.currentThread().name}") }
-    Thread.sleep(1000)
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-02.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-02.kt
deleted file mode 100644
index b87849a..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-02.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.context02
-
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlin.coroutines.CoroutineContext
-
-fun rangeWithInterval(context: CoroutineContext, time: Long, start: Int, count: Int) = publish<Int>(context) {
-    for (x in start until start + count) { 
-        delay(time) // wait before sending each number
-        send(x)
-    }
-}
-
-fun main() {
-    Flowable.fromPublisher(rangeWithInterval(Dispatchers.Default, 100, 1, 3))
-        .subscribe { println("$it on thread ${Thread.currentThread().name}") }
-    Thread.sleep(1000)
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-03.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-03.kt
deleted file mode 100644
index 1a214ce..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-03.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.context03
-
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import io.reactivex.schedulers.Schedulers
-import kotlin.coroutines.CoroutineContext
-
-fun rangeWithInterval(context: CoroutineContext, time: Long, start: Int, count: Int) = publish<Int>(context) {
-    for (x in start until start + count) { 
-        delay(time) // wait before sending each number
-        send(x)
-    }
-}
-
-fun main() {
-    Flowable.fromPublisher(rangeWithInterval(Dispatchers.Default, 100, 1, 3))
-        .observeOn(Schedulers.computation())                           // <-- THIS LINE IS ADDED
-        .subscribe { println("$it on thread ${Thread.currentThread().name}") }
-    Thread.sleep(1000)
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-04.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-04.kt
deleted file mode 100644
index 3c5d3fb..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-04.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.context04
-
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import io.reactivex.functions.BiFunction
-import io.reactivex.schedulers.Schedulers
-import java.util.concurrent.TimeUnit
-
-fun rangeWithIntervalRx(scheduler: Scheduler, time: Long, start: Int, count: Int): Flowable<Int> =
-    Flowable.zip(
-        Flowable.range(start, count),
-        Flowable.interval(time, TimeUnit.MILLISECONDS, scheduler),
-        BiFunction { x, _ -> x })
-
-fun main() = runBlocking<Unit> {
-    rangeWithIntervalRx(Schedulers.computation(), 100, 1, 3)
-        .collect { println("$it on thread ${Thread.currentThread().name}") }
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-05.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-05.kt
deleted file mode 100644
index 61b54b2..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-context-05.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.context05
-
-import io.reactivex.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import io.reactivex.functions.BiFunction
-import io.reactivex.schedulers.Schedulers
-import java.util.concurrent.TimeUnit
-
-fun rangeWithIntervalRx(scheduler: Scheduler, time: Long, start: Int, count: Int): Flowable<Int> =
-    Flowable.zip(
-        Flowable.range(start, count),
-        Flowable.interval(time, TimeUnit.MILLISECONDS, scheduler),
-        BiFunction { x, _ -> x })
-
-fun main() = runBlocking<Unit> {
-    val job = launch(Dispatchers.Unconfined) { // launch a new coroutine in Unconfined context (without its own thread pool)
-        rangeWithIntervalRx(Schedulers.computation(), 100, 1, 3)
-            .collect { println("$it on thread ${Thread.currentThread().name}") }
-    }
-    job.join() // wait for our coroutine to complete
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-01.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-01.kt
deleted file mode 100644
index 8268ef2..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-01.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.operators01
-
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlin.coroutines.CoroutineContext
-
-fun CoroutineScope.range(context: CoroutineContext, start: Int, count: Int) = publish<Int>(context) {
-    for (x in start until start + count) send(x)
-}
-
-fun main() = runBlocking<Unit> {
-    // Range inherits parent job from runBlocking, but overrides dispatcher with Dispatchers.Default
-    range(Dispatchers.Default, 1, 5).collect { println(it) }
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-02.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-02.kt
deleted file mode 100644
index 5f07ba4..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-02.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.operators02
-
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import org.reactivestreams.*
-import kotlin.coroutines.*
-
-fun <T, R> Publisher<T>.fusedFilterMap(
-    context: CoroutineContext,   // the context to execute this coroutine in
-    predicate: (T) -> Boolean,   // the filter predicate
-    mapper: (T) -> R             // the mapper function
-) = publish<R>(context) {
-    collect {                    // collect the source stream 
-        if (predicate(it))       // filter part
-            send(mapper(it))     // map part
-    }        
-}
-
-fun CoroutineScope.range(start: Int, count: Int) = publish<Int> {
-    for (x in start until start + count) send(x)
-}
-
-fun main() = runBlocking<Unit> {
-   range(1, 5)
-       .fusedFilterMap(Dispatchers.Unconfined, { it % 2 == 0}, { "$it is even" })
-       .collect { println(it) } // print all the resulting strings
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-03.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-03.kt
deleted file mode 100644
index 818a792..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-03.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.operators03
-
-import kotlinx.coroutines.channels.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import kotlinx.coroutines.selects.*
-import org.reactivestreams.*
-import kotlin.coroutines.*
-
-fun <T, U> Publisher<T>.takeUntil(context: CoroutineContext, other: Publisher<U>) = publish<T>(context) {
-    this@takeUntil.openSubscription().consume { // explicitly open channel to Publisher<T>
-        val current = this
-        other.openSubscription().consume { // explicitly open channel to Publisher<U>
-            val other = this
-            whileSelect {
-                other.onReceive { false }            // bail out on any received element from `other`
-                current.onReceive { send(it); true } // resend element from this channel and continue
-            }
-        }
-    }
-}
-
-fun CoroutineScope.rangeWithInterval(time: Long, start: Int, count: Int) = publish<Int> {
-    for (x in start until start + count) { 
-        delay(time) // wait before sending each number
-        send(x)
-    }
-}
-
-fun main() = runBlocking<Unit> {
-    val slowNums = rangeWithInterval(200, 1, 10)         // numbers with 200ms interval
-    val stop = rangeWithInterval(500, 1, 10)             // the first one after 500ms
-    slowNums.takeUntil(Dispatchers.Unconfined, stop).collect { println(it) } // let's test it
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-04.kt b/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-04.kt
deleted file mode 100644
index 12d9c1f..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/example-reactive-operators-04.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.operators04
-
-import kotlinx.coroutines.*
-import kotlinx.coroutines.reactive.*
-import org.reactivestreams.*
-import kotlin.coroutines.*
-
-fun <T> Publisher<Publisher<T>>.merge(context: CoroutineContext) = publish<T>(context) {
-  collect { pub -> // for each publisher collected
-      launch {  // launch a child coroutine
-          pub.collect { send(it) } // resend all element from this publisher
-      }
-  }
-}
-
-fun CoroutineScope.rangeWithInterval(time: Long, start: Int, count: Int) = publish<Int> {
-    for (x in start until start + count) { 
-        delay(time) // wait before sending each number
-        send(x)
-    }
-}
-
-fun CoroutineScope.testPub() = publish<Publisher<Int>> {
-    send(rangeWithInterval(250, 1, 4)) // number 1 at 250ms, 2 at 500ms, 3 at 750ms, 4 at 1000ms 
-    delay(100) // wait for 100 ms
-    send(rangeWithInterval(500, 11, 3)) // number 11 at 600ms, 12 at 1100ms, 13 at 1600ms
-    delay(1100) // wait for 1.1s - done in 1.2 sec after start
-}
-
-fun main() = runBlocking<Unit> {
-    testPub().merge(Dispatchers.Unconfined).collect { println(it) } // print the whole stream
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/test/GuideReactiveTest.kt b/reactive/kotlinx-coroutines-rx2/test/guide/test/GuideReactiveTest.kt
deleted file mode 100644
index cebfc7b..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/test/GuideReactiveTest.kt
+++ /dev/null
@@ -1,191 +0,0 @@
-// This file was automatically generated from coroutines-guide-reactive.md by Knit tool. Do not edit.
-package kotlinx.coroutines.rx2.guide.test
-
-import kotlinx.coroutines.guide.test.*
-import org.junit.Test
-
-class GuideReactiveTest : ReactiveTestBase() {
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic01() {
-        test("KotlinxCoroutinesRx2GuideBasic01") { kotlinx.coroutines.rx2.guide.basic01.main() }.verifyLines(
-            "Elements:",
-            "Begin",
-            "1",
-            "2",
-            "3",
-            "Again:"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic02() {
-        test("KotlinxCoroutinesRx2GuideBasic02") { kotlinx.coroutines.rx2.guide.basic02.main() }.verifyLines(
-            "Elements:",
-            "Begin",
-            "1",
-            "2",
-            "3",
-            "Again:",
-            "Begin",
-            "1",
-            "2",
-            "3"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic03() {
-        test("KotlinxCoroutinesRx2GuideBasic03") { kotlinx.coroutines.rx2.guide.basic03.main() }.verifyLines(
-            "OnSubscribe",
-            "1",
-            "2",
-            "3",
-            "Finally"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic04() {
-        test("KotlinxCoroutinesRx2GuideBasic04") { kotlinx.coroutines.rx2.guide.basic04.main() }.verifyLines(
-            "OnSubscribe",
-            "1",
-            "2",
-            "3",
-            "OnComplete",
-            "Finally",
-            "4",
-            "5"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic05() {
-        test("KotlinxCoroutinesRx2GuideBasic05") { kotlinx.coroutines.rx2.guide.basic05.main() }.verifyLines(
-            "Sent 1",
-            "Processed 1",
-            "Sent 2",
-            "Processed 2",
-            "Sent 3",
-            "Processed 3",
-            "Complete"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic06() {
-        test("KotlinxCoroutinesRx2GuideBasic06") { kotlinx.coroutines.rx2.guide.basic06.main() }.verifyLines(
-            "two",
-            "three",
-            "four"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic07() {
-        test("KotlinxCoroutinesRx2GuideBasic07") { kotlinx.coroutines.rx2.guide.basic07.main() }.verifyLines(
-            "two",
-            "three",
-            "four"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic08() {
-        test("KotlinxCoroutinesRx2GuideBasic08") { kotlinx.coroutines.rx2.guide.basic08.main() }.verifyLines(
-            "four"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideBasic09() {
-        test("KotlinxCoroutinesRx2GuideBasic09") { kotlinx.coroutines.rx2.guide.basic09.main() }.verifyLines(
-            "four"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideOperators01() {
-        test("KotlinxCoroutinesRx2GuideOperators01") { kotlinx.coroutines.rx2.guide.operators01.main() }.verifyLines(
-            "1",
-            "2",
-            "3",
-            "4",
-            "5"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideOperators02() {
-        test("KotlinxCoroutinesRx2GuideOperators02") { kotlinx.coroutines.rx2.guide.operators02.main() }.verifyLines(
-            "2 is even",
-            "4 is even"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideOperators03() {
-        test("KotlinxCoroutinesRx2GuideOperators03") { kotlinx.coroutines.rx2.guide.operators03.main() }.verifyLines(
-            "1",
-            "2"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideOperators04() {
-        test("KotlinxCoroutinesRx2GuideOperators04") { kotlinx.coroutines.rx2.guide.operators04.main() }.verifyLines(
-            "1",
-            "2",
-            "11",
-            "3",
-            "4",
-            "12",
-            "13"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideContext01() {
-        test("KotlinxCoroutinesRx2GuideContext01") { kotlinx.coroutines.rx2.guide.context01.main() }.verifyLinesFlexibleThread(
-            "1 on thread RxComputationThreadPool-1",
-            "2 on thread RxComputationThreadPool-1",
-            "3 on thread RxComputationThreadPool-1"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideContext02() {
-        test("KotlinxCoroutinesRx2GuideContext02") { kotlinx.coroutines.rx2.guide.context02.main() }.verifyLinesStart(
-            "1 on thread ForkJoinPool.commonPool-worker-1",
-            "2 on thread ForkJoinPool.commonPool-worker-1",
-            "3 on thread ForkJoinPool.commonPool-worker-1"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideContext03() {
-        test("KotlinxCoroutinesRx2GuideContext03") { kotlinx.coroutines.rx2.guide.context03.main() }.verifyLinesFlexibleThread(
-            "1 on thread RxComputationThreadPool-1",
-            "2 on thread RxComputationThreadPool-1",
-            "3 on thread RxComputationThreadPool-1"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideContext04() {
-        test("KotlinxCoroutinesRx2GuideContext04") { kotlinx.coroutines.rx2.guide.context04.main() }.verifyLinesStart(
-            "1 on thread main",
-            "2 on thread main",
-            "3 on thread main"
-        )
-    }
-
-    @Test
-    fun testKotlinxCoroutinesRx2GuideContext05() {
-        test("KotlinxCoroutinesRx2GuideContext05") { kotlinx.coroutines.rx2.guide.context05.main() }.verifyLinesStart(
-            "1 on thread RxComputationThreadPool-1",
-            "2 on thread RxComputationThreadPool-1",
-            "3 on thread RxComputationThreadPool-1"
-        )
-    }
-}
diff --git a/reactive/kotlinx-coroutines-rx2/test/guide/test/ReactiveTestBase.kt b/reactive/kotlinx-coroutines-rx2/test/guide/test/ReactiveTestBase.kt
deleted file mode 100644
index 3bedb62..0000000
--- a/reactive/kotlinx-coroutines-rx2/test/guide/test/ReactiveTestBase.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
- */
-
-package kotlinx.coroutines.rx2.guide.test
-
-import io.reactivex.*
-import io.reactivex.disposables.*
-import io.reactivex.plugins.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.guide.test.*
-import org.junit.*
-import java.util.concurrent.*
-
-open class ReactiveTestBase {
-    @Before
-    fun setup() {
-        RxJavaPlugins.setIoSchedulerHandler(Handler)
-        RxJavaPlugins.setComputationSchedulerHandler(Handler)
-        ignoreLostThreads(
-            "RxComputationThreadPool-",
-            "RxCachedThreadScheduler-",
-            "RxCachedWorkerPoolEvictor-",
-            "RxSchedulerPurge-")
-    }
-
-    @After
-    fun tearDown() {
-        RxJavaPlugins.setIoSchedulerHandler(null)
-        RxJavaPlugins.setComputationSchedulerHandler(null)
-    }
-}
-
-private object Handler : io.reactivex.functions.Function<Scheduler, Scheduler> {
-    override fun apply(t: Scheduler): Scheduler = WrapperScheduler(t)
-}
-
-private class WrapperScheduler(private val scheduler: Scheduler) : Scheduler() {
-    override fun createWorker(): Worker = WrapperWorker(scheduler.createWorker())
-}
-
-private class WrapperWorker(private val worker: Scheduler.Worker) : Scheduler.Worker() {
-    override fun isDisposed(): Boolean = worker.isDisposed
-    override fun dispose() = worker.dispose()
-    override fun schedule(run: Runnable, delay: Long, unit: TimeUnit): Disposable =
-        worker.schedule(wrapTask(run), delay, unit)
-}