Merge
authorlana
Thu, 14 Apr 2016 09:34:00 -0700
changeset 37392 b0c4db80286f
parent 37388 e141cade23b4 (current diff)
parent 37391 f2750c003cfb (diff)
child 37393 a9ba8bd6697b
Merge
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTool.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTool.java	Thu Apr 14 09:34:00 2016 -0700
@@ -45,6 +45,7 @@
 import com.sun.tools.javac.main.Arguments;
 import com.sun.tools.javac.main.Option;
 import com.sun.tools.javac.file.BaseFileManager;
+import com.sun.tools.javac.file.CacheFSInfo;
 import com.sun.tools.javac.util.ClientCodeException;
 import com.sun.tools.javac.util.Context;
 import com.sun.tools.javac.util.DefinedBy;
@@ -95,6 +96,7 @@
                 ? new PrintWriter(System.err, true)
                 : new PrintWriter(new OutputStreamWriter(System.err, charset), true);
         context.put(Log.outKey, pw);
+        CacheFSInfo.preRegister(context);
         return new JavacFileManager(context, true, charset);
     }
 
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java	Thu Apr 14 09:34:00 2016 -0700
@@ -42,6 +42,7 @@
 import java.nio.file.LinkOption;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.ProviderNotFoundException;
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
@@ -266,30 +267,137 @@
         System.out.println(message);
     }
 
-    /**
-     * Insert all files in a subdirectory of the platform image
-     * which match fileKinds into resultList.
-     */
-    private void listJRTImage(RelativeDirectory subdirectory,
-                               Set<JavaFileObject.Kind> fileKinds,
-                               boolean recurse,
-                               ListBuffer<JavaFileObject> resultList) throws IOException {
-        JRTIndex.Entry e = getJRTIndex().getEntry(subdirectory);
-        if (symbolFileEnabled && e.ctSym.hidden)
-            return;
-        for (Path file: e.files.values()) {
-            if (fileKinds.contains(getKind(file))) {
-                JavaFileObject fe
-                        = PathFileObject.forJRTPath(JavacFileManager.this, file);
-                resultList.append(fe);
+    private final Map<Path, Container> containers = new HashMap<>();
+
+    synchronized Container getContainer(Path path) throws IOException {
+        Container fs = containers.get(path);
+
+        if (fs != null) {
+            return fs;
+        }
+
+        if (fsInfo.isFile(path) && path.equals(Locations.thisSystemModules)) {
+            containers.put(path, fs = new JRTImageContainer());
+            return fs;
+        }
+
+        Path realPath = fsInfo.getCanonicalFile(path);
+
+        fs = containers.get(realPath);
+
+        if (fs != null) {
+            containers.put(path, fs);
+            return fs;
+        }
+
+        BasicFileAttributes attr = null;
+
+        try {
+            attr = Files.readAttributes(realPath, BasicFileAttributes.class);
+        } catch (IOException ex) {
+            //non-existing
+            fs = MISSING_CONTAINER;
+        }
+
+        if (attr != null) {
+            if (attr.isDirectory()) {
+                fs = new DirectoryContainer(realPath);
+            } else {
+                try {
+                    fs = new ArchiveContainer(realPath);
+                } catch (ProviderNotFoundException | SecurityException ex) {
+                    throw new IOException(ex);
+                }
             }
         }
 
-        if (recurse) {
-            for (RelativeDirectory rd: e.subdirs) {
-                listJRTImage(rd, fileKinds, recurse, resultList);
+        containers.put(realPath, fs);
+        containers.put(path, fs);
+
+        return fs;
+    }
+
+    private interface Container {
+        /**
+         * Insert all files in subdirectory subdirectory of container which
+         * match fileKinds into resultList
+         */
+        public abstract void list(Path userPath,
+                                  RelativeDirectory subdirectory,
+                                  Set<JavaFileObject.Kind> fileKinds,
+                                  boolean recurse,
+                                  ListBuffer<JavaFileObject> resultList) throws IOException;
+        public abstract JavaFileObject getFileObject(Path userPath, RelativeFile name) throws IOException;
+        public abstract void close() throws IOException;
+    }
+
+    private static final Container MISSING_CONTAINER =  new Container() {
+        @Override
+        public void list(Path userPath,
+                         RelativeDirectory subdirectory,
+                         Set<JavaFileObject.Kind> fileKinds,
+                         boolean recurse,
+                         ListBuffer<JavaFileObject> resultList) throws IOException {
+        }
+        @Override
+        public JavaFileObject getFileObject(Path userPath, RelativeFile name) throws IOException {
+            return null;
+        }
+        @Override
+        public void close() throws IOException {}
+    };
+
+    private final class JRTImageContainer implements Container {
+
+        /**
+         * Insert all files in a subdirectory of the platform image
+         * which match fileKinds into resultList.
+         */
+        @Override
+        public void list(Path userPath,
+                         RelativeDirectory subdirectory,
+                         Set<JavaFileObject.Kind> fileKinds,
+                         boolean recurse,
+                         ListBuffer<JavaFileObject> resultList) throws IOException {
+            try {
+                JRTIndex.Entry e = getJRTIndex().getEntry(subdirectory);
+                if (symbolFileEnabled && e.ctSym.hidden)
+                    return;
+                for (Path file: e.files.values()) {
+                    if (fileKinds.contains(getKind(file))) {
+                        JavaFileObject fe
+                                = PathFileObject.forJRTPath(JavacFileManager.this, file);
+                        resultList.append(fe);
+                    }
+                }
+
+                if (recurse) {
+                    for (RelativeDirectory rd: e.subdirs) {
+                        list(userPath, rd, fileKinds, recurse, resultList);
+                    }
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace(System.err);
+                log.error("error.reading.file", userPath, getMessage(ex));
             }
         }
+
+        @Override
+        public JavaFileObject getFileObject(Path userPath, RelativeFile name) throws IOException {
+            JRTIndex.Entry e = getJRTIndex().getEntry(name.dirname());
+            if (symbolFileEnabled && e.ctSym.hidden)
+                return null;
+            Path p = e.files.get(name.basename());
+            if (p != null) {
+                return PathFileObject.forJRTPath(JavacFileManager.this, p);
+            } else {
+                return null;
+            }
+        }
+
+        @Override
+        public void close() throws IOException {
+        }
     }
 
     private synchronized JRTIndex getJRTIndex() {
@@ -300,164 +408,179 @@
 
     private JRTIndex jrtIndex;
 
+    private final class DirectoryContainer implements Container {
+        private final Path directory;
 
-    /**
-     * Insert all files in subdirectory subdirectory of directory directory
-     * which match fileKinds into resultList
-     */
-    private void listDirectory(Path directory, Path realDirectory,
-                               RelativeDirectory subdirectory,
-                               Set<JavaFileObject.Kind> fileKinds,
-                               boolean recurse,
-                               ListBuffer<JavaFileObject> resultList) {
-        Path d;
-        try {
-            d = subdirectory.resolveAgainst(directory);
-        } catch (InvalidPathException ignore) {
-            return;
-        }
-
-        if (!Files.exists(d)) {
-           return;
-        }
-
-        if (!caseMapCheck(d, subdirectory)) {
-            return;
+        public DirectoryContainer(Path directory) {
+            this.directory = directory;
         }
 
-        java.util.List<Path> files;
-        try (Stream<Path> s = Files.list(d)) {
-            files = (sortFiles == null ? s : s.sorted(sortFiles)).collect(Collectors.toList());
-        } catch (IOException ignore) {
-            return;
+        /**
+         * Insert all files in subdirectory subdirectory of directory userPath
+         * which match fileKinds into resultList
+         */
+        @Override
+        public void list(Path userPath,
+                         RelativeDirectory subdirectory,
+                         Set<JavaFileObject.Kind> fileKinds,
+                         boolean recurse,
+                         ListBuffer<JavaFileObject> resultList) throws IOException {
+            Path d;
+            try {
+                d = subdirectory.resolveAgainst(userPath);
+            } catch (InvalidPathException ignore) {
+                return ;
+            }
+
+            if (!Files.exists(d)) {
+               return;
+            }
+
+            if (!caseMapCheck(d, subdirectory)) {
+                return;
+            }
+
+            java.util.List<Path> files;
+            try (Stream<Path> s = Files.list(d)) {
+                files = (sortFiles == null ? s : s.sorted(sortFiles)).collect(Collectors.toList());
+            } catch (IOException ignore) {
+                return;
+            }
+
+            for (Path f: files) {
+                String fname = f.getFileName().toString();
+                if (fname.endsWith("/"))
+                    fname = fname.substring(0, fname.length() - 1);
+                if (Files.isDirectory(f)) {
+                    if (recurse && SourceVersion.isIdentifier(fname)) {
+                        list(userPath,
+                             new RelativeDirectory(subdirectory, fname),
+                             fileKinds,
+                             recurse,
+                             resultList);
+                    }
+                } else {
+                    if (isValidFile(fname, fileKinds)) {
+                        RelativeFile file = new RelativeFile(subdirectory, fname);
+                        JavaFileObject fe = PathFileObject.forDirectoryPath(JavacFileManager.this,
+                                file.resolveAgainst(directory), userPath, file);
+                        resultList.append(fe);
+                    }
+                }
+            }
         }
 
-        if (realDirectory == null)
-            realDirectory = fsInfo.getCanonicalFile(directory);
+        @Override
+        public JavaFileObject getFileObject(Path userPath, RelativeFile name) throws IOException {
+            try {
+                Path f = name.resolveAgainst(userPath);
+                if (Files.exists(f))
+                    return PathFileObject.forSimplePath(JavacFileManager.this,
+                            fsInfo.getCanonicalFile(f), f);
+            } catch (InvalidPathException ignore) {
+            }
+            return null;
+        }
 
-        for (Path f: files) {
-            String fname = f.getFileName().toString();
-            if (fname.endsWith("/"))
-                fname = fname.substring(0, fname.length() - 1);
-            if (Files.isDirectory(f)) {
-                if (recurse && SourceVersion.isIdentifier(fname)) {
-                    listDirectory(directory, realDirectory,
-                                  new RelativeDirectory(subdirectory, fname),
-                                  fileKinds,
-                                  recurse,
-                                  resultList);
-                }
-            } else {
-                if (isValidFile(fname, fileKinds)) {
-                    RelativeFile file = new RelativeFile(subdirectory, fname);
-                    JavaFileObject fe = PathFileObject.forDirectoryPath(this,
-                            file.resolveAgainst(realDirectory), directory, file);
-                    resultList.append(fe);
-                }
-            }
+        @Override
+        public void close() throws IOException {
         }
     }
 
-    /**
-     * Insert all files in subdirectory subdirectory of archive archivePath
-     * which match fileKinds into resultList
-     */
-    private void listArchive(Path archivePath,
-            RelativeDirectory subdirectory,
-            Set<JavaFileObject.Kind> fileKinds,
-            boolean recurse,
-            ListBuffer<JavaFileObject> resultList)
-                throws IOException {
-        FileSystem fs = getFileSystem(archivePath);
-        if (fs == null) {
-            return;
-        }
+    private final class ArchiveContainer implements Container {
+        private final Path archivePath;
+        private final FileSystem fileSystem;
+        private final Map<RelativePath, Path> pathCache = new HashMap<>();
 
-        Path containerSubdir = subdirectory.resolveAgainst(fs);
-        if (!Files.exists(containerSubdir)) {
-            return;
+        public ArchiveContainer(Path archivePath) throws IOException, ProviderNotFoundException, SecurityException {
+            this.archivePath = archivePath;
+            this.fileSystem = FileSystems.newFileSystem(archivePath, null);
         }
 
-        int maxDepth = (recurse ? Integer.MAX_VALUE : 1);
-        Set<FileVisitOption> opts = EnumSet.of(FOLLOW_LINKS);
-        Files.walkFileTree(containerSubdir, opts, maxDepth,
-                new SimpleFileVisitor<Path>() {
-                    @Override
-                    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
-                        if (isValid(dir.getFileName())) {
-                            return FileVisitResult.CONTINUE;
-                        } else {
-                            return FileVisitResult.SKIP_SUBTREE;
+        /**
+         * Insert all files in subdirectory subdirectory of this archive
+         * which match fileKinds into resultList
+         */
+        @Override
+        public void list(Path userPath,
+                         RelativeDirectory subdirectory,
+                         Set<JavaFileObject.Kind> fileKinds,
+                         boolean recurse,
+                         ListBuffer<JavaFileObject> resultList) throws IOException {
+            Path resolvedSubdirectory = resolvePath(subdirectory);
+
+            if (resolvedSubdirectory == null)
+                return ;
+
+            int maxDepth = (recurse ? Integer.MAX_VALUE : 1);
+            Set<FileVisitOption> opts = EnumSet.of(FOLLOW_LINKS);
+            Files.walkFileTree(resolvedSubdirectory, opts, maxDepth,
+                    new SimpleFileVisitor<Path>() {
+                        @Override
+                        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
+                            if (isValid(dir.getFileName())) {
+                                return FileVisitResult.CONTINUE;
+                            } else {
+                                return FileVisitResult.SKIP_SUBTREE;
+                            }
                         }
-                    }
+
+                        boolean isValid(Path fileName) {
+                            if (fileName == null) {
+                                return true;
+                            } else {
+                                String name = fileName.toString();
+                                if (name.endsWith("/")) {
+                                    name = name.substring(0, name.length() - 1);
+                                }
+                                return SourceVersion.isIdentifier(name);
+                            }
+                        }
 
-                    boolean isValid(Path fileName) {
-                        if (fileName == null) {
-                            return true;
-                        } else {
-                            String name = fileName.toString();
-                            if (name.endsWith("/")) {
-                                name = name.substring(0, name.length() - 1);
+                        @Override
+                        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+                            if (attrs.isRegularFile() && fileKinds.contains(getKind(file.getFileName().toString()))) {
+                                JavaFileObject fe = PathFileObject.forJarPath(
+                                        JavacFileManager.this, file, archivePath);
+                                resultList.append(fe);
                             }
-                            return SourceVersion.isIdentifier(name);
+                            return FileVisitResult.CONTINUE;
                         }
-                    }
+                    });
+
+        }
+
+        @Override
+        public JavaFileObject getFileObject(Path userPath, RelativeFile name) throws IOException {
+            Path p = resolvePath(name);
+            if (p != null)
+                return PathFileObject.forJarPath(JavacFileManager.this, p, userPath);
 
-                    @Override
-                    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
-                        if (attrs.isRegularFile() && fileKinds.contains(getKind(file.getFileName().toString()))) {
-                            JavaFileObject fe = PathFileObject.forJarPath(
-                                    JavacFileManager.this, file, archivePath);
-                            resultList.append(fe);
-                        }
-                        return FileVisitResult.CONTINUE;
-                    }
-                });
+            return null;
+        }
+
+        private synchronized Path resolvePath(RelativePath path) {
+            if (!pathCache.containsKey(path)) {
+                Path relativePath = path.resolveAgainst(fileSystem);
+
+                if (!Files.exists(relativePath)) {
+                    relativePath = null;
+                }
 
+                pathCache.put(path, relativePath);
+                return relativePath;
+            }
+            return pathCache.get(path);
+        }
+
+        @Override
+        public void close() throws IOException {
+            fileSystem.close();
+        }
     }
-
     /**
      * container is a directory, a zip file, or a non-existant path.
-     * Insert all files in subdirectory subdirectory of container which
-     * match fileKinds into resultList
      */
-    private void listContainer(Path container,
-                               RelativeDirectory subdirectory,
-                               Set<JavaFileObject.Kind> fileKinds,
-                               boolean recurse,
-                               ListBuffer<JavaFileObject> resultList)
-            throws IOException {
-        if (Files.isRegularFile(container) && container.equals(Locations.thisSystemModules)) {
-            try {
-                listJRTImage(subdirectory,
-                        fileKinds,
-                        recurse,
-                        resultList);
-            } catch (IOException ex) {
-                ex.printStackTrace(System.err);
-                log.error("error.reading.file", container, getMessage(ex));
-            }
-            return;
-        }
-
-        if  (Files.isDirectory(container)) {
-            listDirectory(container, null,
-                          subdirectory,
-                          fileKinds,
-                          recurse,
-                          resultList);
-            return;
-        }
-
-        if (Files.isRegularFile(container)) {
-            listArchive(container,
-                    subdirectory,
-                    fileKinds,
-                    recurse,
-                    resultList);
-        }
-    }
-
     private boolean isValidFile(String s, Set<JavaFileObject.Kind> fileKinds) {
         JavaFileObject.Kind kind = getKind(s);
         return fileKinds.contains(kind);
@@ -498,18 +621,6 @@
         return j < 0;
     }
 
-    private FileSystem getFileSystem(Path path) throws IOException {
-        Path realPath = fsInfo.getCanonicalFile(path);
-        FileSystem fs = fileSystems.get(realPath);
-        if (fs == null) {
-            fileSystems.put(realPath, fs = FileSystems.newFileSystem(realPath, null));
-        }
-        return fs;
-    }
-
-    private final Map<Path,FileSystem> fileSystems = new HashMap<>();
-
-
     /** Flush any output resources.
      */
     @Override @DefinedBy(Api.COMPILER)
@@ -528,10 +639,10 @@
         }
 
         locations.close();
-        for (FileSystem fs: fileSystems.values()) {
-            fs.close();
+        for (Container container: containers.values()) {
+            container.close();
         }
-        fileSystems.clear();
+        containers.clear();
         contentCache.clear();
     }
 
@@ -570,8 +681,12 @@
         RelativeDirectory subdirectory = RelativeDirectory.forPackage(packageName);
         ListBuffer<JavaFileObject> results = new ListBuffer<>();
 
-        for (Path directory : path)
-            listContainer(directory, subdirectory, kinds, recurse, results);
+        for (Path directory : path) {
+            Container container = getContainer(directory);
+
+            container.list(directory, subdirectory, kinds, recurse, results);
+        }
+
         return results.toList();
     }
 
@@ -644,29 +759,10 @@
             return null;
 
         for (Path file: path) {
-            if (file.equals(Locations.thisSystemModules)) {
-                JRTIndex.Entry e = getJRTIndex().getEntry(name.dirname());
-                if (symbolFileEnabled && e.ctSym.hidden)
-                    continue;
-                Path p = e.files.get(name.basename());
-                if (p != null)
-                    return PathFileObject.forJRTPath(this, p);
-            } else if (Files.isDirectory(file)) {
-                try {
-                    Path f = name.resolveAgainst(file);
-                    if (Files.exists(f))
-                        return PathFileObject.forSimplePath(this,
-                                fsInfo.getCanonicalFile(f), f);
-                } catch (InvalidPathException ignore) {
-                }
-            } else if (Files.isRegularFile(file)) {
-                FileSystem fs = getFileSystem(file);
-                if (fs != null) {
-                    Path fsRoot = fs.getRootDirectories().iterator().next();
-                    Path f = name.resolveAgainst(fsRoot);
-                    if (Files.exists(f))
-                        return PathFileObject.forJarPath(this, f, file);
-                }
+            JavaFileObject fo = getContainer(file).getFileObject(file, name);
+
+            if (fo != null) {
+                return fo;
             }
         }
         return null;
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java	Thu Apr 14 09:34:00 2016 -0700
@@ -1077,12 +1077,12 @@
                         ed.add(n);
                     }
                     editor = ed.toArray(new String[ed.size()]);
-                    fluffmsg("jshell.msg.set.editor.set", arg);
+                    fluffmsg("jshell.msg.set.editor.set", prog);
                     return true;
                 }
             }
             case "start": {
-                String init = readFile(at.next(), "'/set start'");
+                String init = readFile(at.next(), "/set start");
                 if (init == null) {
                     return false;
                 } else {
@@ -1351,7 +1351,7 @@
                 .filter(sn -> state.status(sn).isActive && sn instanceof PersistentSnippet)
                 .collect(toList());
         if (snippets.isEmpty()) {
-            errormsg("jshell.err.drop.active");
+            errormsg("jshell.err.drop.not.active");
             return false;
         }
         if (snippets.size() > 1) {
@@ -1499,7 +1499,7 @@
     }
 
     private boolean cmdOpen(String filename) {
-        return runFile(filename, "'/open'");
+        return runFile(filename, "/open");
     }
 
     private boolean runFile(String filename, String context) {
@@ -1533,7 +1533,7 @@
             } catch (AccessDeniedException e) {
                 errormsg("jshell.err.file.not.accessible", context, filename, e.getMessage());
             } catch (NoSuchFileException e) {
-                errormsg("jshell.err.file.not.found", context, filename, e.getMessage());
+                errormsg("jshell.err.file.not.found", context, filename);
             } catch (Exception e) {
                 errormsg("jshell.err.file.exception", context, filename, e);
             }
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties	Thu Apr 14 09:34:00 2016 -0700
@@ -42,7 +42,7 @@
 jshell.msg.see = See {0} for help.
 
 jshell.err.file.not.accessible = File ''{1}'' for ''{0}'' is not accessible: {2}
-jshell.err.file.not.found = File ''{1}'' for ''{0}'' is not found: {2}
+jshell.err.file.not.found = File ''{1}'' for ''{0}'' is not found.
 jshell.err.file.exception = File ''{1}'' for ''{0}'' threw exception: {2}
 jshell.err.file.filename = ''{0}'' requires a filename argument.
 
@@ -90,7 +90,7 @@
 jshell.err.drop.arg =\
 In the /drop argument, please specify an import, variable, method, or class to drop.\n\
 Specify by id or name. Use /list to see ids. Use /reset to reset all state.
-jshell.msg.drop.not.active = The argument did not specify an active import, variable, method, or class to drop.
+jshell.err.drop.not.active = The argument did not specify an active import, variable, method, or class to drop.
 jshell.err.drop.ambiguous = The argument references more than one import, variable, method, or class.
 jshell.err.failed = Failed.
 jshell.msg.native.method = Native Method
@@ -503,74 +503,86 @@
 which are run when the jshell tool is started or reset.
 
 startup.feedback = \
-/set newmode normal command    \n\
-/set prompt normal '\\n-> ' '>> '    \n\
-/set format normal pre '|  '    \n\
-/set format normal post '%n'    \n\
-/set format normal errorpre '|  '    \n\
-/set format normal errorpost '%n'    \n\
-    \n\
-/set format normal errorline '{post}{pre}    {err}'    \n\
-    \n\
-/set format normal action 'Added' added-primary    \n\
-/set format normal action 'Modified' modified-primary    \n\
-/set format normal action 'Replaced' replaced-primary    \n\
-/set format normal action 'Overwrote' overwrote-primary    \n\
-/set format normal action 'Dropped' dropped-primary    \n\
-/set format normal action '  Update added' added-update    \n\
-/set format normal action '  Update modified' modified-update    \n\
-/set format normal action '  Update replaced' replaced-update    \n\
-/set format normal action '  Update overwrote' overwrote-update    \n\
-/set format normal action '  Update dropped' dropped-update    \n\
-    \n\
-/set format normal until ', however, it cannot be instanciated or its methods invoked until'  defined-class-primary    \n\
-/set format normal until ', however, its methods cannot be invoked until'                     defined-interface-primary    \n\
-/set format normal until ', however, it cannot be used until'                                 defined-enum,annotation-primary    \n\
-/set format normal until ', however, it cannot be invoked until'                              defined-method-primary    \n\
-/set format normal until ', however, it cannot be referenced until'                           notdefined-primary    \n\
-/set format normal until ' which cannot be instanciated or its methods invoked until'         defined-class-update    \n\
-/set format normal until ' whose methods cannot be invoked until'                             defined-interface-update    \n\
-/set format normal until ' which cannot be invoked until'                                     defined-method-update    \n\
-/set format normal until ' which cannot be referenced until'                                  notdefined-update    \n\
-    \n\
-/set format normal unrerr '{unresolved} is declared'                                           unresolved1-error0    \n\
-/set format normal unrerr '{unresolved} are declared'                                          unresolved2-error0    \n\
-/set format normal unrerr ' this error is corrected: {errors}'                                 unresolved0-error1    \n\
-/set format normal unrerr '{unresolved} is declared and this error is corrected: {errors}'     unresolved1-error1    \n\
-/set format normal unrerr '{unresolved} are declared and this error is corrected: {errors}'    unresolved2-error1    \n\
-/set format normal unrerr ' these errors are corrected: {errors}'                              unresolved0-error2    \n\
-/set format normal unrerr '{unresolved} is declared and these errors are corrected: {errors}'  unresolved1-error2    \n\
-/set format normal unrerr '{unresolved} are declared and these errors are corrected: {errors}' unresolved2-error2    \n\
-    \n\
-/set format normal resolve '{until}{unrerr}'                                                added,modified,replaced,used    \n\
-    \n\
-/set format normal typeKind 'class'                  class    \n\
-/set format normal typeKind 'interface'              interface    \n\
-/set format normal typeKind 'enum'                   enum    \n\
-/set format normal typeKind 'annotation interface'   annotation    \n\
-    \n\
-/set format normal display '{pre}{action} {typeKind} {name}{resolve}{post}'                 class,interface,enum,annotation    \n\
-/set format normal display '{pre}{action} method {name}({type}){resolve}{post}'             method    \n\
-    \n\
-/set format normal display '{pre}{action} variable {name} of type {type}{resolve}{post}'    vardecl    \n\
-/set format normal display '{pre}{action} variable {name} of type {type} with initial value {value}{resolve}{post}'    varinit    \n\
+/set newmode verbose command    \n\
+\n\
+/set prompt verbose '\\njshell> '   '   ...> '    \n\
+\n\
+/set format verbose pre '|  '    \n\
+/set format verbose post '%n'    \n\
+/set format verbose errorpre '|  '    \n\
+/set format verbose errorpost '%n'    \n\
+\n\
+/set format verbose errorline '{pre}    {err}'    \n\
+\n\
+/set format verbose action 'created' added-primary    \n\
+/set format verbose action 'modified' modified-primary    \n\
+/set format verbose action 'replaced' replaced-primary    \n\
+/set format verbose action 'overwrote' overwrote-primary    \n\
+/set format verbose action 'dropped' dropped-primary    \n\
+/set format verbose action '  update created' added-update    \n\
+/set format verbose action '  update modified' modified-update    \n\
+/set format verbose action '  update replaced' replaced-update    \n\
+/set format verbose action '  update overwrote' overwrote-update    \n\
+/set format verbose action '  update dropped' dropped-update    \n\
+\n\
+/set format verbose until ', however, it cannot be instanciated or its methods invoked until'   defined-class-primary    \n\
+/set format verbose until ', however, its methods cannot be invoked until'                      defined-interface-primary    \n\
+/set format verbose until ', however, it cannot be used until'                                  defined-enum,annotation-primary    \n\
+/set format verbose until ', however, it cannot be invoked until'                               defined-method-primary    \n\
+/set format verbose until ', however, it cannot be referenced until'                            notdefined-primary    \n\
+/set format verbose until ' which cannot be instanciated or its methods invoked until'          defined-class-update    \n\
+/set format verbose until ' whose methods cannot be invoked until'                              defined-interface-update    \n\
+/set format verbose until ' which cannot be invoked until'                                      defined-method-update    \n\
+/set format verbose until ' which cannot be referenced until'                                   notdefined-update    \n\
+\n\
+/set format verbose unrerr '{unresolved} is declared'                                           unresolved1-error0    \n\
+/set format verbose unrerr '{unresolved} are declared'                                          unresolved2-error0    \n\
+/set format verbose unrerr ' this error is corrected: {errors}'                                 unresolved0-error1    \n\
+/set format verbose unrerr '{unresolved} is declared and this error is corrected: {errors}'     unresolved1-error1    \n\
+/set format verbose unrerr '{unresolved} are declared and this error is corrected: {errors}'    unresolved2-error1    \n\
+/set format verbose unrerr ' these errors are corrected: {errors}'                              unresolved0-error2    \n\
+/set format verbose unrerr '{unresolved} is declared and these errors are corrected: {errors}'  unresolved1-error2    \n\
+/set format verbose unrerr '{unresolved} are declared and these errors are corrected: {errors}' unresolved2-error2    \n\
+\n\
+/set format verbose resolve '{until}{unrerr}'                                                   added,modified,replaced,used    \n\
+\n\
+/set format verbose typeKind 'class'                  class    \n\
+/set format verbose typeKind 'interface'              interface    \n\
+/set format verbose typeKind 'enum'                   enum    \n\
+/set format verbose typeKind 'annotation interface'   annotation    \n\
+\n\
+/set format verbose result '{name} ==> {value}{post}'                                        added,modified,replaced-ok-primary    \n\
+\n\
+/set format verbose display '{result}{pre}created scratch variable {name} : {type}{post}'    expression-primary    \n\
+/set format verbose display '{result}{pre}value of {name} : {type}{post}'                    varvalue-primary    \n\
+/set format verbose display '{result}{pre}assigned to {name} : {type}{post}'                 assignment-primary    \n\
+/set format verbose display '{result}{pre}{action} variable {name} : {type}{resolve}{post}'  varinit,vardecl    \n\
+/set format verbose display '{pre}{action} variable {name}{resolve}{post}'                   vardecl,varinit-notdefined    \n\
+/set format verbose display '{pre}{action} variable {name}{post}'                            dropped-vardecl,varinit    \n\
+/set format verbose display '{pre}{action} variable {name}, reset to null{post}'             replaced-vardecl,varinit-ok-update    \n\
+\n\
+/set format verbose display '{pre}{action} {typeKind} {name}{resolve}{post}'                 class,interface,enum,annotation    \n\
+/set format verbose display '{pre}{action} method {name}({type}){resolve}{post}'             method    \n\
+\n\
+/set format verbose display '{pre}attempted to use {typeKind} {name}{resolve}{post}'         used-class,interface,enum,annotation    \n\
+/set format verbose display '{pre}attempted to call method {name}({type}){resolve}{post}'    used-method    \n\
+\n\
+/set newmode normal command verbose    \n\
+/set format normal display ''                                                               added,modified,replaced,overwrote,dropped-update    \n\
 /set format normal display '{pre}{action} variable {name}, reset to null{post}'             replaced-vardecl,varinit-ok-update    \n\
-/set format normal display '{pre}{action} variable {name}{resolve}{post}'                   vardecl,varinit-notdefined    \n\
-/set format normal display '{pre}{action} variable {name}{post}'                            overwrote,dropped-vardecl,varinit    \n\
-    \n\
-/set format normal display '{pre}Expression value is: {value}{post}{pre}  assigned to temporary variable {name} of type {type}{post}' expression    \n\
-/set format normal display '{pre}Variable {name} of type {type} has value {value}{post}'    varvalue    \n\
-/set format normal display '{pre}Variable {name} has been assigned the value {value}{post}' assignment    \n\
-    \n\
-/set format normal display '{pre}Attempted to use {typeKind} {name}{resolve}{post}'         used-class,interface,enum,annotation    \n\
-/set format normal display '{pre}Attempted to call method {name}({type}){resolve}{post}'    used-method    \n\
-    \n\
+/set format normal display '{result}'                                                       added,modified,replaced-expression,varvalue,assignment,varinit,vardecl-ok-primary    \n\
+/set newmode concise quiet normal    \n\
+\n\
+/set prompt concise 'jshell> '   '   ...> '    \n\
+\n\
+/set format concise display ''                                                              class,interface,enum,annotation,method,assignment,varinit,vardecl-ok    \n\
+\n\
 /set feedback normal    \n\
-    \n\
-/set newmode off quiet    \n\
-/set prompt off '-> ' '>> '    \n\
-/set format off pre '|  '    \n\
-/set format off post '%n'    \n\
-/set format off errorpre '|  '    \n\
-/set format off errorpost '%n'    \n\
-/set format off display ''    \n
+\n\
+/set newmode silent quiet    \n\
+/set prompt silent '-> ' '>> '    \n\
+/set format silent pre '|  '    \n\
+/set format silent post '%n'    \n\
+/set format silent errorpre '|  '    \n\
+/set format silent errorpost '%n'    \n\
+/set format silent display ''    \n
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/Eval.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/Eval.java	Thu Apr 14 09:34:00 2016 -0700
@@ -465,16 +465,40 @@
         // If appropriate, execute the snippet
         String value = null;
         Exception exception = null;
-        if (si.isExecutable() && si.status().isDefined) {
-            try {
-                value = state.executionControl().commandInvoke(state.maps.classFullName(si));
-                value = si.subKind().hasValue()
-                        ? expunge(value)
-                        : "";
-            } catch (EvalException ex) {
-                exception = translateExecutionException(ex);
-            } catch (UnresolvedReferenceException ex) {
-                exception = ex;
+        if (si.status().isDefined) {
+            if (si.isExecutable()) {
+                try {
+                    value = state.executionControl().commandInvoke(state.maps.classFullName(si));
+                    value = si.subKind().hasValue()
+                            ? expunge(value)
+                            : "";
+                } catch (EvalException ex) {
+                    exception = translateExecutionException(ex);
+                } catch (UnresolvedReferenceException ex) {
+                    exception = ex;
+                }
+            } else if (si.subKind() == SubKind.VAR_DECLARATION_SUBKIND) {
+                switch (((VarSnippet) si).typeName()) {
+                    case "byte":
+                    case "short":
+                    case "int":
+                    case "long":
+                        value = "0";
+                        break;
+                    case "float":
+                    case "double":
+                        value = "0.0";
+                        break;
+                    case "boolean":
+                        value = "false";
+                        break;
+                    case "char":
+                        value = "''";
+                        break;
+                    default:
+                        value = "null";
+                        break;
+                }
             }
         }
         return events(c, outs, value, exception);
--- a/langtools/test/jdk/jshell/EditorPadTest.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/jdk/jshell/EditorPadTest.java	Thu Apr 14 09:34:00 2016 -0700
@@ -25,6 +25,7 @@
  * @test
  * @summary Testing built-in editor.
  * @ignore 8139872
+ * @modules jdk.jshell/jdk.internal.jshell.tool
  * @build ReplToolTesting EditorTestBase
  * @run testng EditorPadTest
  */
@@ -67,7 +68,7 @@
     private static JButton exit = null;
 
     @BeforeClass
-    public static void setUp() {
+    public static void setUpEditorPadTest() {
         try {
             robot = new Robot();
             robot.setAutoWaitForIdle(true);
--- a/langtools/test/jdk/jshell/EditorTestBase.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/jdk/jshell/EditorTestBase.java	Thu Apr 14 09:34:00 2016 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. 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
@@ -65,19 +65,19 @@
     }
 
     public void assertEditOutput(boolean after, String cmd, String output, Action action) {
-        assertEditOutput(after, cmd, s -> assertEquals(s, output, "command"), action);
+        assertEditOutput(after, cmd, s -> assertEquals(s.trim(), output.trim(), "command"), action);
     }
 
     @Test
     public void testEditNegative() {
-        for (String edit : new String[] {"/e", "/edit"}) {
+        for (String edit : new String[] {"/ed", "/edit"}) {
             test(new String[]{"-nostartup"},
-                    a -> assertCommand(a, edit + " 1",
-                            "|  No definition or id named 1 found.  See /classes, /methods, /vars, or /list\n"),
-                    a -> assertCommand(a, edit + " -1",
-                            "|  No definition or id named -1 found.  See /classes, /methods, /vars, or /list\n"),
-                    a -> assertCommand(a, edit + " unknown",
-                            "|  No definition or id named unknown found.  See /classes, /methods, /vars, or /list\n")
+                    a -> assertCommandOutputStartsWith(a, edit + " 1",
+                            "|  No definition or id found named: 1"),
+                    a -> assertCommandOutputStartsWith(a, edit + " -1",
+                            "|  No definition or id found named: -1"),
+                    a -> assertCommandOutputStartsWith(a, edit + " unknown",
+                            "|  No definition or id found named: unknown")
             );
         }
     }
@@ -86,7 +86,7 @@
     public void testDoNothing() {
         testEditor(
                 a -> assertVariable(a, "int", "a", "0", "0"),
-                a -> assertEditOutput(a, "/e 1", "", this::exit),
+                a -> assertEditOutput(a, "/ed 1", "", this::exit),
                 a -> assertCommandCheckOutput(a, "/v", assertVariables())
         );
     }
@@ -95,12 +95,12 @@
     public void testEditVariable1() {
         testEditor(
                 a -> assertVariable(a, "int", "a", "0", "0"),
-                a -> assertEditOutput(a, "/e 1", "|  Modified variable a of type int with initial value 10\n", () -> {
+                a -> assertEditOutput(a, "/ed 1", "a ==> 10", () -> {
                     writeSource("\n\n\nint a = 10;\n\n\n");
                     exit();
                     loadVariable(true, "int", "a", "10", "10");
                 }),
-                a -> assertEditOutput(a, "/e 1", "|  Modified variable a of type int with initial value 15\n", () -> {
+                a -> assertEditOutput(a, "/ed 1", "a ==> 15", () -> {
                     writeSource("int a = 15;");
                     exit();
                     loadVariable(true, "int", "a", "15", "15");
@@ -113,12 +113,12 @@
     public void testEditVariable2() {
         testEditor(
                 a -> assertVariable(a, "int", "a", "0", "0"),
-                a -> assertEditOutput(a, "/e 1", "|  Added variable b of type int with initial value 10\n", () -> {
+                a -> assertEditOutput(a, "/ed 1", "b ==> 10", () -> {
                     writeSource("int b = 10;");
                     exit();
                     loadVariable(true, "int", "b", "10", "10");
                 }),
-                a -> assertEditOutput(a, "/e 1", "|  Modified variable a of type int with initial value 15\n", () -> {
+                a -> assertEditOutput(a, "/ed 1", "a ==> 15", () -> {
                     writeSource("int a = 15;");
                     exit();
                     loadVariable(true, "int", "a", "15", "15");
@@ -131,19 +131,18 @@
     public void testEditClass1() {
         testEditor(
                 a -> assertClass(a, "class A {}", "class", "A"),
-                a -> assertEditOutput(a, "/e 1", "", () -> {
+                a -> assertEditOutput(a, "/ed 1", "", () -> {
                     writeSource("\n\n\nclass A {}\n\n\n");
                     exit();
                     loadClass(true, "class A {}", "class", "A");
                 }),
-                a -> assertEditOutput(a, "/e 1",
-                        "|  Replaced enum A\n" +
-                        "|    Update overwrote class A\n", () -> {
+                a -> assertEditOutput(a, "/ed 1",
+                        "|  replaced enum A", () -> {
                     writeSource("enum A {}");
                     exit();
                     loadClass(true, "enum A {}", "enum", "A");
                 }),
-                a -> assertCommandCheckOutput(a, "/c", assertClasses())
+                a -> assertCommandCheckOutput(a, "/classes", assertClasses())
         );
     }
 
@@ -151,19 +150,18 @@
     public void testEditClass2() {
         testEditor(
                 a -> assertClass(a, "class A {}", "class", "A"),
-                a -> assertEditOutput(a, "/e 1", "|  Added class B\n", () -> {
+                a -> assertEditOutput(a, "/ed 1", "|  created class B", () -> {
                     writeSource("class B { }");
                     exit();
                     loadClass(true, "class B {}", "class", "B");
                 }),
-                a -> assertEditOutput(a, "/e 1",
-                        "|  Replaced enum A\n" +
-                        "|    Update overwrote class A\n", () -> {
+                a -> assertEditOutput(a, "/ed 1",
+                        "|  replaced enum A", () -> {
                     writeSource("enum A {}");
                     exit();
                     loadClass(true, "enum A {}", "enum", "A");
                 }),
-                a -> assertCommandCheckOutput(a, "/c", assertClasses())
+                a -> assertCommandCheckOutput(a, "/classes", assertClasses())
         );
     }
 
@@ -171,14 +169,13 @@
     public void testEditMethod1() {
         testEditor(
                 a -> assertMethod(a, "void f() {}", "()void", "f"),
-                a -> assertEditOutput(a, "/e 1", "", () -> {
+                a -> assertEditOutput(a, "/ed 1", "", () -> {
                     writeSource("\n\n\nvoid f() {}\n\n\n");
                     exit();
                     loadMethod(true, "void f() {}", "()void", "f");
                 }),
-                a -> assertEditOutput(a, "/e 1",
-                        "|  Replaced method f()\n" +
-                        "|    Update overwrote method f()\n", () -> {
+                a -> assertEditOutput(a, "/ed 1",
+                        "|  replaced method f()", () -> {
                     writeSource("double f() { return 0; }");
                     exit();
                     loadMethod(true, "double f() { return 0; }", "()double", "f");
@@ -191,14 +188,13 @@
     public void testEditMethod2() {
         testEditor(
                 a -> assertMethod(a, "void f() {}", "()void", "f"),
-                a -> assertEditOutput(a, "/e 1", "|  Added method g()\n", () -> {
+                a -> assertEditOutput(a, "/ed 1", "|  created method g()", () -> {
                     writeSource("void g() {}");
                     exit();
                     loadMethod(true, "void g() {}", "()void", "g");
                 }),
-                a -> assertEditOutput(a, "/e 1",
-                        "|  Replaced method f()\n" +
-                        "|    Update overwrote method f()\n", () -> {
+                a -> assertEditOutput(a, "/ed 1",
+                        "|  replaced method f()", () -> {
                     writeSource("double f() { return 0; }");
                     exit();
                     loadMethod(true, "double f() { return 0; }", "()double", "f");
@@ -213,7 +209,7 @@
                 a -> assertVariable(a, "int", "a"),
                 a -> assertMethod(a, "void f() {}", "()void", "f"),
                 a -> assertClass(a, "class A {}", "class", "A"),
-                a -> assertEditInput(a, "/e", s -> {
+                a -> assertEditInput(a, "/ed", s -> {
                     String[] ss = s.split("\n");
                     assertEquals(ss.length, 3, "Expected 3 lines: " + s);
                     assertEquals(ss[0], "int a;");
@@ -226,15 +222,15 @@
     @Test
     public void testStartup() {
         testEditor(true, new String[0],
-                a -> assertEditInput(a, "/e", s -> assertTrue(s.isEmpty(), "Checking of startup: " + s), this::cancel),
-                a -> assertEditInput(a, "/e printf", assertStartsWith("void printf"), this::cancel));
+                a -> assertEditInput(a, "/ed", s -> assertTrue(s.isEmpty(), "Checking of startup: " + s), this::cancel),
+                a -> assertEditInput(a, "/ed printf", assertStartsWith("void printf"), this::cancel));
     }
 
     @Test
     public void testCancel() {
         testEditor(
                 a -> assertVariable(a, "int", "a"),
-                a -> assertEditOutput(a, "/e a", "", () -> {
+                a -> assertEditOutput(a, "/ed a", "", () -> {
                     writeSource("int b = 10");
                     cancel();
                 })
@@ -245,7 +241,7 @@
     public void testAccept() {
         testEditor(
                 a -> assertVariable(a, "int", "a"),
-                a -> assertEditOutput(a, "/e a", "|  Added variable b of type int with initial value 10\n", () -> {
+                a -> assertEditOutput(a, "/ed a", "b ==> 10", () -> {
                     writeSource("int b = 10");
                     accept();
                     exit();
--- a/langtools/test/jdk/jshell/ExternalEditorTest.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/jdk/jshell/ExternalEditorTest.java	Thu Apr 14 09:34:00 2016 -0700
@@ -24,8 +24,9 @@
 /*
  * @test
  * @summary Testing external editor.
- * @bug 8080843
+ * @bug 8080843 8143955
  * @ignore 8080843
+ * @modules jdk.jshell/jdk.internal.jshell.tool
  * @build ReplToolTesting CustomEditor EditorTestBase
  * @run testng ExternalEditorTest
  */
@@ -124,7 +125,7 @@
     }
 
     @BeforeClass
-    public static void setUp() throws IOException {
+    public static void setUpExternalEditorTest() throws IOException {
         listener = new ServerSocket(0);
         listener.setSoTimeout(30000);
         int localPort = listener.getLocalPort();
@@ -193,11 +194,11 @@
     @Test
     public void setUnknownEditor() {
         test(
-                a -> assertCommand(a, "/set editor", "|  /set editor requires a path argument\n"),
-                a -> assertCommand(a, "/set editor UNKNOWN", "|  Editor set to: UNKNOWN\n"),
+                a -> assertCommand(a, "/set editor", "|  The '/set editor' command requires a path argument"),
+                a -> assertCommand(a, "/set editor UNKNOWN", "|  Editor set to: UNKNOWN"),
                 a -> assertCommand(a, "int a;", null),
-                a -> assertCommand(a, "/e 1",
-                        "|  Edit Error: process IO failure: Cannot run program \"UNKNOWN\": error=2, No such file or directory\n")
+                a -> assertCommand(a, "/ed 1",
+                        "|  Edit Error: process IO failure: Cannot run program \"UNKNOWN\": error=2, No such file or directory")
         );
     }
 
--- a/langtools/test/jdk/jshell/ReplToolTesting.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/jdk/jshell/ReplToolTesting.java	Thu Apr 14 09:34:00 2016 -0700
@@ -273,8 +273,7 @@
     }
 
     public void evaluateExpression(boolean after, String type, String expr, String value) {
-        String output = String.format("\\| *Expression values is: %s\n|" +
-                " *.*temporary variable (\\$\\d+) of type %s", value, type);
+        String output = String.format("(\\$\\d+) ==> %s", value);
         Pattern outputPattern = Pattern.compile(output);
         assertCommandCheckOutput(after, expr, s -> {
             Matcher matcher = outputPattern.matcher(s);
@@ -558,14 +557,19 @@
 
         @Override
         public Consumer<String> checkOutput() {
-            String pattern = String.format("\\| *\\w+ variable %s of type %s", name, type);
-            if (initialValue != null) {
-                pattern += " with initial value " + initialValue;
-            }
-            Predicate<String> checkOutput = Pattern.compile(pattern).asPredicate();
-            final String finalPattern = pattern;
-            return output -> assertTrue(checkOutput.test(output),
-                    "Output: " + output + " does not fit pattern: " + finalPattern);
+            String arrowPattern = String.format("%s ==> %s", name, value);
+            Predicate<String> arrowCheckOutput = Pattern.compile(arrowPattern).asPredicate();
+            String howeverPattern = String.format("\\| *\\w+ variable %s, however*.", name);
+            Predicate<String> howeverCheckOutput = Pattern.compile(howeverPattern).asPredicate();
+            return output -> {
+                if (output.startsWith("|  ")) {
+                    assertTrue(howeverCheckOutput.test(output),
+                    "Output: " + output + " does not fit pattern: " + howeverPattern);
+                } else {
+                    assertTrue(arrowCheckOutput.test(output),
+                    "Output: " + output + " does not fit pattern: " + arrowPattern);
+                }
+            };
         }
 
         @Override
--- a/langtools/test/jdk/jshell/T8146368/JShellToolTest8146368.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/jdk/jshell/T8146368/JShellToolTest8146368.java	Thu Apr 14 09:34:00 2016 -0700
@@ -37,8 +37,8 @@
 public class JShellToolTest8146368 extends ReplToolTesting {
     public void test() {
         test(
-                a -> assertCommand(a, "class A extends B {}", "|  Added class A, however, it cannot be referenced until class B is declared\n"),
-                a -> assertCommand(a, "und m() { return new und(); }", "|  Added method m(), however, it cannot be referenced until class und is declared\n")
+                a -> assertCommand(a, "class A extends B {}", "|  created class A, however, it cannot be referenced until class B is declared\n"),
+                a -> assertCommand(a, "und m() { return new und(); }", "|  created method m(), however, it cannot be referenced until class und is declared\n")
         );
     }
 }
--- a/langtools/test/jdk/jshell/ToolBasicTest.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/jdk/jshell/ToolBasicTest.java	Thu Apr 14 09:34:00 2016 -0700
@@ -23,9 +23,13 @@
 
 /*
  * @test
- * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317
+ * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955
  * @summary Tests for Basic tests for REPL tool
  * @requires os.family != "solaris"
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ *          jdk.compiler/com.sun.tools.javac.main
+ *          jdk.jdeps/com.sun.tools.javap
+ *          jdk.jshell/jdk.internal.jshell.tool
  * @library /tools/lib
  * @ignore 8139873
  * @build toolbox.ToolBox toolbox.JarTask toolbox.JavacTask
@@ -176,23 +180,23 @@
             }
             assertOutput(getCommandOutput(), "", "command");
             assertOutput(getCommandErrorOutput(), "", "command error");
-            assertOutput(getUserOutput(), output, "user");
+            assertOutput(getUserOutput().trim(), output, "user");
             assertOutput(getUserErrorOutput(), "", "user error");
         }
     }
 
     public void testStop() {
         test(
-                (a) -> assertStop(a, "while (true) {}", "Killed.\n"),
-                (a) -> assertStop(a, "while (true) { try { Thread.sleep(100); } catch (InterruptedException ex) { } }", "Killed.\n")
+                (a) -> assertStop(a, "while (true) {}", "Killed."),
+                (a) -> assertStop(a, "while (true) { try { Thread.sleep(100); } catch (InterruptedException ex) { } }", "Killed.")
         );
     }
 
     @Test(enabled = false) // TODO 8130450
     public void testRerun() {
         test(false, new String[] {"-nostartup"},
-                (a) -> assertCommand(a, "/0", "|  No such command or snippet id: /0\n|  Type /help for help.\n"),
-                (a) -> assertCommand(a, "/5", "|  No such command or snippet id: /5\n|  Type /help for help.\n")
+                (a) -> assertCommand(a, "/0", "|  No such command or snippet id: /0\n|  Type /help for help."),
+                (a) -> assertCommand(a, "/5", "|  No such command or snippet id: /5\n|  Type /help for help.")
         );
         String[] codes = new String[] {
                 "int a = 0;", // var
@@ -251,99 +255,9 @@
         );
 
         test(false, new String[] {"-nostartup"},
-                (a) -> assertCommand(a, "/s1", "|  No such command or snippet id: /s1\n|  Type /help for help.\n"),
-                (a) -> assertCommand(a, "/1", "|  No such command or snippet id: /1\n|  Type /help for help.\n"),
-                (a) -> assertCommand(a, "/e1", "|  No such command or snippet id: /e1\n|  Type /help for help.\n")
-        );
-    }
-
-    public void testRemaining() {
-        test(
-                (a) -> assertCommand(a, "int z; z =", "|  Added variable z of type int\n"),
-                (a) -> assertCommand(a, "5", "|  Variable z has been assigned the value 5\n"),
-                (a) -> assertCommand(a, "/*nada*/; int q =", ""),
-                (a) -> assertCommand(a, "77", "|  Added variable q of type int with initial value 77\n"),
-                (a) -> assertCommand(a, "//comment;", ""),
-                (a) -> assertCommand(a, "int v;", "|  Added variable v of type int\n"),
-                (a) -> assertCommand(a, "int v; int c", "|  Added variable c of type int\n")
-        );
-    }
-
-    public void oneLineOfError() {
-        test(
-                (a) -> assertCommand(a, "12+", null),
-                (a) -> assertCommandCheckOutput(a, "  true", (s) ->
-                        assertTrue(s.contains("12+") && !s.contains("true"), "Output: '" + s + "'"))
-        );
-    }
-
-    public void defineVariables() {
-        test(
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
-                (a) -> assertVariable(a, "int", "a"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
-                (a) -> assertVariable(a, "double", "a", "1", "1.0"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
-                (a) -> evaluateExpression(a, "double", "2 * a", "2.0"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables())
-        );
-    }
-
-    public void defineMethods() {
-        test(
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
-                (a) -> assertMethod(a, "int f() { return 0; }", "()int", "f"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
-                (a) -> assertMethod(a, "void f(int a) { g(); }", "(int)void", "f"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
-                (a) -> assertMethod(a, "void g() {}", "()void", "g"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods())
-        );
-    }
-
-    public void defineClasses() {
-        test(
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses()),
-                (a) -> assertClass(a, "class A { }", "class", "A"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses()),
-                (a) -> assertClass(a, "interface A { }", "interface", "A"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses()),
-                (a) -> assertClass(a, "enum A { }", "enum", "A"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses()),
-                (a) -> assertClass(a, "@interface A { }", "@interface", "A"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses())
-        );
-    }
-
-    public void defineImports() {
-        test(
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
-                (a) -> assertImport(a, "import java.util.stream.Stream;", "", "java.util.stream.Stream"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
-                (a) -> assertImport(a, "import java.util.stream.*;", "", "java.util.stream.*"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
-                (a) -> assertImport(a, "import static java.lang.Math.PI;", "static", "java.lang.Math.PI"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
-                (a) -> assertImport(a, "import static java.lang.Math.*;", "static", "java.lang.Math.*"),
-                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
-                (a) -> assertCommandCheckOutput(a, "/imports", assertImports())
+                (a) -> assertCommand(a, "/s1", "|  No such command or snippet id: /s1\n|  Type /help for help."),
+                (a) -> assertCommand(a, "/1", "|  No such command or snippet id: /1\n|  Type /help for help."),
+                (a) -> assertCommand(a, "/e1", "|  No such command or snippet id: /e1\n|  Type /help for help.")
         );
     }
 
@@ -353,14 +267,14 @@
         compiler.compile(outDir, "package pkg; public class A { public String toString() { return \"A\"; } }");
         Path classpath = compiler.getPath(outDir);
         test(
-                (a) -> assertCommand(a, "/classpath " + classpath, String.format("|  Path %s added to classpath\n", classpath)),
-                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "\"A\"")
+                (a) -> assertCommand(a, "/classpath " + classpath, String.format("|  Path '%s' added to classpath", classpath)),
+                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
         );
         test(new String[] { "-cp", classpath.toString() },
-                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "\"A\"")
+                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
         );
         test(new String[] { "-classpath", classpath.toString() },
-                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "\"A\"")
+                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
         );
     }
 
@@ -372,14 +286,14 @@
         compiler.jar(outDir, jarName, "pkg/A.class");
         Path jarPath = compiler.getPath(outDir).resolve(jarName);
         test(
-                (a) -> assertCommand(a, "/classpath " + jarPath, String.format("|  Path %s added to classpath\n", jarPath)),
-                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "\"A\"")
+                (a) -> assertCommand(a, "/classpath " + jarPath, String.format("|  Path '%s' added to classpath", jarPath)),
+                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
         );
         test(new String[] { "-cp", jarPath.toString() },
-                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "\"A\"")
+                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
         );
         test(new String[] { "-classpath", jarPath.toString() },
-                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "\"A\"")
+                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "A")
         );
     }
 
@@ -389,7 +303,7 @@
             Path startup = compiler.getPath("StartupFileOption/startup.txt");
             compiler.writeToFile(startup, "class A { public String toString() { return \"A\"; } }");
             test(new String[]{"-startup", startup.toString()},
-                    (a) -> evaluateExpression(a, "A", "new A()", "\"A\"\n")
+                    (a) -> evaluateExpression(a, "A", "new A()", "A")
             );
             test(new String[]{"-nostartup"},
                     (a) -> assertCommandCheckOutput(a, "printf(\"\")", assertStartsWith("|  Error:\n|  cannot find symbol"))
@@ -406,18 +320,18 @@
         Path path = compiler.getPath("loading.repl");
         compiler.writeToFile(path, "int a = 10; double x = 20; double a = 10;");
         test(new String[] { path.toString() },
-                (a) -> assertCommand(a, "x", "|  Variable x of type double has value 20.0\n"),
-                (a) -> assertCommand(a, "a", "|  Variable a of type double has value 10.0\n")
+                (a) -> assertCommand(a, "x", "x ==> 20.0"),
+                (a) -> assertCommand(a, "a", "a ==> 10.0")
         );
         Path unknown = compiler.getPath("UNKNOWN.jar");
         test(Locale.ROOT, true, new String[]{unknown.toString()},
                 "|  File " + unknown
-                + " is not found: " + unresolvableMessage(unknown) + "\n");
+                + " is not found: " + unresolvableMessage(unknown));
     }
 
     public void testReset() {
         test(
-                (a) -> assertReset(a, "/r"),
+                (a) -> assertReset(a, "/res"),
                 (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
                 (a) -> assertVariable(a, "int", "x"),
                 (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
@@ -444,8 +358,8 @@
         for (String s : new String[]{"/o", "/open"}) {
             test(
                     (a) -> assertCommand(a, s + " " + path.toString(), ""),
-                    (a) -> assertCommand(a, "a", "|  Variable a of type double has value 10.0\n"),
-                    (a) -> evaluateExpression(a, "A", "new A();", "\"A\""),
+                    (a) -> assertCommand(a, "a", "a ==> 10.0"),
+                    (a) -> evaluateExpression(a, "A", "new A();", "A"),
                     (a) -> evaluateExpression(a, "long", "Stream.of(\"A\").count();", "1"),
                     (a) -> {
                         loadVariable(a, "double", "x", "20.0", "20.0");
@@ -464,8 +378,7 @@
             Path unknown = compiler.getPath("UNKNOWN.repl");
             test(
                     (a) -> assertCommand(a, s + " " + unknown,
-                            "|  File '" + unknown
-                                    + "' is not found: " + unresolvableMessage(unknown) + "\n")
+                            "|  File '" + unknown + "' for '/open' is not found.")
             );
         }
     }
@@ -529,8 +442,8 @@
             );
             Path unknown = compiler.getPath("UNKNOWN");
             test(
-                    (a) -> assertCommand(a, "/set start " + unknown.toString(),
-                            "|  File '" + unknown + "' for /set start is not found.\n")
+                    (a) -> assertCommandOutputStartsWith(a, "/set start " + unknown.toString(),
+                            "|  File '" + unknown + "' for '/set start' is not found.")
             );
             test(false, new String[0],
                     (a) -> {
@@ -556,28 +469,6 @@
         }
     }
 
-    public void testUnknownCommand() {
-        test((a) -> assertCommand(a, "/unknown",
-                "|  No such command or snippet id: /unknown\n" +
-                "|  Type /help for help.\n"));
-    }
-
-    public void testEmptyClassPath() {
-        test(after -> assertCommand(after, "/classpath", "|  /classpath requires a path argument\n"));
-    }
-
-    public void testNoArgument() {
-        String[] commands = {"/save", "/open", "/set start"};
-        test(Stream.of(commands)
-                .map(cmd -> {
-                    String c = cmd;
-                    final String finalC = c;
-                    return (ReplTest) after -> assertCommand(after, cmd,
-                            "|  The " + finalC + " command requires a filename argument.\n");
-                })
-                .toArray(ReplTest[]::new));
-    }
-
     public void testStartSave() throws IOException {
         Compiler compiler = new Compiler();
         Path startSave = compiler.getPath("startSave.txt");
@@ -614,8 +505,8 @@
                 assertStartsWith("|  Does not match any current feedback mode")));
     }
 
-    public void testFeedbackOff() {
-        for (String off : new String[]{"o", "off"}) {
+    public void testFeedbackSilent() {
+        for (String off : new String[]{"s", "silent"}) {
             test(
                     a -> assertCommand(a, "/set feedback " + off, ""),
                     a -> assertCommand(a, "int a", ""),
@@ -632,16 +523,16 @@
         String[] sources = new String[] {"int a", "void f() {}", "class A {}", "a = 10"};
         String[] sources2 = new String[] {"int a //again", "void f() {int y = 4;}", "class A {} //again", "a = 10"};
         String[] output = new String[] {
-                "|  Added variable a of type int\n",
-                "|  Added method f()\n",
-                "|  Added class A\n",
-                "|  Variable a has been assigned the value 10\n"
+                "a ==> 0",
+                "|  created method f()",
+                "|  created class A",
+                "a ==> 10"
         };
         compiler.writeToFile(testNormalFile, sources2);
-        for (String feedback : new String[]{"/set f", "/set feedback"}) {
-            for (String feedbackState : new String[]{"n", "normal", "o", "off"}) {
+        for (String feedback : new String[]{"/set fe", "/set feedback"}) {
+            for (String feedbackState : new String[]{"n", "normal"}) {
                 test(
-                        a -> assertCommand(a, feedback + " " + feedbackState, "|  Feedback mode: normal\n"),
+                        a -> assertCommand(a, feedback + " " + feedbackState, "|  Feedback mode: normal"),
                         a -> assertCommand(a, sources[0], output[0]),
                         a -> assertCommand(a, sources[1], output[1]),
                         a -> assertCommand(a, sources[2], output[2]),
@@ -652,87 +543,21 @@
         }
     }
 
-    public void testDrop() {
-        test(false, new String[]{"-nostartup"},
-                a -> assertVariable(a, "int", "a"),
-                a -> dropVariable(a, "/drop 1", "int a = 0", "|  Dropped variable a\n"),
-                a -> assertMethod(a, "int b() { return 0; }", "()I", "b"),
-                a -> dropMethod(a, "/drop 2", "b ()I", "|  Dropped method b()\n"),
-                a -> assertClass(a, "class A {}", "class", "A"),
-                a -> dropClass(a, "/drop 3", "class A", "|  Dropped class A\n"),
-                a -> assertImport(a, "import java.util.stream.*;", "", "java.util.stream.*"),
-                a -> dropImport(a, "/drop 4", "import java.util.stream.*", ""),
-                a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
-                a -> assertCommandCheckOutput(a, "/methods", assertMethods()),
-                a -> assertCommandCheckOutput(a, "/classes", assertClasses()),
-                a -> assertCommandCheckOutput(a, "/imports", assertImports())
-        );
-        test(false, new String[]{"-nostartup"},
-                a -> assertVariable(a, "int", "a"),
-                a -> dropVariable(a, "/drop a", "int a = 0", "|  Dropped variable a\n"),
-                a -> assertMethod(a, "int b() { return 0; }", "()I", "b"),
-                a -> dropMethod(a, "/drop b", "b ()I", "|  Dropped method b()\n"),
-                a -> assertClass(a, "class A {}", "class", "A"),
-                a -> dropClass(a, "/drop A", "class A", "|  Dropped class A\n"),
-                a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
-                a -> assertCommandCheckOutput(a, "/methods", assertMethods()),
-                a -> assertCommandCheckOutput(a, "/classes", assertClasses()),
-                a -> assertCommandCheckOutput(a, "/imports", assertImports())
-        );
-    }
-
-    public void testDropNegative() {
-        test(false, new String[]{"-nostartup"},
-                a -> assertCommand(a, "/drop 0", "|  No definition or id named 0 found.  See /classes, /methods, /vars, or /list\n"),
-                a -> assertCommand(a, "/drop a", "|  No definition or id named a found.  See /classes, /methods, /vars, or /list\n"),
-                a -> assertCommandCheckOutput(a, "/drop",
-                        assertStartsWith("|  In the /drop argument, please specify an import, variable, method, or class to drop.")),
-                a -> assertVariable(a, "int", "a"),
-                a -> assertCommand(a, "a", "|  Variable a of type int has value 0\n"),
-                a -> assertCommand(a, "/drop 2", "|  The argument did not specify an active import, variable, method, or class to drop.\n")
-        );
-    }
-
-    public void testAmbiguousDrop() {
-        Consumer<String> check = s -> {
-            assertTrue(s.startsWith("|  The argument references more than one import, variable, method, or class"), s);
-            int lines = s.split("\n").length;
-            assertEquals(lines, 5, "Expected 3 ambiguous keys, but found: " + (lines - 2) + "\n" + s);
-        };
-        test(
-                a -> assertVariable(a, "int", "a"),
-                a -> assertMethod(a, "int a() { return 0; }", "()int", "a"),
-                a -> assertClass(a, "class a {}", "class", "a"),
-                a -> assertCommandCheckOutput(a, "/drop a", check),
-                a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
-                a -> assertCommandCheckOutput(a, "/methods", assertMethods()),
-                a -> assertCommandCheckOutput(a, "/classes", assertClasses()),
-                a -> assertCommandCheckOutput(a, "/imports", assertImports())
-        );
-        test(
-                a -> assertMethod(a, "int a() { return 0; }", "()int", "a"),
-                a -> assertMethod(a, "double a(int a) { return 0; }", "(int)double", "a"),
-                a -> assertMethod(a, "double a(double a) { return 0; }", "(double)double", "a"),
-                a -> assertCommandCheckOutput(a, "/drop a", check),
-                a -> assertCommandCheckOutput(a, "/methods", assertMethods())
-        );
-    }
-
     public void testHistoryReference() {
         test(false, new String[]{"-nostartup"},
                 a -> assertCommand(a, "System.err.println(1)", "", "", null, "", "1\n"),
                 a -> assertCommand(a, "System.err.println(2)", "", "", null, "", "2\n"),
-                a -> assertCommand(a, "/-2", "System.err.println(1)\n", "", null, "", "1\n"),
-                a -> assertCommand(a, "/history", "\n" +
+                a -> assertCommand(a, "/-2", "System.err.println(1)", "", null, "", "1\n"),
+                a -> assertCommand(a, "/history",
                                                     "/debug 0\n" +
                                                     "System.err.println(1)\n" +
                                                     "System.err.println(2)\n" +
                                                     "System.err.println(1)\n" +
                                                     "/history\n"),
-                a -> assertCommand(a, "/-2", "System.err.println(2)\n", "", null, "", "2\n"),
-                a -> assertCommand(a, "/!", "System.err.println(2)\n", "", null, "", "2\n"),
-                a -> assertCommand(a, "/2", "System.err.println(2)\n", "", null, "", "2\n"),
-                a -> assertCommand(a, "/1", "System.err.println(1)\n", "", null, "", "1\n")
+                a -> assertCommand(a, "/-2", "System.err.println(2)", "", null, "", "2\n"),
+                a -> assertCommand(a, "/!", "System.err.println(2)", "", null, "", "2\n"),
+                a -> assertCommand(a, "/2", "System.err.println(2)", "", null, "", "2\n"),
+                a -> assertCommand(a, "/1", "System.err.println(1)", "", null, "", "1\n")
         );
     }
 
@@ -744,14 +569,4 @@
             return ex.getMessage();
         }
     }
-
-    public void testCommandPrefix() {
-        test(a -> assertCommandCheckOutput(a, "/s",
-                      assertStartsWith("|  Command: /s is ambiguous: /save, /set")),
-             a -> assertCommand(a, "int var", "|  Added variable var of type int\n"),
-             a -> assertCommandCheckOutput(a, "/va",
-                      assertStartsWith("|    int var = 0")),
-             a -> assertCommandCheckOutput(a, "/save",
-                      assertStartsWith("|  The /save command requires a filename argument.")));
-    }
 }
--- a/langtools/test/jdk/jshell/ToolReloadTest.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/jdk/jshell/ToolReloadTest.java	Thu Apr 14 09:34:00 2016 -0700
@@ -24,7 +24,7 @@
 /*
  * @test
  * @key intermittent
- * @bug 8081845 8147898
+ * @bug 8081845 8147898 8143955
  * @summary Tests for /reload in JShell tool
  * @modules jdk.compiler/com.sun.tools.javac.api
  *          jdk.compiler/com.sun.tools.javac.main
@@ -71,7 +71,7 @@
         Path classpath = compiler.getPath(outDir);
         test(
                 (a) -> assertCommand(a, "/classpath " + classpath,
-                        String.format("|  Path '%s' added to classpath\n", classpath)),
+                        String.format("|  Path '%s' added to classpath", classpath)),
                 (a) -> assertMethod(a, "String foo() { return (new pkg.A()).toString(); }",
                         "()String", "foo"),
                 (a) -> assertVariable(a, "String", "v", "foo()", "\"A\""),
@@ -83,20 +83,20 @@
                         "-: String foo() { return (new pkg.A()).toString(); }\n" +
                         "-: String v = foo();\n");
                        },
-                (a) -> assertCommand(a, "v", "|  Variable v of type String has value \"Aprime\"\n"),
+                (a) -> assertCommand(a, "v", "v ==> \"Aprime\""),
                 (a) -> evaluateExpression(a, "String", "foo()", "\"Aprime\""),
-                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "\"Aprime\"")
+                (a) -> evaluateExpression(a, "pkg.A", "new pkg.A();", "Aprime")
         );
     }
 
     public void testReloadDrop() {
         test(false, new String[]{"-nostartup"},
                 a -> assertVariable(a, "int", "a"),
-                a -> dropVariable(a, "/dr 1", "int a = 0", "|  Dropped variable a\n"),
+                a -> dropVariable(a, "/dr 1", "int a = 0", "|  dropped variable a"),
                 a -> assertMethod(a, "int b() { return 0; }", "()I", "b"),
-                a -> dropMethod(a, "/drop b", "b ()I", "|  Dropped method b()\n"),
+                a -> dropMethod(a, "/drop b", "b ()I", "|  dropped method b()"),
                 a -> assertClass(a, "class A {}", "class", "A"),
-                a -> dropClass(a, "/dr A", "class A", "|  Dropped class A\n"),
+                a -> dropClass(a, "/dr A", "class A", "|  dropped class A"),
                 a -> assertCommand(a, "/reload",
                         "|  Restarting and restoring state.\n" +
                         "-: int a;\n" +
@@ -115,13 +115,13 @@
     public void testReloadQuiet() {
         test(false, new String[]{"-nostartup"},
                 a -> assertVariable(a, "int", "a"),
-                a -> dropVariable(a, "/dr 1", "int a = 0", "|  Dropped variable a\n"),
+                a -> dropVariable(a, "/dr 1", "int a = 0", "|  dropped variable a"),
                 a -> assertMethod(a, "int b() { return 0; }", "()I", "b"),
-                a -> dropMethod(a, "/drop b", "b ()I", "|  Dropped method b()\n"),
+                a -> dropMethod(a, "/drop b", "b ()I", "|  dropped method b()"),
                 a -> assertClass(a, "class A {}", "class", "A"),
-                a -> dropClass(a, "/dr A", "class A", "|  Dropped class A\n"),
+                a -> dropClass(a, "/dr A", "class A", "|  dropped class A"),
                 a -> assertCommand(a, "/reload quiet",
-                        "|  Restarting and restoring state.\n"),
+                        "|  Restarting and restoring state."),
                 a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
                 a -> assertCommandCheckOutput(a, "/methods", assertMethods()),
                 a -> assertCommandCheckOutput(a, "/classes", assertClasses()),
@@ -144,8 +144,8 @@
                         "-: ++c\n" +
                         "-: ++c\n"
                 ),
-                (a) -> assertCommand(a, "c", "|  Variable c of type int has value 11\n"),
-                (a) -> assertCommand(a, "$4", "|  Variable $4 of type int has value 10\n")
+                (a) -> assertCommand(a, "c", "c ==> 11"),
+                (a) -> assertCommand(a, "$4", "$4 ==> 10")
         );
     }
 
@@ -158,7 +158,7 @@
                 (a) -> assertCommand(a, "/vars", null),
                 (a) -> assertCommand(a, "/save abcd", null),
                 (a) -> assertCommand(a, "/reload",
-                        "|  Restarting and restoring state.\n")
+                        "|  Restarting and restoring state.")
         );
     }
 
@@ -168,7 +168,7 @@
                 (a) -> assertMethod(a, "int m(int z) { return z * z; }",
                         "(int)int", "m"),
                 (a) -> evaluateExpression(a, "int", "m(x)", "25"),
-                (a) -> assertCommand(a, "/reset", "|  Resetting state.\n"),
+                (a) -> assertCommand(a, "/reset", "|  Resetting state."),
                 (a) -> assertCommand(a, "/reload restore",
                         "|  Restarting and restoring from previous state.\n" +
                         "-: int x = 5;\n" +
@@ -188,7 +188,7 @@
                 (a) -> evaluateExpression(a, "int", "m(x)", "25"),
                 (a) -> assertCommand(a, "System.exit(1);",
                         "|  State engine terminated.\n" +
-                        "|  Restore definitions with: /reload restore\n"),
+                        "|  Restore definitions with: /reload restore"),
                 (a) -> assertCommand(a, "/reload restore",
                         "|  Restarting and restoring from previous state.\n" +
                         "-: int x = 5;\n" +
--- a/langtools/test/jdk/jshell/ToolSimpleTest.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/jdk/jshell/ToolSimpleTest.java	Thu Apr 14 09:34:00 2016 -0700
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8153716
+ * @bug 8153716 8143955
  * @summary Simple jshell tool tests
  * @modules jdk.compiler/com.sun.tools.javac.api
  *          jdk.compiler/com.sun.tools.javac.main
@@ -47,10 +47,102 @@
 @Test
 public class ToolSimpleTest extends ReplToolTesting {
 
+    public void testRemaining() {
+        test(
+                (a) -> assertCommand(a, "int z; z =", "z ==> 0"),
+                (a) -> assertCommand(a, "5", "z ==> 5"),
+                (a) -> assertCommand(a, "/*nada*/; int q =", ""),
+                (a) -> assertCommand(a, "77", "q ==> 77"),
+                (a) -> assertCommand(a, "//comment;", ""),
+                (a) -> assertCommand(a, "int v;", "v ==> 0"),
+                (a) -> assertCommand(a, "int v; int c",
+                        "v ==> 0\n" +
+                        "c ==> 0")
+        );
+    }
+
+    public void oneLineOfError() {
+        test(
+                (a) -> assertCommand(a, "12+", null),
+                (a) -> assertCommandCheckOutput(a, "  true", (s) ->
+                        assertTrue(s.contains("12+") && !s.contains("true"), "Output: '" + s + "'"))
+        );
+    }
+
+    public void defineVariables() {
+        test(
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
+                (a) -> assertVariable(a, "int", "a"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
+                (a) -> assertVariable(a, "double", "a", "1", "1.0"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables()),
+                (a) -> evaluateExpression(a, "double", "2 * a", "2.0"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/vars", assertVariables())
+        );
+    }
+
+    public void defineMethods() {
+        test(
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
+                (a) -> assertMethod(a, "int f() { return 0; }", "()int", "f"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
+                (a) -> assertMethod(a, "void f(int a) { g(); }", "(int)void", "f"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods()),
+                (a) -> assertMethod(a, "void g() {}", "()void", "g"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/methods", assertMethods())
+        );
+    }
+
+    public void defineClasses() {
+        test(
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses()),
+                (a) -> assertClass(a, "class A { }", "class", "A"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses()),
+                (a) -> assertClass(a, "interface A { }", "interface", "A"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses()),
+                (a) -> assertClass(a, "enum A { }", "enum", "A"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses()),
+                (a) -> assertClass(a, "@interface A { }", "@interface", "A"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/classes", assertClasses())
+        );
+    }
+
+    public void defineImports() {
+        test(
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
+                (a) -> assertImport(a, "import java.util.stream.Stream;", "", "java.util.stream.Stream"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
+                (a) -> assertImport(a, "import java.util.stream.*;", "", "java.util.stream.*"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
+                (a) -> assertImport(a, "import static java.lang.Math.PI;", "static", "java.lang.Math.PI"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/imports", assertImports()),
+                (a) -> assertImport(a, "import static java.lang.Math.*;", "static", "java.lang.Math.*"),
+                (a) -> assertCommandCheckOutput(a, "/list", assertList()),
+                (a) -> assertCommandCheckOutput(a, "/imports", assertImports())
+        );
+    }
+
     public void defineVar() {
         test(
-                (a) -> assertCommand(a, "int x = 72", "|  Added variable x of type int with initial value 72"),
-                (a) -> assertCommand(a, "x", "|  Variable x of type int has value 72"),
+                (a) -> assertCommand(a, "int x = 72", "x ==> 72"),
+                (a) -> assertCommand(a, "x", "x ==> 72"),
                 (a) -> assertCommand(a, "/vars", "|    int x = 72")
         );
     }
@@ -59,7 +151,7 @@
     public void defineUnresolvedVar() {
         test(
                 (a) -> assertCommand(a, "undefined x",
-                        "|  Added variable x, however, it cannot be referenced until class undefined is declared"),
+                        "|  created variable x, however, it cannot be referenced until class undefined is declared"),
                 (a) -> assertCommand(a, "/vars", "|    undefined x = (not-active)")
         );
     }
@@ -67,15 +159,37 @@
     public void testUnresolved() {
         test(
                 (a) -> assertCommand(a, "int f() { return g() + x + new A().a; }",
-                        "|  Added method f(), however, it cannot be invoked until method g(), variable x, and class A are declared"),
+                        "|  created method f(), however, it cannot be invoked until method g(), variable x, and class A are declared"),
                 (a) -> assertCommand(a, "f()",
-                        "|  Attempted to call method f() which cannot be invoked until method g(), variable x, and class A are declared"),
+                        "|  attempted to call method f() which cannot be invoked until method g(), variable x, and class A are declared"),
                 (a) -> assertCommandOutputStartsWith(a, "int g() { return x; }",
-                        "|  Added method g(), however, it cannot be invoked until variable x is declared"),
-                (a) -> assertCommand(a, "g()", "|  Attempted to call method g() which cannot be invoked until variable x is declared")
+                        "|  created method g(), however, it cannot be invoked until variable x is declared"),
+                (a) -> assertCommand(a, "g()", "|  attempted to call method g() which cannot be invoked until variable x is declared")
         );
     }
 
+    public void testUnknownCommand() {
+        test((a) -> assertCommand(a, "/unknown",
+                "|  No such command or snippet id: /unknown\n" +
+                "|  Type /help for help."));
+    }
+
+    public void testEmptyClassPath() {
+        test(after -> assertCommand(after, "/classpath", "|  The /classpath command requires a path argument."));
+    }
+
+    public void testNoArgument() {
+        String[] commands = {"/save", "/open", "/set start"};
+        test(Stream.of(commands)
+                .map(cmd -> {
+                    String c = cmd;
+                    final String finalC = c;
+                    return (ReplTest) after -> assertCommand(after, cmd,
+                            "|  '" + finalC + "' requires a filename argument.");
+                })
+                .toArray(ReplTest[]::new));
+    }
+
     public void testDebug() {
         test(
                 (a) -> assertCommand(a, "/deb", "|  Debugging on"),
@@ -85,6 +199,72 @@
         );
     }
 
+    public void testDrop() {
+        test(false, new String[]{"-nostartup"},
+                a -> assertVariable(a, "int", "a"),
+                a -> dropVariable(a, "/drop 1", "int a = 0", "|  dropped variable a"),
+                a -> assertMethod(a, "int b() { return 0; }", "()I", "b"),
+                a -> dropMethod(a, "/drop 2", "b ()I", "|  dropped method b()"),
+                a -> assertClass(a, "class A {}", "class", "A"),
+                a -> dropClass(a, "/drop 3", "class A", "|  dropped class A"),
+                a -> assertImport(a, "import java.util.stream.*;", "", "java.util.stream.*"),
+                a -> dropImport(a, "/drop 4", "import java.util.stream.*", ""),
+                a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
+                a -> assertCommandCheckOutput(a, "/methods", assertMethods()),
+                a -> assertCommandCheckOutput(a, "/classes", assertClasses()),
+                a -> assertCommandCheckOutput(a, "/imports", assertImports())
+        );
+        test(false, new String[]{"-nostartup"},
+                a -> assertVariable(a, "int", "a"),
+                a -> dropVariable(a, "/drop a", "int a = 0", "|  dropped variable a"),
+                a -> assertMethod(a, "int b() { return 0; }", "()I", "b"),
+                a -> dropMethod(a, "/drop b", "b ()I", "|  dropped method b()"),
+                a -> assertClass(a, "class A {}", "class", "A"),
+                a -> dropClass(a, "/drop A", "class A", "|  dropped class A"),
+                a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
+                a -> assertCommandCheckOutput(a, "/methods", assertMethods()),
+                a -> assertCommandCheckOutput(a, "/classes", assertClasses()),
+                a -> assertCommandCheckOutput(a, "/imports", assertImports())
+        );
+    }
+
+    public void testDropNegative() {
+        test(false, new String[]{"-nostartup"},
+                a -> assertCommandOutputStartsWith(a, "/drop 0", "|  No definition or id found named: 0"),
+                a -> assertCommandOutputStartsWith(a, "/drop a", "|  No definition or id found named: a"),
+                a -> assertCommandCheckOutput(a, "/drop",
+                        assertStartsWith("|  In the /drop argument, please specify an import, variable, method, or class to drop.")),
+                a -> assertVariable(a, "int", "a"),
+                a -> assertCommand(a, "a", "a ==> 0"),
+                a -> assertCommand(a, "/drop 2", "|  The argument did not specify an active import, variable, method, or class to drop.")
+        );
+    }
+
+    public void testAmbiguousDrop() {
+        Consumer<String> check = s -> {
+            assertTrue(s.startsWith("|  The argument references more than one import, variable, method, or class"), s);
+            int lines = s.split("\n").length;
+            assertEquals(lines, 5, "Expected 3 ambiguous keys, but found: " + (lines - 2) + "\n" + s);
+        };
+        test(
+                a -> assertVariable(a, "int", "a"),
+                a -> assertMethod(a, "int a() { return 0; }", "()int", "a"),
+                a -> assertClass(a, "class a {}", "class", "a"),
+                a -> assertCommandCheckOutput(a, "/drop a", check),
+                a -> assertCommandCheckOutput(a, "/vars", assertVariables()),
+                a -> assertCommandCheckOutput(a, "/methods", assertMethods()),
+                a -> assertCommandCheckOutput(a, "/classes", assertClasses()),
+                a -> assertCommandCheckOutput(a, "/imports", assertImports())
+        );
+        test(
+                a -> assertMethod(a, "int a() { return 0; }", "()int", "a"),
+                a -> assertMethod(a, "double a(int a) { return 0; }", "(int)double", "a"),
+                a -> assertMethod(a, "double a(double a) { return 0; }", "(double)double", "a"),
+                a -> assertCommandCheckOutput(a, "/drop a", check),
+                a -> assertCommandCheckOutput(a, "/methods", assertMethods())
+        );
+    }
+
     public void testHelpLength() {
         Consumer<String> testOutput = (s) -> {
             List<String> ss = Stream.of(s.split("\n"))
@@ -148,6 +328,16 @@
         );
     }
 
+    public void testCommandPrefix() {
+        test(a -> assertCommandCheckOutput(a, "/s",
+                      assertStartsWith("|  Command: '/s' is ambiguous: /save, /set")),
+             a -> assertCommand(a, "int var", "var ==> 0"),
+             a -> assertCommandCheckOutput(a, "/va",
+                      assertStartsWith("|    int var = 0")),
+             a -> assertCommandCheckOutput(a, "/save",
+                      assertStartsWith("|  '/save' requires a filename argument.")));
+    }
+
     public void testHeadlessEditPad() {
         String prevHeadless = System.getProperty("java.awt.headless");
         try {
--- a/langtools/test/tools/javac/unit/T6198196.java	Thu Apr 14 09:09:34 2016 -0700
+++ b/langtools/test/tools/javac/unit/T6198196.java	Thu Apr 14 09:34:00 2016 -0700
@@ -36,34 +36,31 @@
 
 public class T6198196 {
     static String pkginf = "package-info";
-    static StandardJavaFileManager fm;
-    static void test(String pathname, String filename, boolean result) {
-        JavaFileObject fo;
-        fo = fm.getJavaFileObjectsFromStrings(Arrays.asList(pathname)).iterator().next();
-        if (result != fo.isNameCompatible(filename, JavaFileObject.Kind.SOURCE))
-            throw new AssertionError("endsWith(" + pathname + ", "
-                                     + filename + ") != " + result);
-        System.out.format("OK: endsWith(%s, %s) = %s%n", pathname, filename, result);
+    static void test(String pathname, String filename, boolean result) throws IOException {
+        try (StandardJavaFileManager fm =
+                ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) {
+            JavaFileObject fo =
+                    fm.getJavaFileObjectsFromStrings(Arrays.asList(pathname)).iterator().next();
+            if (result != fo.isNameCompatible(filename, JavaFileObject.Kind.SOURCE))
+                throw new AssertionError("endsWith(" + pathname + ", "
+                                         + filename + ") != " + result);
+            System.out.format("OK: endsWith(%s, %s) = %s%n", pathname, filename, result);
+        }
     }
     public static void main(String[] args) throws IOException {
-        fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
-        try {
-            boolean windows = System.getProperty("os.name").startsWith("Windows");
-            test("/x/y/z/package-info.java", pkginf, true);
-            if (windows) {
-                test("\\x\\y\\z\\package-info.java", pkginf, true);
-                test("..\\x\\y\\z\\package-info.java", pkginf, true);
-            } else {
-                test("\\x\\y\\z\\package-info.java", pkginf, false);
-                test("..\\x\\y\\z\\package-info.java", pkginf, false);
-            }
-            test("Package-info.java", pkginf, false);
-            test("../x/y/z/package-info.java", pkginf, true);
-            test("/x/y/z/package-info.java", pkginf, true);
-            test("x/y/z/package-info.java", pkginf, true);
-            test("package-info.java", pkginf, true);
-        } finally {
-            fm.close();
+        boolean windows = System.getProperty("os.name").startsWith("Windows");
+        test("/x/y/z/package-info.java", pkginf, true);
+        if (windows) {
+            test("\\x\\y\\z\\package-info.java", pkginf, true);
+            test("..\\x\\y\\z\\package-info.java", pkginf, true);
+        } else {
+            test("\\x\\y\\z\\package-info.java", pkginf, false);
+            test("..\\x\\y\\z\\package-info.java", pkginf, false);
         }
+        test("Package-info.java", pkginf, false);
+        test("../x/y/z/package-info.java", pkginf, true);
+        test("/x/y/z/package-info.java", pkginf, true);
+        test("x/y/z/package-info.java", pkginf, true);
+        test("package-info.java", pkginf, true);
     }
 }