diff --git a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/JobTest.kt b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/JobTest.kt
index 89368d2..232ac99 100644
--- a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/JobTest.kt
+++ b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/JobTest.kt
@@ -6,109 +6,109 @@
 class JobTest {
     @Test
     fun testState() {
-        val lifetime = JobSupport()
-        assertTrue(lifetime.isActive)
-        lifetime.cancel()
-        assertFalse(lifetime.isActive)
+        val job = JobSupport()
+        assertTrue(job.isActive)
+        job.cancel()
+        assertFalse(job.isActive)
     }
 
     @Test
     fun testHandler() {
-        val lifetime = JobSupport()
+        val job = JobSupport()
         var fireCount = 0
-        lifetime.onCompletion { fireCount++ }
-        assertTrue(lifetime.isActive)
+        job.onCompletion { fireCount++ }
+        assertTrue(job.isActive)
         assertEquals(0, fireCount)
         // cancel once
-        lifetime.cancel()
-        assertFalse(lifetime.isActive)
+        job.cancel()
+        assertFalse(job.isActive)
         assertEquals(1, fireCount)
         // cancel again
-        lifetime.cancel()
-        assertFalse(lifetime.isActive)
+        job.cancel()
+        assertFalse(job.isActive)
         assertEquals(1, fireCount)
     }
 
     @Test
     fun testManyHandlers() {
-        val lifetime = JobSupport()
+        val job = JobSupport()
         val n = 100
         val fireCount = IntArray(n)
-        for (i in 0 until n) lifetime.onCompletion { fireCount[i]++ }
-        assertTrue(lifetime.isActive)
+        for (i in 0 until n) job.onCompletion { fireCount[i]++ }
+        assertTrue(job.isActive)
         for (i in 0 until n) assertEquals(0, fireCount[i])
         // cancel once
-        lifetime.cancel()
-        assertFalse(lifetime.isActive)
+        job.cancel()
+        assertFalse(job.isActive)
         for (i in 0 until n) assertEquals(1, fireCount[i])
         // cancel again
-        lifetime.cancel()
-        assertFalse(lifetime.isActive)
+        job.cancel()
+        assertFalse(job.isActive)
         for (i in 0 until n) assertEquals(1, fireCount[i])
     }
 
     @Test
     fun testUnregisterInHandler() {
-        val lifetime = JobSupport()
+        val job = JobSupport()
         val n = 100
         val fireCount = IntArray(n)
         for (i in 0 until n) {
             var registration: Job.Registration? = null
-            registration = lifetime.onCompletion {
+            registration = job.onCompletion {
                 fireCount[i]++
                 registration!!.unregister()
             }
         }
-        assertTrue(lifetime.isActive)
+        assertTrue(job.isActive)
         for (i in 0 until n) assertEquals(0, fireCount[i])
         // cancel once
-        lifetime.cancel()
-        assertFalse(lifetime.isActive)
+        job.cancel()
+        assertFalse(job.isActive)
         for (i in 0 until n) assertEquals(1, fireCount[i])
         // cancel again
-        lifetime.cancel()
-        assertFalse(lifetime.isActive)
+        job.cancel()
+        assertFalse(job.isActive)
         for (i in 0 until n) assertEquals(1, fireCount[i])
     }
 
     @Test
     fun testManyHandlersWithUnregister() {
-        val lifetime = JobSupport()
+        val job = JobSupport()
         val n = 100
         val fireCount = IntArray(n)
-        val registrations = Array<Job.Registration>(n) { i -> lifetime.onCompletion { fireCount[i]++ } }
-        assertTrue(lifetime.isActive)
+        val registrations = Array<Job.Registration>(n) { i -> job.onCompletion { fireCount[i]++ } }
+        assertTrue(job.isActive)
         fun unreg(i: Int) = i % 4 <= 1
         for (i in 0 until n) if (unreg(i)) registrations[i].unregister()
         for (i in 0 until n) assertEquals(0, fireCount[i])
-        lifetime.cancel()
-        assertFalse(lifetime.isActive)
+        job.cancel()
+        assertFalse(job.isActive)
         for (i in 0 until n) assertEquals(if (unreg(i)) 0 else 1, fireCount[i])
     }
 
     @Test
     fun testExceptionsInHandler() {
-        val lifetime = JobSupport()
+        val job = JobSupport()
         val n = 100
         val fireCount = IntArray(n)
         class TestException : Throwable()
-        for (i in 0 until n) lifetime.onCompletion {
+        for (i in 0 until n) job.onCompletion {
             fireCount[i]++
             throw TestException()
         }
-        assertTrue(lifetime.isActive)
+        assertTrue(job.isActive)
         for (i in 0 until n) assertEquals(0, fireCount[i])
-        val tryCancel = `try`<Unit> { lifetime.cancel() }
-        assertFalse(lifetime.isActive)
+        val tryCancel = Try<Unit> { job.cancel() }
+        assertFalse(job.isActive)
         for (i in 0 until n) assertEquals(1, fireCount[i])
         assertTrue(tryCancel.exception is TestException)
     }
 
     @Test
     fun testMemoryRelease() {
-        val lifetime = JobSupport()
+        val job = JobSupport()
         val n = 10_000_000
         var fireCount = 0
-        for (i in 0 until n) lifetime.onCompletion { fireCount++ }.unregister()
+        for (i in 0 until n) job.onCompletion { fireCount++ }.unregister()
     }
 }
\ No newline at end of file
diff --git a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/try.kt b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/Try.kt
similarity index 65%
rename from kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/try.kt
rename to kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/Try.kt
index b3302bc..8f42ebc 100644
--- a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/try.kt
+++ b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/Try.kt
@@ -1,15 +1,15 @@
 package kotlinx.coroutines.experimental
 
-public class `try`<out T> private constructor(private val _value: Any?) {
+public class Try<out T> private constructor(private val _value: Any?) {
     private class Fail(val exception: Throwable) {
         override fun toString(): String = "Failure[$exception]"
     }
 
     public companion object {
-        public operator fun <T> invoke(block: () -> T): `try`<T> =
+        public operator fun <T> invoke(block: () -> T): Try<T> =
                 try { Success(block()) } catch(e: Throwable) { Failure<T>(e) }
-        public fun <T> Success(value: T) = `try`<T>(value)
-        public fun <T> Failure(exception: Throwable) = `try`<T>(Fail(exception))
+        public fun <T> Success(value: T) = Try<T>(value)
+        public fun <T> Failure(exception: Throwable) = Try<T>(Fail(exception))
     }
 
     @Suppress("UNCHECKED_CAST")
