Merge branch 'master' into develop
diff --git a/README.md b/README.md
index bb32cf1..f7fb384 100644
--- a/README.md
+++ b/README.md
@@ -108,6 +108,32 @@
 }
 ```
 
+### Gradle Kotlin DSL
+
+Add dependencies (you can also add other modules that you need):
+
+```groovy
+dependencies {
+    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:0.30.2")
+}
+```
+
+And make sure that you use the latest Kotlin version:
+
+```groovy
+plugins {
+    kotlin("jvm") version "1.2.70"
+}
+```
+
+Make sure that you have either `jcenter()` or `mavenCentral()` in the list of repositories:
+
+```
+repository {
+    jcenter()
+}
+```
+
 ### Multiplatform
 
 Core modules of `kotlinx.coroutines` are also available for 
diff --git a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-io.txt b/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-io.txt
deleted file mode 100644
index 95c0cec..0000000
--- a/binary-compatibility-validator/reference-public-api/kotlinx-coroutines-io.txt
+++ /dev/null
@@ -1,259 +0,0 @@
-public abstract interface class kotlinx/coroutines/experimental/io/ByteChannel : kotlinx/coroutines/experimental/io/ByteReadChannel, kotlinx/coroutines/experimental/io/ByteWriteChannel {
-}
-
-public final class kotlinx/coroutines/experimental/io/ByteChannel$DefaultImpls {
-	public static fun readAvailable (Lkotlinx/coroutines/experimental/io/ByteChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static fun readFully (Lkotlinx/coroutines/experimental/io/ByteChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static fun writeAvailable (Lkotlinx/coroutines/experimental/io/ByteChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static fun writeFully (Lkotlinx/coroutines/experimental/io/ByteChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/ByteChannelKt {
-	public static final fun ByteChannel (Z)Lkotlinx/coroutines/experimental/io/ByteChannel;
-	public static synthetic fun ByteChannel$default (ZILjava/lang/Object;)Lkotlinx/coroutines/experimental/io/ByteChannel;
-	public static final fun ByteReadChannel (Ljava/nio/ByteBuffer;)Lkotlinx/coroutines/experimental/io/ByteReadChannel;
-	public static final fun ByteReadChannel ([B)Lkotlinx/coroutines/experimental/io/ByteReadChannel;
-	public static final fun getEmptyByteReadChannel ()Lkotlinx/coroutines/experimental/io/ByteReadChannel;
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/ByteReadChannel {
-	public abstract fun cancel (Ljava/lang/Throwable;)Z
-	public abstract fun consumeEachBufferRange (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun discard (JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun getAvailableForRead ()I
-	public abstract fun getReadByteOrder ()Lkotlinx/io/core/ByteOrder;
-	public abstract fun getTotalBytesRead ()J
-	public abstract fun isClosedForRead ()Z
-	public abstract fun isClosedForWrite ()Z
-	public abstract fun lookAhead (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
-	public abstract fun lookAheadSuspend (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun read (ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readAvailable (Ljava/nio/ByteBuffer;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readAvailable (Lkotlinx/io/core/BufferView;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readAvailable ([BIILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readAvailable ([BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readBoolean (Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readByte (Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readDouble (Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readFloat (Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readFully (Ljava/nio/ByteBuffer;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readFully ([BIILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readFully ([BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readInt (Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readLong (Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readPacket (IILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readShort (Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun readUTF8LineTo (Ljava/lang/Appendable;ILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun setReadByteOrder (Lkotlinx/io/core/ByteOrder;)V
-}
-
-public final class kotlinx/coroutines/experimental/io/ByteReadChannel$DefaultImpls {
-	public static synthetic fun cancel$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z
-	public static synthetic fun discard$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static synthetic fun read$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static fun readAvailable (Lkotlinx/coroutines/experimental/io/ByteReadChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static fun readFully (Lkotlinx/coroutines/experimental/io/ByteReadChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun readPacket$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;IILkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static synthetic fun readUTF8LineTo$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/lang/Appendable;ILkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/ByteReadChannelKt {
-	public static final fun copyAndClose (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun copyAndClose$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static final fun copyTo (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun copyTo$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static final fun joinTo (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;ZZLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun joinTo$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;ZZLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static final fun readRemaining (Lkotlinx/coroutines/experimental/io/ByteReadChannel;ILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun readRemaining$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;ILkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/ByteWriteChannel {
-	public abstract fun close (Ljava/lang/Throwable;)Z
-	public abstract fun flush ()V
-	public abstract fun getAutoFlush ()Z
-	public abstract fun getAvailableForWrite ()I
-	public abstract fun getClosedCause ()Ljava/lang/Throwable;
-	public abstract fun getTotalBytesWritten ()J
-	public abstract fun getWriteByteOrder ()Lkotlinx/io/core/ByteOrder;
-	public abstract fun isClosedForWrite ()Z
-	public abstract fun setWriteByteOrder (Lkotlinx/io/core/ByteOrder;)V
-	public abstract fun write (ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeAvailable (Ljava/nio/ByteBuffer;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeAvailable (Lkotlinx/io/core/BufferView;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeAvailable ([BIILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeAvailable ([BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeByte (BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeDouble (DLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeFloat (FLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeFully (Ljava/nio/ByteBuffer;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeFully (Lkotlinx/io/core/BufferView;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeFully ([BIILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeFully ([BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeInt (ILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeLong (JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writePacket (Lkotlinx/io/core/ByteReadPacket;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeShort (SLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeSuspendSession (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public abstract fun writeWhile (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/ByteWriteChannel$DefaultImpls {
-	public static synthetic fun close$default (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Ljava/lang/Throwable;ILjava/lang/Object;)Z
-	public static synthetic fun write$default (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static fun writeAvailable (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static fun writeFully (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/ByteWriteChannelKt {
-	public static final fun writeBoolean (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;ZLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeByte (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;ILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeChar (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;CLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeInt (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writePacketSuspend (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeShort (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;ILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeStringUtf8 (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Ljava/lang/CharSequence;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeStringUtf8 (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Ljava/lang/String;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeStringUtf8 (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Ljava/nio/CharBuffer;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/ClosedWriteChannelException : java/util/concurrent/CancellationException {
-	public fun <init> (Ljava/lang/String;)V
-}
-
-public final class kotlinx/coroutines/experimental/io/DelimitedKt {
-	public static final fun readUntilDelimiter (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun skipDelimiter (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/nio/ByteBuffer;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/LookAheadSession {
-	public abstract fun consumed (I)V
-	public abstract fun request (II)Ljava/nio/ByteBuffer;
-}
-
-public final class kotlinx/coroutines/experimental/io/LookAheadSessionKt {
-	public static final fun consumeEachRemaining (Lkotlinx/coroutines/experimental/io/LookAheadSession;Lkotlin/jvm/functions/Function1;)V
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/LookAheadSuspendSession : kotlinx/coroutines/experimental/io/LookAheadSession {
-	public abstract fun awaitAtLeast (ILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/MigrationUtilsKt {
-	public static final fun write (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;[BIILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun write (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;[BLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeBytes (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Ljava/lang/String;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeChars (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Ljava/lang/String;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun writeUTF (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Ljava/lang/String;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/ReaderJob : kotlinx/coroutines/experimental/Job {
-	public abstract fun getChannel ()Lkotlinx/coroutines/experimental/io/ByteWriteChannel;
-}
-
-public final class kotlinx/coroutines/experimental/io/ReaderJob$DefaultImpls {
-	public static fun fold (Lkotlinx/coroutines/experimental/io/ReaderJob;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
-	public static fun get (Lkotlinx/coroutines/experimental/io/ReaderJob;Lkotlin/coroutines/experimental/CoroutineContext$Key;)Lkotlin/coroutines/experimental/CoroutineContext$Element;
-	public static fun getCompletionException (Lkotlinx/coroutines/experimental/io/ReaderJob;)Ljava/lang/Throwable;
-	public static fun minusKey (Lkotlinx/coroutines/experimental/io/ReaderJob;Lkotlin/coroutines/experimental/CoroutineContext$Key;)Lkotlin/coroutines/experimental/CoroutineContext;
-	public static fun plus (Lkotlinx/coroutines/experimental/io/ReaderJob;Lkotlin/coroutines/experimental/CoroutineContext;)Lkotlin/coroutines/experimental/CoroutineContext;
-	public static fun plus (Lkotlinx/coroutines/experimental/io/ReaderJob;Lkotlinx/coroutines/experimental/Job;)Lkotlinx/coroutines/experimental/Job;
-}
-
-public final class kotlinx/coroutines/experimental/io/ReaderJobKt {
-	public static final fun reader (Lkotlin/coroutines/experimental/CoroutineContext;Lkotlinx/coroutines/experimental/io/ByteChannel;Lkotlinx/coroutines/experimental/Job;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/experimental/io/ReaderJob;
-	public static final fun reader (Lkotlin/coroutines/experimental/CoroutineContext;ZLkotlinx/coroutines/experimental/Job;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/experimental/io/ReaderJob;
-	public static synthetic fun reader$default (Lkotlin/coroutines/experimental/CoroutineContext;Lkotlinx/coroutines/experimental/io/ByteChannel;Lkotlinx/coroutines/experimental/Job;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/experimental/io/ReaderJob;
-	public static synthetic fun reader$default (Lkotlin/coroutines/experimental/CoroutineContext;ZLkotlinx/coroutines/experimental/Job;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/experimental/io/ReaderJob;
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/ReaderScope : kotlinx/coroutines/experimental/CoroutineScope {
-	public abstract fun getChannel ()Lkotlinx/coroutines/experimental/io/ByteReadChannel;
-}
-
-public final class kotlinx/coroutines/experimental/io/StringsKt {
-	public static final fun readASCIILine (Lkotlinx/coroutines/experimental/io/ByteReadChannel;IILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun readASCIILine$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;IILkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static final fun readLine (Lkotlinx/coroutines/experimental/io/ByteReadChannel;IILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun readLine$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;IILkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static final fun readUTF8Line (Lkotlinx/coroutines/experimental/io/ByteReadChannel;IILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun readUTF8Line$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;IILkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/WriterJob : kotlinx/coroutines/experimental/Job {
-	public abstract fun getChannel ()Lkotlinx/coroutines/experimental/io/ByteReadChannel;
-}
-
-public final class kotlinx/coroutines/experimental/io/WriterJob$DefaultImpls {
-	public static fun fold (Lkotlinx/coroutines/experimental/io/WriterJob;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object;
-	public static fun get (Lkotlinx/coroutines/experimental/io/WriterJob;Lkotlin/coroutines/experimental/CoroutineContext$Key;)Lkotlin/coroutines/experimental/CoroutineContext$Element;
-	public static fun getCompletionException (Lkotlinx/coroutines/experimental/io/WriterJob;)Ljava/lang/Throwable;
-	public static fun minusKey (Lkotlinx/coroutines/experimental/io/WriterJob;Lkotlin/coroutines/experimental/CoroutineContext$Key;)Lkotlin/coroutines/experimental/CoroutineContext;
-	public static fun plus (Lkotlinx/coroutines/experimental/io/WriterJob;Lkotlin/coroutines/experimental/CoroutineContext;)Lkotlin/coroutines/experimental/CoroutineContext;
-	public static fun plus (Lkotlinx/coroutines/experimental/io/WriterJob;Lkotlinx/coroutines/experimental/Job;)Lkotlinx/coroutines/experimental/Job;
-}
-
-public final class kotlinx/coroutines/experimental/io/WriterJobKt {
-	public static final fun writer (Lkotlin/coroutines/experimental/CoroutineContext;Lkotlinx/coroutines/experimental/io/ByteChannel;Lkotlinx/coroutines/experimental/Job;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/experimental/io/WriterJob;
-	public static final fun writer (Lkotlin/coroutines/experimental/CoroutineContext;ZLkotlinx/coroutines/experimental/Job;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/experimental/io/WriterJob;
-	public static synthetic fun writer$default (Lkotlin/coroutines/experimental/CoroutineContext;Lkotlinx/coroutines/experimental/io/ByteChannel;Lkotlinx/coroutines/experimental/Job;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/experimental/io/WriterJob;
-	public static synthetic fun writer$default (Lkotlin/coroutines/experimental/CoroutineContext;ZLkotlinx/coroutines/experimental/Job;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/experimental/io/WriterJob;
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/WriterScope : kotlinx/coroutines/experimental/CoroutineScope {
-	public abstract fun getChannel ()Lkotlinx/coroutines/experimental/io/ByteWriteChannel;
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/WriterSession {
-	public abstract fun request (I)Ljava/nio/ByteBuffer;
-	public abstract fun written (I)V
-}
-
-public abstract interface class kotlinx/coroutines/experimental/io/WriterSuspendSession : kotlinx/coroutines/experimental/io/WriterSession {
-	public abstract fun tryAwait (ILkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/internal/InlineRendezvousSwapKt {
-	public static final fun main ([Ljava/lang/String;)V
-}
-
-public final class kotlinx/coroutines/experimental/io/jvm/javaio/BlockingKt {
-	public static final fun toInputStream (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Lkotlinx/coroutines/experimental/Job;)Ljava/io/InputStream;
-	public static synthetic fun toInputStream$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Lkotlinx/coroutines/experimental/Job;ILjava/lang/Object;)Ljava/io/InputStream;
-	public static final fun toOutputStream (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Lkotlinx/coroutines/experimental/Job;)Ljava/io/OutputStream;
-	public static synthetic fun toOutputStream$default (Lkotlinx/coroutines/experimental/io/ByteWriteChannel;Lkotlinx/coroutines/experimental/Job;ILjava/lang/Object;)Ljava/io/OutputStream;
-}
-
-public final class kotlinx/coroutines/experimental/io/jvm/javaio/ReadingKt {
-	public static final fun copyTo (Ljava/io/InputStream;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun copyTo$default (Ljava/io/InputStream;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/jvm/javaio/WritingKt {
-	public static final fun copyTo (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/io/OutputStream;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun copyTo$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/io/OutputStream;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/jvm/nio/ReadingKt {
-	public static final fun copyTo (Ljava/nio/channels/Pipe;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun copyTo (Ljava/nio/channels/ReadableByteChannel;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun copyTo$default (Ljava/nio/channels/Pipe;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static synthetic fun copyTo$default (Ljava/nio/channels/ReadableByteChannel;Lkotlinx/coroutines/experimental/io/ByteWriteChannel;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/jvm/nio/WritingKt {
-	public static final fun copyTo (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/nio/channels/Pipe;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static final fun copyTo (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/nio/channels/WritableByteChannel;JLkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;
-	public static synthetic fun copyTo$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/nio/channels/Pipe;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-	public static synthetic fun copyTo$default (Lkotlinx/coroutines/experimental/io/ByteReadChannel;Ljava/nio/channels/WritableByteChannel;JLkotlin/coroutines/experimental/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
-}
-
-public final class kotlinx/coroutines/experimental/io/packet/ByteReadPacketEmptyKt {
-	public static final fun getByteReadPacketEmpty ()Lkotlinx/io/core/ByteReadPacket;
-}
-
-public final class kotlinx/coroutines/experimental/io/packet/PacketsKt {
-	public static final fun WritePacket (I)Lkotlinx/io/core/BytePacketBuilder;
-	public static synthetic fun WritePacket$default (IILjava/lang/Object;)Lkotlinx/io/core/BytePacketBuilder;
-}
-
diff --git a/core/kotlinx-coroutines-core/src/EventLoop.kt b/core/kotlinx-coroutines-core/src/EventLoop.kt
index 45af38c..8461f82 100644
--- a/core/kotlinx-coroutines-core/src/EventLoop.kt
+++ b/core/kotlinx-coroutines-core/src/EventLoop.kt
@@ -261,7 +261,7 @@
             _delayed.compareAndSet(null, ThreadSafeHeap())
             _delayed.value!!
         }
-        return delayedTask.schedule(delayed)
+        return delayedTask.schedule(delayed, this)
     }
 
     internal fun removeDelayedImpl(delayedTask: DelayedTask) {
@@ -289,7 +289,7 @@
         }
     }
 
-    internal abstract inner class DelayedTask(
+    internal abstract class DelayedTask(
         timeMillis: Long
     ) : Runnable, Comparable<DelayedTask>, DisposableHandle, ThreadSafeHeapNode {
         private var _heap: Any? = null // null | ThreadSafeHeap | DISPOSED_TASK
@@ -317,9 +317,9 @@
         fun timeToExecute(now: Long): Boolean = now - nanoTime >= 0L
 
         @Synchronized
-        fun schedule(delayed: ThreadSafeHeap<DelayedTask>): Int {
+        fun schedule(delayed: ThreadSafeHeap<DelayedTask>, eventLoop: EventLoopBase): Int {
             if (_heap === DISPOSED_TASK) return SCHEDULE_DISPOSED // don't add -- was already disposed
-            return if (delayed.addLastIf(this) { !isCompleted }) SCHEDULE_OK else SCHEDULE_COMPLETED
+            return if (delayed.addLastIf(this) { !eventLoop.isCompleted }) SCHEDULE_OK else SCHEDULE_COMPLETED
         }
 
         // note: DefaultExecutor.schedule performs `schedule` (above) which does sync & checks for DISPOSED_TASK
@@ -352,7 +352,7 @@
     }
 
     // Cannot be moved to DefaultExecutor due to BE bug
-    internal inner class DelayedRunnableTask(
+    internal class DelayedRunnableTask(
         time: Long,
         private val block: Runnable
     ) : DelayedTask(time) {
diff --git a/core/kotlinx-coroutines-core/test/RunBlockingTest.kt b/core/kotlinx-coroutines-core/test/RunBlockingTest.kt
index 02b1002..79e6533 100644
--- a/core/kotlinx-coroutines-core/test/RunBlockingTest.kt
+++ b/core/kotlinx-coroutines-core/test/RunBlockingTest.kt
@@ -103,4 +103,39 @@
             finish(4)
         }
     }
+
+    @Test(expected = CancellationException::class)
+    fun testDispatchOnShutdown() = runBlocking<Unit> {
+        expect(1)
+        val job = launch(NonCancellable) {
+            try {
+                expect(2)
+                delay(Long.MAX_VALUE)
+            } finally {
+                finish(4)
+            }
+        }
+
+        yield()
+        expect(3)
+        coroutineContext.cancel()
+        job.cancel()
+    }
+
+    @Test(expected = CancellationException::class)
+    fun testDispatchOnShutdown2() = runBlocking<Unit> {
+        coroutineContext.cancel()
+        expect(1)
+        val job = launch(NonCancellable, start = CoroutineStart.UNDISPATCHED) {
+            try {
+                expect(2)
+                delay(Long.MAX_VALUE)
+            } finally {
+                finish(4)
+            }
+        }
+
+        expect(3)
+        job.cancel()
+    }
 }