diff --git a/user/super/com/google/gwt/emul/java/io/Writer.java b/user/super/com/google/gwt/emul/java/io/Writer.java
index 4bba793..a2e34e2 100644
--- a/user/super/com/google/gwt/emul/java/io/Writer.java
+++ b/user/super/com/google/gwt/emul/java/io/Writer.java
@@ -15,8 +15,8 @@
  */
 package java.io;
 
+import static javaemul.internal.InternalPreconditions.checkCriticalStringBounds;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
-import static javaemul.internal.InternalPreconditions.checkPositionIndexes;
 
 import java.util.Objects;
 
@@ -57,7 +57,6 @@
   }
 
   public void write(String str, int offset, int count) throws IOException {
-    IOUtils.checkOffsetAndCount(str, offset, count);
     char[] buf = new char[count];
     str.getChars(offset, offset + count, buf, 0);
     write(buf, 0, buf.length);
@@ -77,7 +76,15 @@
     if (csq == null) {
       csq = "null";
     }
-    checkPositionIndexes(start, end, csq.length());
+    /*
+     * Ensure we throw StringIndexOutOfBoundsException as String#subsequence method depends on
+     * JavaScript's string#substr() which has different behaviour than original Java method.
+     *
+     * JavaScript behaviour of substr(start, length):
+     * "gwt".substr(0, -1) returns ""
+     * "gwt".substr(-1, 1) returns "t" -> Calculates substring from end.
+     */
+    checkCriticalStringBounds(start, end, csq.length());
     write(csq.subSequence(start, end).toString());
     return this;
   }
diff --git a/user/test/com/google/gwt/emultest/java/io/OutputStreamWriterTest.java b/user/test/com/google/gwt/emultest/java/io/OutputStreamWriterTest.java
index 49ae2b2..a9b9e25 100644
--- a/user/test/com/google/gwt/emultest/java/io/OutputStreamWriterTest.java
+++ b/user/test/com/google/gwt/emultest/java/io/OutputStreamWriterTest.java
@@ -78,11 +78,13 @@
 
   public void testWriteUnicodeChar() throws IOException {
     writer.write(UNICODE_STRING, 0, UNICODE_STRING.length());
+    writer.close();
     assertTrue(Arrays.equals(UNICODE_STRING.getBytes(encodingUTF8Charset), baos.toByteArray()));
   }
 
   public void testWriteASCIIChar() throws IOException {
     writer.write(ASCII_CHAR_ARRAY, 0, ASCII_CHAR_ARRAY.length);
+    writer.close();
     assertTrue(
         Arrays.equals(
             new String(ASCII_CHAR_ARRAY).getBytes(encodingUTF8Charset), baos.toByteArray()));
diff --git a/user/test/com/google/gwt/emultest/java/io/WriterTest.java b/user/test/com/google/gwt/emultest/java/io/WriterTest.java
index 7df1001..adbae10 100644
--- a/user/test/com/google/gwt/emultest/java/io/WriterTest.java
+++ b/user/test/com/google/gwt/emultest/java/io/WriterTest.java
@@ -122,8 +122,8 @@
     final CharSequence csq = "hola";
     try {
       writer.append(csq, -1, 2);
-      fail("should have thrown IndexOutOfBoundsException");
-    } catch (IndexOutOfBoundsException expected) {
+      fail("should have thrown StringIndexOutOfBoundsException");
+    } catch (StringIndexOutOfBoundsException expected) {
     }
   }
 
@@ -131,8 +131,8 @@
     final CharSequence csq = "hola";
     try {
       writer.append(csq, 0, -1);
-      fail("should have thrown IndexOutOfBoundsException");
-    } catch (IllegalArgumentException expected) {
+      fail("should have thrown StringIndexOutOfBoundsException");
+    } catch (StringIndexOutOfBoundsException expected) {
     }
   }
 
@@ -140,8 +140,8 @@
     final CharSequence csq = "hola";
     try {
       writer.append(csq, 2, 1);
-      fail("should have thrown IndexOutOfBoundsException");
-    } catch (IllegalArgumentException expected) {
+      fail("should have thrown StringIndexOutOfBoundsException");
+    } catch (StringIndexOutOfBoundsException expected) {
     }
   }
 
@@ -213,8 +213,8 @@
     final String str = "hola";
     try {
       writer.append(str, -1, 2);
-      fail("should have thrown IndexOutOfBoundsException");
-    } catch (IndexOutOfBoundsException expected) {
+      fail("should have thrown StringIndexOutOfBoundsException");
+    } catch (StringIndexOutOfBoundsException expected) {
     }
   }
 
@@ -222,8 +222,8 @@
     final String str = "hola";
     try {
       writer.append(str, 0, -1);
-      fail("should have thrown IndexOutOfBoundsException");
-    } catch (IllegalArgumentException expected) {
+      fail("should have thrown StringIndexOutOfBoundsException");
+    } catch (StringIndexOutOfBoundsException expected) {
     }
   }
 
@@ -231,8 +231,8 @@
     final String str = "hola";
     try {
       writer.append(str, 2, 1);
-      fail("should have thrown IndexOutOfBoundsException");
-    } catch (IllegalArgumentException expected) {
+      fail("should have thrown StringIndexOutOfBoundsException");
+    } catch (StringIndexOutOfBoundsException expected) {
     }
   }
 
