Initial load
diff --git a/test/java/io/BufferedReader/ReadLine.java b/test/java/io/BufferedReader/ReadLine.java
new file mode 100644
index 0000000..0b66668
--- /dev/null
+++ b/test/java/io/BufferedReader/ReadLine.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 1999 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4151072
+ * @summary Ensure that BufferedReader's methods handle the new line character
+ *          following the carriage return correctly after a readLine
+ *          operation that resulted in reading a line terminated by a
+ *          carriage return (\r).
+ */
+import java.io.*;
+
+public class ReadLine {
+
+    public static void main(String[] args) throws IOException {
+        // Make sure that the reader does not wait for additional characters to
+        // be read after reading a new line.
+        BufferedReader reader;
+        String[][] strings = {
+            {"CR/LF\r\n", "CR/LF"},
+            {"LF-Only\n", "LF-Only"},
+            {"CR-Only\r", "CR-Only"},
+            {"CR/LF line\r\nMore data", "More data"}
+        };
+
+        // test 0 "CR/LF\r\n"
+        // test 1 "LF-Only\n"
+        // test 2 "CR-Only\r"
+        for (int i = 0; i < 3; i++) {
+            reader = new BufferedReader(new
+                    BoundedReader(strings[i][0]), strings[i][0].length());
+            if (!reader.readLine().equals(strings[i][1]))
+                throw new RuntimeException("Read incorrect text");
+        }
+
+
+        // Now test the mark and reset operations. Consider two cases.
+        // 1. For lines ending with CR only.
+        markResetTest("Lot of textual data\rMore textual data\n",
+                "More textual data");
+
+        // 2. Now for lines ending with CR/LF
+        markResetTest("Lot of textual data\r\nMore textual data\n",
+                "More textual data");
+
+        // 3. Now for lines ending with LF only
+        markResetTest("Lot of textual data\nMore textual data\n",
+                "More textual data");
+
+        // Need to ensure behavior of read() after a readLine() read of a CR/LF
+        // terminated line.
+        // 1.  For lines ending with CR/LF only.
+
+        // uses "CR/LF line\r\nMore data"
+        reader = new BufferedReader(new
+                BoundedReader(strings[3][0]), strings[3][0].length());
+        reader.readLine();
+        if (reader.read() != 'M')
+            throw new RuntimeException("Read() failed");
+
+
+        // Need to ensure that a read(char[], int, int) following a readLine()
+        // read of a CR/LF terminated line behaves correctly.
+
+        // uses "CR/LF line\r\nMore data"
+        reader = new BufferedReader(new
+                BoundedReader(strings[3][0]), strings[3][0].length());
+        reader.readLine();
+
+        char[] buf = new char[9];
+        reader.read(buf, 0, 9);
+        String newStr = new String(buf);
+        if (!newStr.equals(strings[3][1]))
+            throw new RuntimeException("Read(char[],int,int) failed");
+    }
+
+    static void markResetTest(String inputStr, String resetStr)
+        throws IOException {
+        BufferedReader reader = new BufferedReader(new
+                BoundedReader(inputStr), inputStr.length());
+        System.out.println("> " + reader.readLine());
+        reader.mark(30);
+        System.out.println("......Marking stream .....");
+        String str = reader.readLine();
+        System.out.println("> " + str);
+        reader.reset();
+        String newStr = reader.readLine();
+        System.out.println("reset> " + newStr);
+
+        // Make sure that the reset point was set correctly.
+        if (!newStr.equals(resetStr))
+            throw new RuntimeException("Mark/Reset failed");
+    }
+
+
+    private static class BoundedReader extends Reader{
+
+        private char[] content;
+        private int limit;
+        private int pos = 0;
+
+        public BoundedReader(String content) {
+            this.limit = content.length();
+            this.content = new char[limit];
+            content.getChars(0, limit, this.content, 0);
+        }
+
+        public int read() throws IOException {
+            if (pos >= limit)
+                throw new RuntimeException("Read past limit");
+            return content[pos++];
+        }
+
+        public int read(char[] buf, int offset, int length)
+            throws IOException
+        {
+            int oldPos = pos;
+            for (int i = offset; i < length; i++) {
+                buf[i] = (char)read();
+            }
+            return (pos - oldPos);
+        }
+
+        public void close() {}
+    }
+
+}