Make deprecated API hidden, replace deprecated API with new one
diff --git a/common/kotlinx-coroutines-core-common/src/main/kotlin/kotlinx/coroutines/experimental/CancellableContinuation.kt b/common/kotlinx-coroutines-core-common/src/main/kotlin/kotlinx/coroutines/experimental/CancellableContinuation.kt
index 882b2cc..718a601 100644
--- a/common/kotlinx-coroutines-core-common/src/main/kotlin/kotlinx/coroutines/experimental/CancellableContinuation.kt
+++ b/common/kotlinx-coroutines-core-common/src/main/kotlin/kotlinx/coroutines/experimental/CancellableContinuation.kt
@@ -130,7 +130,7 @@
     @Deprecated(
         message = "Disposable handlers on regular completion are no longer supported",
         replaceWith = ReplaceWith("invokeOnCancellation(handler)"),
-        level = DeprecationLevel.WARNING)
+        level = DeprecationLevel.HIDDEN)
     public fun invokeOnCompletion(handler: CompletionHandler): DisposableHandle
 
     /**
@@ -209,7 +209,7 @@
 @Deprecated(
     message = "Disposable handlers on cancellation are no longer supported",
     replaceWith = ReplaceWith("removeOnCancellation(handler)"),
-    level = DeprecationLevel.WARNING)
+    level = DeprecationLevel.HIDDEN)
 public fun CancellableContinuation<*>.removeOnCancel(node: LockFreeLinkedListNode): DisposableHandle {
     invokeOnCancellation(handler = RemoveOnCancel(this as CancellableContinuationImpl<*>, node).asHandler)
     return NonDisposableHandle
@@ -222,15 +222,31 @@
 public fun CancellableContinuation<*>.removeOnCancellation(node: LockFreeLinkedListNode): Unit =
     invokeOnCancellation(handler = RemoveOnCancel(this as CancellableContinuationImpl<*>, node).asHandler)
 
+/**
+ * Disposes a specified [handle] when this continuation is cancelled.
+ *
+ * This is a shortcut for the following code with slightly more efficient implementation (one fewer object created).
+ * ```
+ * invokeOnCancellation { handle.dispose() }
+ * ```
+ */
 @Deprecated(
     message = "Disposable handlers on regular completion are no longer supported",
     replaceWith = ReplaceWith("disposeOnCancellation(handler)"),
-    level = DeprecationLevel.WARNING)
+    level = DeprecationLevel.HIDDEN)
 public fun CancellableContinuation<*>.disposeOnCompletion(handle: DisposableHandle): DisposableHandle {
     invokeOnCancellation(handler = DisposeOnCancellation(this as CancellableContinuationImpl<*>, handle).asHandler)
     return NonDisposableHandle
 }
 
+/**
+ * Disposes a specified [handle] when this continuation is cancelled.
+ *
+ * This is a shortcut for the following code with slightly more efficient implementation (one fewer object created).
+ * ```
+ * invokeOnCancellation { handle.dispose() }
+ * ```
+ */
 public fun CancellableContinuation<*>.disposeOnCancellation(handle: DisposableHandle) =
     invokeOnCancellation(handler = DisposeOnCancellation(this as CancellableContinuationImpl<*>, handle).asHandler)
 
diff --git a/common/kotlinx-coroutines-core-common/src/main/kotlin/kotlinx/coroutines/experimental/sync/Mutex.kt b/common/kotlinx-coroutines-core-common/src/main/kotlin/kotlinx/coroutines/experimental/sync/Mutex.kt
index 9807059..7c650c5 100644
--- a/common/kotlinx-coroutines-core-common/src/main/kotlin/kotlinx/coroutines/experimental/sync/Mutex.kt
+++ b/common/kotlinx-coroutines-core-common/src/main/kotlin/kotlinx/coroutines/experimental/sync/Mutex.kt
@@ -230,7 +230,7 @@
                     if (state.addLastIf(waiter, { _state.value === state })) {
                         // added to waiter list!
                         cont.initCancellability() // make it properly cancellable
-                        cont.removeOnCancel(waiter)
+                        cont.removeOnCancellation(waiter)
                         return@sc
                     }
                 }
diff --git a/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Executors.kt b/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Executors.kt
index f20753a..67f3b34 100644
--- a/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Executors.kt
+++ b/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Executors.kt
@@ -72,7 +72,7 @@
                 ?.schedule(ResumeUndispatchedRunnable(this, continuation), time, unit) }
             catch (e: RejectedExecutionException) { null }
         if (timeout != null)
-            continuation.cancelFutureOnCompletion(timeout)
+            continuation.cancelFutureOnCancellation(timeout)
         else
             DefaultExecutor.scheduleResumeAfterDelay(time, unit, continuation)
     }
diff --git a/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Future.kt b/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Future.kt
index 6909b99..3490d14 100644
--- a/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Future.kt
+++ b/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Future.kt
@@ -41,7 +41,7 @@
 @Deprecated(
     message = "Disposable handlers on regular completion are no longer supported",
     replaceWith = ReplaceWith("cancelFutureOnCancellation(future)"),
-    level = DeprecationLevel.WARNING)
+    level = DeprecationLevel.HIDDEN)
 public fun CancellableContinuation<*>.cancelFutureOnCompletion(future: Future<*>): DisposableHandle {
     cancelFutureOnCancellation(future)
     return NonDisposableHandle
diff --git a/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/channels/AbstractChannel.kt b/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/channels/AbstractChannel.kt
index 4ce28da..5db28ba 100644
--- a/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/channels/AbstractChannel.kt
+++ b/core/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/channels/AbstractChannel.kt
@@ -193,7 +193,7 @@
             when (enqueueResult) {
                 null -> { // enqueued successfully
                     cont.initCancellability() // make it properly cancellable
-                    cont.removeOnCancel(send)
+                    cont.removeOnCancellation(send)
                     return@sc
                 }
                 is Closed<*> -> {
@@ -769,8 +769,8 @@
     // ------ private ------
 
     private fun removeReceiveOnCancel(cont: CancellableContinuation<*>, receive: Receive<*>) {
-        cont.invokeOnCompletion {
-            if (cont.isCancelled && receive.remove())
+        cont.invokeOnCancellation {
+            if (receive.remove())
                 onReceiveDequeued()
         }
     }
diff --git a/integration/kotlinx-coroutines-guava/src/main/kotlin/kotlinx/coroutines/experimental/guava/ListenableFuture.kt b/integration/kotlinx-coroutines-guava/src/main/kotlin/kotlinx/coroutines/experimental/guava/ListenableFuture.kt
index 81bbbb5..cec625b 100644
--- a/integration/kotlinx-coroutines-guava/src/main/kotlin/kotlinx/coroutines/experimental/guava/ListenableFuture.kt
+++ b/integration/kotlinx-coroutines-guava/src/main/kotlin/kotlinx/coroutines/experimental/guava/ListenableFuture.kt
@@ -129,7 +129,7 @@
 public suspend fun <T> ListenableFuture<T>.await(): T = suspendCancellableCoroutine { cont: CancellableContinuation<T> ->
     val callback = ContinuationCallback(cont)
     Futures.addCallback(this, callback)
-    cont.invokeOnCompletion {
+    cont.invokeOnCancellation {
         callback.cont = null // clear the reference to continuation from the future's callback
     }
 }
diff --git a/integration/kotlinx-coroutines-jdk8/src/main/kotlin/kotlinx/coroutines/experimental/future/Future.kt b/integration/kotlinx-coroutines-jdk8/src/main/kotlin/kotlinx/coroutines/experimental/future/Future.kt
index ee908e3..89846bd 100644
--- a/integration/kotlinx-coroutines-jdk8/src/main/kotlin/kotlinx/coroutines/experimental/future/Future.kt
+++ b/integration/kotlinx-coroutines-jdk8/src/main/kotlin/kotlinx/coroutines/experimental/future/Future.kt
@@ -176,7 +176,7 @@
     return suspendCancellableCoroutine { cont: CancellableContinuation<T> ->
         val consumer = ContinuationConsumer(cont)
         whenComplete(consumer)
-        cont.invokeOnCompletion {
+        cont.invokeOnCancellation {
             consumer.cont = null // shall clear reference to continuation
         }
     }
diff --git a/integration/kotlinx-coroutines-nio/src/main/kotlin/kotlinx/coroutines/experimental/nio/Nio.kt b/integration/kotlinx-coroutines-nio/src/main/kotlin/kotlinx/coroutines/experimental/nio/Nio.kt
index 7fabfeb..fdcdee3 100644
--- a/integration/kotlinx-coroutines-nio/src/main/kotlin/kotlinx/coroutines/experimental/nio/Nio.kt
+++ b/integration/kotlinx-coroutines-nio/src/main/kotlin/kotlinx/coroutines/experimental/nio/Nio.kt
@@ -136,8 +136,7 @@
 // ---------------- private details ----------------
 
 private fun Channel.closeOnCancel(cont: CancellableContinuation<*>) {
-    cont.invokeOnCompletion {
-        if (cont.isCancelled)
+    cont.invokeOnCancellation {
             try {
                 close()
             } catch (ex: Throwable) {
diff --git a/integration/kotlinx-coroutines-quasar/src/main/kotlin/kotlinx/coroutines/experimental/quasar/Quasar.kt b/integration/kotlinx-coroutines-quasar/src/main/kotlin/kotlinx/coroutines/experimental/quasar/Quasar.kt
index a88ef8e..ff53e06 100644
--- a/integration/kotlinx-coroutines-quasar/src/main/kotlin/kotlinx/coroutines/experimental/quasar/Quasar.kt
+++ b/integration/kotlinx-coroutines-quasar/src/main/kotlin/kotlinx/coroutines/experimental/quasar/Quasar.kt
@@ -37,9 +37,7 @@
 import co.paralleluniverse.fibers.SuspendExecution
 import co.paralleluniverse.fibers.Suspendable
 import co.paralleluniverse.strands.SuspendableCallable
-import kotlinx.coroutines.experimental.asCoroutineDispatcher
-import kotlinx.coroutines.experimental.cancelFutureOnCompletion
-import kotlinx.coroutines.experimental.suspendCancellableCoroutine
+import kotlinx.coroutines.experimental.*
 import kotlin.coroutines.experimental.Continuation
 import kotlin.coroutines.experimental.CoroutineContext
 import kotlin.coroutines.experimental.startCoroutine
@@ -59,7 +57,7 @@
             cont.resume(result)
         }
     }
-    cont.cancelFutureOnCompletion(fiber)
+    cont.cancelFutureOnCancellation(fiber)
     fiber.start()
 }
 
diff --git a/reactive/kotlinx-coroutines-reactive/src/main/kotlin/kotlinx/coroutines/experimental/reactive/Await.kt b/reactive/kotlinx-coroutines-reactive/src/main/kotlin/kotlinx/coroutines/experimental/reactive/Await.kt
index 62a9cc6..f283ba0 100644
--- a/reactive/kotlinx-coroutines-reactive/src/main/kotlin/kotlinx/coroutines/experimental/reactive/Await.kt
+++ b/reactive/kotlinx-coroutines-reactive/src/main/kotlin/kotlinx/coroutines/experimental/reactive/Await.kt
@@ -111,7 +111,7 @@
 
         override fun onSubscribe(sub: Subscription) {
             subscription = sub
-            cont.invokeOnCompletion { sub.cancel() }
+            cont.invokeOnCancellation { sub.cancel() }
             sub.request(if (mode == Mode.FIRST) 1 else Long.MAX_VALUE)
         }
 
diff --git a/reactive/kotlinx-coroutines-reactor/src/main/kotlin/kotlinx/coroutines/experimental/reactor/Scheduler.kt b/reactive/kotlinx-coroutines-reactor/src/main/kotlin/kotlinx/coroutines/experimental/reactor/Scheduler.kt
index f0d3d10..857df2c 100644
--- a/reactive/kotlinx-coroutines-reactor/src/main/kotlin/kotlinx/coroutines/experimental/reactor/Scheduler.kt
+++ b/reactive/kotlinx-coroutines-reactor/src/main/kotlin/kotlinx/coroutines/experimental/reactor/Scheduler.kt
@@ -24,7 +24,7 @@
         val disposable = scheduler.schedule({
             with(continuation) { resumeUndispatched(Unit) }
         }, time, unit)
-        continuation.disposeOnCompletion(disposable.asDisposableHandle())
+        continuation.disposeOnCancellation(disposable.asDisposableHandle())
     }
 
     override fun invokeOnTimeout(time: Long, unit: TimeUnit, block: Runnable): DisposableHandle =
diff --git a/reactive/kotlinx-coroutines-rx1/src/main/kotlin/kotlinx/coroutines/experimental/rx1/RxAwait.kt b/reactive/kotlinx-coroutines-rx1/src/main/kotlin/kotlinx/coroutines/experimental/rx1/RxAwait.kt
index b8e68a2..0a567a7 100644
--- a/reactive/kotlinx-coroutines-rx1/src/main/kotlin/kotlinx/coroutines/experimental/rx1/RxAwait.kt
+++ b/reactive/kotlinx-coroutines-rx1/src/main/kotlin/kotlinx/coroutines/experimental/rx1/RxAwait.kt
@@ -137,5 +137,5 @@
 }
 
 internal fun <T> CancellableContinuation<T>.unsubscribeOnCompletion(sub: Subscription) {
-    invokeOnCompletion { sub.unsubscribe() }
+    invokeOnCancellation { sub.unsubscribe() }
 }
diff --git a/reactive/kotlinx-coroutines-rx2/src/main/kotlin/kotlinx/coroutines/experimental/rx2/RxAwait.kt b/reactive/kotlinx-coroutines-rx2/src/main/kotlin/kotlinx/coroutines/experimental/rx2/RxAwait.kt
index c8f8df9..d0a5167 100644
--- a/reactive/kotlinx-coroutines-rx2/src/main/kotlin/kotlinx/coroutines/experimental/rx2/RxAwait.kt
+++ b/reactive/kotlinx-coroutines-rx2/src/main/kotlin/kotlinx/coroutines/experimental/rx2/RxAwait.kt
@@ -162,7 +162,7 @@
 // ------------------------ private ------------------------
 
 internal fun CancellableContinuation<*>.disposeOnCompletion(d: Disposable) =
-    invokeOnCompletion { d.dispose() }
+    invokeOnCancellation { d.dispose() }
 
 private enum class Mode(val s: String) {
     FIRST("awaitFirst"),
@@ -183,7 +183,7 @@
 
         override fun onSubscribe(sub: Disposable) {
             subscription = sub
-            cont.invokeOnCompletion { sub.dispose() }
+            cont.invokeOnCancellation { sub.dispose() }
         }
 
         override fun onNext(t: T) {
diff --git a/ui/kotlinx-coroutines-javafx/src/main/kotlin/kotlinx/coroutines/experimental/javafx/JavaFx.kt b/ui/kotlinx-coroutines-javafx/src/main/kotlin/kotlinx/coroutines/experimental/javafx/JavaFx.kt
index 21b35c8..3cec28b 100644
--- a/ui/kotlinx-coroutines-javafx/src/main/kotlin/kotlinx/coroutines/experimental/javafx/JavaFx.kt
+++ b/ui/kotlinx-coroutines-javafx/src/main/kotlin/kotlinx/coroutines/experimental/javafx/JavaFx.kt
@@ -58,7 +58,7 @@
         val timeline = schedule(time, unit, EventHandler<ActionEvent> {
             with(continuation) { resumeUndispatched(Unit) }
         })
-        continuation.invokeOnCompletion { timeline.stop() }
+        continuation.invokeOnCancellation { timeline.stop() }
     }
 
     override fun invokeOnTimeout(time: Long, unit: TimeUnit, block: Runnable): DisposableHandle {
diff --git a/ui/kotlinx-coroutines-swing/src/main/kotlin/kotlinx/coroutines/experimental/swing/Swing.kt b/ui/kotlinx-coroutines-swing/src/main/kotlin/kotlinx/coroutines/experimental/swing/Swing.kt
index 44695c6..a901c58 100644
--- a/ui/kotlinx-coroutines-swing/src/main/kotlin/kotlinx/coroutines/experimental/swing/Swing.kt
+++ b/ui/kotlinx-coroutines-swing/src/main/kotlin/kotlinx/coroutines/experimental/swing/Swing.kt
@@ -37,7 +37,7 @@
         val timer = schedule(time, unit, ActionListener {
             with(continuation) { resumeUndispatched(Unit) }
         })
-        continuation.invokeOnCompletion { timer.stop() }
+        continuation.invokeOnCancellation { timer.stop() }
     }
 
     override fun invokeOnTimeout(time: Long, unit: TimeUnit, block: Runnable): DisposableHandle {