Index: /release-kits/shared/uninstaller/Uninstall.sh
===================================================================
--- /release-kits/shared/uninstaller/Uninstall.sh	(revision 17791)
+++ /release-kits/shared/uninstaller/Uninstall.sh	(revision 17792)
@@ -13,5 +13,5 @@
 	rmdir packages
 	
-	rm -f bin
+	rm -rf bin
 		
 	rm uninst.jar
Index: /release-kits/shared/uninstaller/Uninstaller.java
===================================================================
--- /release-kits/shared/uninstaller/Uninstaller.java	(revision 17791)
+++ /release-kits/shared/uninstaller/Uninstaller.java	(revision 17792)
@@ -1,3 +1,3 @@
-import java.util.ResourceBundle;
+	import java.util.ResourceBundle;
 import java.awt.*;
 import java.awt.event.*;
@@ -22,4 +22,15 @@
 import java.util.ArrayList;
 
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.JTextArea;
+
 public class Uninstaller {
 
@@ -49,4 +60,5 @@
 
 
+	JScrollPane logPane;
 	JTextArea log;
 	JButton uninstallButton;
@@ -73,10 +85,11 @@
 		//The panel to be displayed while the uninstall is happening
 		progressPanel = new JPanel(new BorderLayout());
-		log = new JTextArea();
-		JScrollPane logPane = new JScrollPane(log);
+		log = new FollowingJTextArea();
+		log.setEditable(false);
+		logPane = new JScrollPane(log);
 		logPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
 		logPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
 		progressPanel.add( BorderLayout.NORTH, new JLabel("Progress") );
-		progressPanel.add( BorderLayout.CENTER, logPane );
+		progressPanel.add( BorderLayout.CENTER, log );
 
 		//initial toolbar
@@ -126,5 +139,5 @@
 
 		//the initial screen
-		frame.getContentPane().add( BorderLayout.NORTH, introPanel );
+		frame.getContentPane().add( BorderLayout.CENTER, introPanel );
 		frame.getContentPane().add( BorderLayout.SOUTH, initialToolbar );
 
@@ -195,20 +208,5 @@
 			frame.getContentPane().remove(introPanel);
 			frame.getContentPane().add( BorderLayout.CENTER, progressPanel );
-
-			//disable the uninstall button
-			uninstallButton.setEnabled( false );
-				options = new Object[1];
-				options[0] = "OK";
-				n = JOptionPane.showOptionDialog(
-					frame,
-					"repainting",
-					"repainting",
-				    JOptionPane.OK_OPTION,
-				    JOptionPane.INFORMATION_MESSAGE,
-				    null,
-				    options,
-				    options[0]
-				);
-
+			progressPanel.setVisible( true );
 
 			//start the unstinall
@@ -260,6 +258,8 @@
 		if ( startMenuPath == null ) {
 			log.append( bundle.getString("uninstaller.info.no.startmenu") + "\n" );
+			log.repaint();
 		} else {
 			log.append( "StartMenu Path: " + startMenuPath.getAbsolutePath() + "\n" );
+			log.repaint();
 			try {
 				recursiveDelete( startMenuPath, null );
@@ -279,4 +279,9 @@
 			exceptions.add( new File("bin/search4j.exe") );
 			exceptions.add( new File("bin/search4j") );
+
+			exceptions.add( new File("bin/windows/search4j.exe") );
+			exceptions.add( new File("bin/linux/search4j") );
+			exceptions.add( new File("bin/darwin/search4j") );
+
 			exceptions.add( new File("packages/jre") );
 			exceptions.add( new File("uninst.jar") );
@@ -306,4 +311,5 @@
 		} catch ( CancelledException ce ) {
 			log.append( bundle.getString("uninstaller.cancelled") + "\n" );
+			log.repaint();
 			JOptionPane.showMessageDialog(frame, bundle.getString("uninstaller.cancelled"), bundle.getString("uninstaller.complete"), 1);
 			changeToFinishToolbar();
@@ -316,4 +322,5 @@
 		} catch (Exception e) {
 			log.append( bundle.getString("uninstaller.couldnt-create-flagfile") + "\n" );
+			log.repaint();
 		}
 
@@ -367,4 +374,5 @@
 		if (!f.exists()) {
 			log.append( Strings.replaceAll( bundle.getString("uninstaller.warning.nonexistent"), "{file}", f.getAbsolutePath() ) + "\n" );
+			log.repaint();
 			return;
 		}
@@ -389,4 +397,5 @@
 		if ( !f.exists() ) {
 			log.append( Strings.replaceAll( bundle.getString("uninstaller.error.nonexistent"), "{file}", f.getAbsolutePath() ) + "\n" );
+			log.repaint();
 			return;
 		}
@@ -415,7 +424,30 @@
 		if ( doDelete ) {
 
+			Object[] options = null;
+			int n = 0;
 			log.append( Strings.replaceAll( bundle.getString("uninstaller.deleting"), "{file}", f.getAbsolutePath() ) + "\n" );
+			log.repaint();
+			try{ Thread.sleep( 50 ); } catch( Exception e ) {}
+/*
+			//disable the uninstall button
+
+				options = new Object[1];
+				options = new Object[1];
+				options[0] = "OK";
+				n = JOptionPane.showOptionDialog(
+					frame,
+					"repainting",
+					"repainting",
+				    JOptionPane.OK_OPTION,
+				    JOptionPane.INFORMATION_MESSAGE,
+				    null,
+				    options,
+				    options[0]
+				);
+*/
+
 			while ( !f.delete() ) {
 				log.append( Strings.replaceAll( bundle.getString("uninstaller.warning.couldnt.delete"), "{file}", f.getAbsolutePath() ) + "\n" );
+				log.repaint();
 
 				if ( ignoreReadOnlys ) {
@@ -423,6 +455,9 @@
 				}
 
-				Object[] options = { bundle.getString("uninstaller.retry"), bundle.getString("uninstaller.skip"), bundle.getString("uninstaller.skip.all"), bundle.getString("uninstaller.cancel") };
-				int n = JOptionPane.showOptionDialog(
+				options[0] = bundle.getString("uninstaller.retry");
+				options[1] = bundle.getString("uninstaller.skip");
+				options[2] = bundle.getString("uninstaller.skip.all");
+				options[3] = bundle.getString("uninstaller.cancel");
+				n = JOptionPane.showOptionDialog(
 					frame,
 					Strings.replaceAll( bundle.getString("uninstaller.warning.readonly"), "{file}", f.getAbsolutePath() ),
@@ -476,2 +511,103 @@
 }
 
+
+
+
+class FollowingJTextArea extends JTextArea{
+
+    private boolean follow = true;
+
+    public FollowingJTextArea() {
+        jInit();
+    }
+
+
+    private void jInit(){
+        final JPopupMenu popUp = getPopupMenu();
+        this.add(popUp);
+        this.addMouseListener(new MouseAdapter(){
+            public void mouseClicked(MouseEvent e) {
+                if (e.getButton() == e.BUTTON3) {
+                    popUp.show(FollowingJTextArea.this,e.getX(),e.getY());
+                }
+            }
+        });
+    }
+
+    public boolean isFollow() {
+        return follow;
+    }
+    public void setFollow(boolean follow) {
+        this.follow = follow;
+    }
+
+    private void scrollToEnd(){
+        setCaretPosition(getDocument().getLength());
+    }
+    private void toggleFollow(){
+        setFollow(!isFollow());
+    }
+
+    /**
+     * Appends the given text to the end of the document.
+     *
+     * @param str the text to insert
+     * @todo Implement this javax.swing.JTextArea method
+     */
+    public void append(String str) {
+        super.append(str);
+        if(follow)scrollToEnd();
+    }
+    private JPopupMenu getPopupMenu() {
+        JPopupMenu contextMenu = new JPopupMenu("Options");
+        JMenuItem saveMenu = new JMenuItem("Save Text");
+/*
+        saveMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                SelectFileAction action = new SelectFileAction("Save Output", null, null);
+                try {
+                    action.actionPerformed(new ActionEvent(this, 0, "Save Output"));
+                    if (action.selectedFile != null) {
+                        FileWriter fos = new FileWriter(action.selectedFile);
+                        fos.write(getText());
+                        fos.close();
+                    }
+
+                }
+                catch (FileNotFoundException ex) {
+                    System.err.println("FileNotFoundException");
+                }
+                catch (IOException ex) {
+                    System.err.println("IOException");
+                }
+            }
+        });
+        contextMenu.add(saveMenu);
+*/
+
+        JMenuItem toggleFollowMenu = new JMenuItem("Toggle Follow");
+        toggleFollowMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                toggleFollow();
+            }
+        });
+        contextMenu.add(toggleFollowMenu);
+
+        JMenuItem jumpToEndMenu = new JMenuItem("Jump To End");
+        jumpToEndMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                setCaretPosition(getDocument().getLength());
+            }
+        });
+        contextMenu.add(toggleFollowMenu);
+
+        JMenuItem clearTextMenu = new JMenuItem("Clear Text");
+        clearTextMenu.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                setText("");
+            }
+        });
+        contextMenu.add(clearTextMenu);
+        return contextMenu;
+    }
+}
