diff --git a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java
index f0eda8e..6a5300d 100644
--- a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java
+++ b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtableCellRenderer.java
@@ -49,10 +49,12 @@
       }catch (NumberFormatException nfe) {
         state=new Integer(-1);
       }
-      if (((String) value).equals("??/??/??")) {
-	setBackground(Color.white);
-      } else{
-	setBackground((Color) eventName.get(state));
+      if (value!=null) {
+        if (((String) value).equals("??/??/??")) {
+	  setBackground(Color.white);
+        } else{
+	  setBackground((Color) eventName.get(state));
+        }
       }
     }
     setText((String) value);
diff --git a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java
index 5e8546b..ecefb60 100644
--- a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java
+++ b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/JtreeCellRenderer.java
@@ -18,89 +18,117 @@
 package org.apache.felix.mosgi.console.component;
 
 import org.osgi.framework.BundleContext;
-
 import java.awt.Color;
-import javax.swing.JTree;
-import javax.swing.JLabel;
-import java.util.StringTokenizer;
-
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.TreeCellRenderer;
 import java.awt.Component;
-import javax.swing.tree.DefaultMutableTreeNode;
 import java.awt.Graphics;
-import java.util.NoSuchElementException;
 import java.awt.Font;
 import java.awt.Dimension;
-
-import javax.swing.ImageIcon;
 import java.awt.Toolkit;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.JTree;
+import javax.swing.JLabel;
+import javax.swing.ImageIcon;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.TreeCellRenderer;
+import javax.swing.tree.TreePath;
+import java.util.StringTokenizer;
+import java.util.NoSuchElementException;
+import java.lang.StringBuffer;
 
 public class JtreeCellRenderer extends DefaultTreeCellRenderer {
 
+  private static final String[] LOG_LVL=new String[] {"", "Error", "Warning", "Info", "Debug"};
+
   private boolean isLeaf=false;
 
   private String[] states=new String[]{"ACTIVE","INSTALLED","RESOLVED","STARTING","STOPPING","UNINSTALLED"};
-  private Color[] colors=new Color[]{Color.green,Color.orange,Color.red,Color.white,Color.white,Color.black};
+  private Color[] colors=new Color[]{Color.green,Color.orange,Color.red,Color.gray,Color.gray,Color.black};
   private ImageIcon[] ii=new ImageIcon[6];
   private ImageIcon iiOldLog=null;
 
-  public JtreeCellRenderer(BundleContext bdlCtx){
+  private RemoteLogger_jtree rl_jtree=null;
+
+  public JtreeCellRenderer(BundleContext bdlCtx, RemoteLogger_jtree rl_jtree){
+    this.rl_jtree=rl_jtree;
     for (int i=0 ; i<states.length ; i++){
       this.ii[i]=new ImageIcon(Toolkit.getDefaultToolkit().getImage(bdlCtx.getBundle().getResource("icons/"+states[i]+".gif")));
     }
     this.iiOldLog=new ImageIcon(Toolkit.getDefaultToolkit().getImage(bdlCtx.getBundle().getResource("icons/OLDLOG.gif")));
-
   }
 
   public Dimension getPreferredSize() {
     Dimension dim = super.getPreferredSize();
-    //maxL=(isLeaf)?Math.max(maxL,dim.width):maxL;
-    //
-    return (isLeaf)?dim:new Dimension(800/*maxL*/,dim.height);
+    return (isLeaf)?dim:new Dimension(800,dim.height);
   }
 
   public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
     this.isLeaf=leaf;
-
-    super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus);
+    //super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus);
+    setText(value.toString());
     setOpaque(true);
     setBackground(Color.white);
-    setFont(new Font("Monospaced",Font.BOLD,12));
+    setFont(new Font("Monospaced",Font.BOLD,14));
     setToolTipText(null);
-
+    setIcon(null);
     StringTokenizer st=null;
     DefaultMutableTreeNode dmtn=(DefaultMutableTreeNode)value;
+
     int lvl=dmtn.getLevel(); 
-    if(lvl==3 & dmtn.getChildCount()>0){
-      st=new StringTokenizer(dmtn.getFirstChild().toString()," | ");
-    }
-    if (lvl==4){
-      st=new StringTokenizer(dmtn.toString()," | ");
+    switch (lvl) {
+      case 2: { // port / profilName / logLvl
+        Integer val=rl_jtree.getTreeNodeLogLvl((DefaultMutableTreeNode) value);
+        setText(value+" (log level="+LOG_LVL[val.intValue()]+")");
+	break;
+      }
+      case 3: { // bundleId / symbolic name / children count
+        // TODO : create a bundleNodeUserObject (getText, getTtt, getStateColor, setNewValues(test,ttt,stateColor))
+        st=new StringTokenizer(dmtn.getFirstChild().toString()," | ");
+        if(st!=null) {	
+          String date=st.nextToken();
+          st.nextToken();
+          String state=st.nextToken();
+	  if (tree.getLeadSelectionPath()!=null) {
+	    for (int i=0; i<states.length ; i++) {
+	      if (state.equals(states[i])) {
+	        setBackground(colors[i]);
+	      }
+	    }
+	    StringTokenizer st2 = new StringTokenizer(((DefaultMutableTreeNode)dmtn.getFirstChild()).toString()," | ");
+	    StringBuffer ttt=new StringBuffer("<html><B>IP = </B>"+/*IP=<ip> Profil=<port>/<profil>*/dmtn.getParent().getParent()+"<B> Profil =</B>"+dmtn.getParent()+"<br><B>Bundle : </B>"+/*Bundle : Id=<bundleId> : <bundleSymbolicName>*/dmtn+"<br><B>Date : </B>"+/*<date> - <time>*/st2.nextToken()+" - "+st2.nextToken()+"<br><B>State : "+/*<bundleState>*/st2.nextToken()+"<br>Event "+/*Event <eventNumber> : <logLevel> : <message>*/dmtn.getChildCount()+" : "+st2.nextToken()+" : </B><br>");
+	    while (st2.hasMoreTokens()) {
+	      ttt.append(st2.nextToken()+" ");
+	    }
+	    setToolTipText(ttt+"</html>");
+	  }
+	} 
+        break;
+      }
+      case 4: { // icon / date / time / state / logLvl / msg
+        st=new StringTokenizer(dmtn.toString()," | ");
+	setFont(new Font("Monospaced",Font.PLAIN,10));
+        if(st!=null){
+          String date=st.nextToken();
+          st.nextToken();
+	  String state=st.nextToken();
+	  for (int i=0 ; i<states.length ; i++){
+	    if (state.equals(states[i])){
+	      if(!date.equals("??/??/??")){
+	        setIcon(ii[i]);
+	      } else{
+	        setIcon(iiOldLog);
+	      }
+	    }
+	  }
+	}
+      break;
+      }
     }
 
-    if(st!=null){
-      String date=st.nextToken();
-      st.nextToken();
-      String state=st.nextToken();
-      for (int i=0 ; i<states.length ; i++){
-        if (state.equals(states[i])){
-          if (lvl==4){
-	    if(!date.equals("??/??/??")){
-	      setIcon(ii[i]);
-	    }else{
-	      setIcon(iiOldLog);
-	    }
-	    setFont(new Font("Monospaced",Font.PLAIN,10));
-          }else{ 
-            StringTokenizer st2 = new StringTokenizer(((DefaultMutableTreeNode)dmtn.getFirstChild()).toString()," | ");
-            setToolTipText("<html><B>IP = </B>"+/*IP=<ip> Profil=<port>/<profil>*/dmtn.getParent().getParent()+"<B> Profil =</B>"+dmtn.getParent()+"<br><B>Bundle : </B>"+/*Bundle : Id=<bundleId> : <bundleSymbolicName>*/dmtn+"<br><B>Date : </B>"+/*<date> - <time>*/st2.nextToken()+" - "+st2.nextToken()+"<br><B>State : "+/*<bundleState>*/st2.nextToken()+"<br>Event "+/*Event <eventNumber> : <logLevel> : <message>*/dmtn.getChildCount()+" : "+st2.nextToken()+" : "+st2.nextToken()+"</B></html>");
-            setBackground(colors[i]);
-          }
-	break;
-        }
-      }
-    }	
+    if (tree.getLeadSelectionPath()==null) {
+      setForeground(Color.blue);
+    } else {
+      setForeground(Color.black);
+    }
 	
     return this;
   }	
diff --git a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/MyTree.java b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/MyTree.java
index 4157140..b26d06e 100644
--- a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/MyTree.java
+++ b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/MyTree.java
@@ -21,6 +21,7 @@
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.ToolTipManager;
 import javax.swing.UIManager;
+import javax.swing.tree.TreePath;
 
 public class MyTree extends JTree{
 
diff --git a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java
index ad307f7..a0aa432 100644
--- a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java
+++ b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtable.java
@@ -25,92 +25,68 @@
 import javax.swing.JButton;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.ListSelectionModel;
+import javax.swing.JFileChooser;
+import javax.swing.table.JTableHeader;
+import javax.swing.JOptionPane;
 import java.awt.Component;
-
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
 import javax.management.Notification;
 import javax.management.NotificationListener;
 import javax.management.ObjectName;
 import javax.management.MBeanServerConnection;
-import javax.swing.ListSelectionModel;
-
 import java.util.Hashtable;
 import java.util.StringTokenizer;
-
-import java.beans.PropertyChangeEvent;
-
-import java.awt.BorderLayout;
-import java.awt.event.ActionListener;
-import java.awt.event.ActionEvent;
 import java.util.Vector;
-
+import java.util.Date;
 import java.io.PrintStream;
 import java.io.File;
 import java.io.FileNotFoundException;
-import javax.swing.JFileChooser;
-		
-import java.util.Date;
 import java.text.DateFormat;
 //import java.text.SimpleDateFormat;
-import javax.swing.table.DefaultTableCellRenderer;
-import javax.swing.tree.DefaultMutableTreeNode;
 
-public class RemoteLogger_jtable extends DefaultTableModel implements CommonPlugin, NotificationListener{
+public class RemoteLogger_jtable extends DefaultTableModel implements CommonPlugin, NotificationListener, ActionListener{
 
   private JTable logList;
   private JButton jb_save;
+  private String[] columnToolTips=new String[]{"","","","","",
+          "<html><pre> 1 UNINSTALLED black<br> 2 INSTALLED   orange<br> 4 RESOLVED    red<br> 8 STARTING    gray<br>16 STOPPING    gray<br>32 ACTIVE      green",
+	  "",""};
   private JPanel jbPanel;
   private JPanel jp;
   private Hashtable nodes=new Hashtable();
 
-  public void jb_actionPerformed(ActionEvent e) {
-    String compoName=((Component) e.getSource()).getName();
-	
-    if (compoName.equals("jb_save")){
-      PrintStream ps=System.out;
-      JFileChooser jfc=new JFileChooser();
-      if (jfc.showSaveDialog(null)==JFileChooser.APPROVE_OPTION & jfc.getSelectedFile()!=null){	
-      try{
-        ps=new PrintStream(jfc.getSelectedFile());
-        System.out.println("Save remote log into \""+jfc.getSelectedFile().getName()+"\""); }
-      catch (FileNotFoundException fnfe){
-        System.out.println("err : "+fnfe); }
-      }
-      int col=this.logList.getColumnCount(); // TODO : try this.getColumnCount()
-      int line=this.logList.getRowCount() - 1; // last line always empty
-      //ps.print(col+" "+line);
-      Vector tableData=new Vector();
-      tableData=this.getDataVector();
-      for (int i=0 ; i<line ; i++){
-        ps.print(i+" : ");
-        for (int j=0 ; j<col ; j++){
-	  ps.print((String) ( ((Vector) (tableData.elementAt(i))).elementAt(j) )+" | ");	
-        }
-        ps.print("\n");
-      }
-    }
-  }
-
   public RemoteLogger_jtable (){
     super(new String[]{"Date","Time", "Src", "Id", "Name", "State", "Lvl", "Msg"},1);
     System.out.println("JTable Remote logger");
-   
-    this.jp=new JPanel();
-    this.jp.setLayout(new BorderLayout());
-   
-    this.jbPanel=new JPanel();
-    this.jbPanel.setSize(300,25);
 
-    this.jb_save=new JButton("Save log on file");
-    this.jb_save.setName("jb_save");
+    jp=new JPanel();
+    jp.setLayout(new BorderLayout());
+   
+    jbPanel=new JPanel();
+    jbPanel.setSize(300,25);
 
-    ActionListener al = new ActionListener(){
-        public void actionPerformed(ActionEvent e){
-            jb_actionPerformed(e);
-        }
+    jb_save=new JButton("Save log on file");
+    jb_save.setName("jb_save");
+    jb_save.addActionListener(this);
+    
+    logList=new JTable(this){
+      protected JTableHeader createDefaultTableHeader() {
+        return new JTableHeader(columnModel) {
+          public String getToolTipText(MouseEvent e) {
+            String tip = null;
+            java.awt.Point p = e.getPoint();
+            int index = columnModel.getColumnIndexAtX(p.x);
+            int realIndex = columnModel.getColumn(index).getModelIndex();
+            return columnToolTips[realIndex];
+          }
+        };
+      }
     };
-    this.jb_save.addActionListener(al);
-
-    logList=new JTable(this);
     JtableCellRenderer cellRenderer=new JtableCellRenderer();
     logList.setDefaultRenderer(Object.class,cellRenderer);
 
@@ -126,10 +102,10 @@
     logList.getColumnModel().getColumn(7).setPreferredWidth(180);    
 
     logList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-    logList.getTableHeader().setReorderingAllowed(true);//false); // true c'est sympa pourtant... ?
+    logList.getTableHeader().setReorderingAllowed(true);//false);
     
-    this.jbPanel.add(jb_save);
-    jp.add(this.jbPanel, BorderLayout.NORTH);
+    jbPanel.add(jb_save);
+    jp.add(jbPanel, BorderLayout.NORTH);
     jp.add(new JScrollPane(logList), BorderLayout.CENTER);    
   }
 
@@ -146,7 +122,6 @@
   public void registerServicePlugin(){}
   public void unregisterServicePlugin(){}
 /* fin a supprimer */
-
   
   public void propertyChange(PropertyChangeEvent e){
     if (e.getPropertyName().equals(Plugin.NEW_NODE_CONNECTION)){
@@ -186,5 +161,33 @@
     this.insertRow(0,event); 
     this.fireTableRowsInserted(0, 0);
   }
-  
+ 
+  public void actionPerformed(ActionEvent e) {
+    Object o=e.getSource();
+    if ( o==jb_save){
+      PrintStream ps=System.out;
+      JFileChooser jfc=new JFileChooser();
+      if (jfc.showSaveDialog(null)==JFileChooser.APPROVE_OPTION & jfc.getSelectedFile()!=null){	
+      try{
+        ps=new PrintStream(jfc.getSelectedFile());
+        System.out.println("Save remote log into \""+jfc.getSelectedFile().getName()+"\""); }
+      catch (FileNotFoundException fnfe){
+        System.out.println("err : "+fnfe); }
+      }
+      int col=this.logList.getColumnCount();
+      int line=this.logList.getRowCount() - 1; // last line always empty
+      //ps.print(col+" "+line);
+      Vector tableData=new Vector();
+      tableData=this.getDataVector();
+      for (int i=0 ; i<line ; i++){
+        ps.print(i+" : ");
+        for (int j=0 ; j<col ; j++){
+	  ps.print((String) ( ((Vector) (tableData.elementAt(i))).elementAt(j) )+" | ");	
+        }
+        ps.print("\n");
+      }
+    }
+  }
+
+ 
 }
diff --git a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java
index 35bdff6..e3423a1 100644
--- a/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java
+++ b/mosgi.console.component/src/main/java/org/apache/felix/mosgi/console/component/RemoteLogger_jtree.java
@@ -21,68 +21,61 @@
 import org.apache.felix.mosgi.console.component.MyTree;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Bundle;
-
 import java.beans.PropertyChangeEvent;
-
 import javax.swing.JButton;
-import javax.swing.JFrame;
 import javax.swing.JPanel;
-import javax.swing.JFileChooser;
 import javax.swing.JPopupMenu;
 import javax.swing.JMenuItem;
 import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.table.DefaultTableCellRenderer;
-import javax.swing.table.DefaultTableModel;
+import javax.swing.JScrollBar;
 import javax.swing.JTree;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.TreePath;
 import javax.swing.JOptionPane;
-
+import javax.swing.JDialog;
 import java.awt.Component;
 import java.awt.BorderLayout;
+import java.awt.Dimension;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.ActionEvent;
-
 import javax.management.Notification;
 import javax.management.NotificationListener;
 import javax.management.ObjectName;
 import javax.management.MBeanServerConnection;
-import javax.swing.ListSelectionModel;
-
+import javax.management.Attribute;
 import java.util.Hashtable;
 import java.util.StringTokenizer;
 import java.util.Vector;
 import java.util.Date;
+import java.util.Enumeration;
 import java.text.DateFormat;
-
-import java.io.PrintStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-		
-//import java.text.SimpleDateFormat;
 //import org.osgi.service.prefs.Preferences;
 
-public class RemoteLogger_jtree extends DefaultTreeModel implements CommonPlugin, NotificationListener{
+public class RemoteLogger_jtree extends DefaultTreeModel implements CommonPlugin, NotificationListener, MouseListener {
 
-  private static final int OLDLOG_THIS_TIME = 0;
-  private static final int OLDLOG_ALWAYS = 1;
-  private static final int OLDLOG_NEVER = 2;
+  private static final String OLDLOG_THIS_TIME     ="This time";
+  private static final String OLDLOG_NOT_THIS_TIME ="Not this time";
+  private static final String OLDLOG_ALWAYS        ="Always";
+  private static final String OLDLOG_NEVER         ="Never";
+  private String oldLogChoice=OLDLOG_THIS_TIME;
   
-  private int oldLogChoice=OLDLOG_THIS_TIME;
+  private static final String[] LOG_LVL=new String[] {"Error", "Warning", "Info", "Debug"};
+  private Hashtable logLvlHt=new Hashtable(); // treeNode/logLvl
+
   private MyTree logTree;
-  private MouseListener ml;
   private TreePath selPath;
   private JPanel jp;
   private DefaultMutableTreeNode rootNode=new DefaultMutableTreeNode("root");
   private Hashtable eventName=new Hashtable();
-  private Hashtable nodes=new Hashtable();
+
+  private Hashtable nodes=new Hashtable();    // connString/mbsc
 
   public RemoteLogger_jtree (BundleContext bdlCtx){
+    //super(rootNode);
     super(null);
     setRoot(rootNode);
     System.out.println("JTree Remote logger"); 
@@ -91,36 +84,21 @@
     this.jp.setLayout(new BorderLayout());
    
     this.logTree=new MyTree(this);
-    JtreeCellRenderer treeCellRenderer=new JtreeCellRenderer(bdlCtx);
+    JtreeCellRenderer treeCellRenderer=new JtreeCellRenderer(bdlCtx, this);
     this.logTree.setCellRenderer(treeCellRenderer);
     this.logTree.setLargeModel(true);
-    //this.logTree.setToggleClickCount(2); 
+    this.logTree.setToggleClickCount(-1); 
+    this.logTree.setScrollsOnExpand(false);
+    //this.jp.setToolTipText("Select a node to refresh"); // not visible
     this.logTree.setRootVisible(false);
-    // this create an invisible tree even if I use *expand* so...
+    // this create an invisible tree, even if I use "expand" so...
     // I use expand after the first insert into the tree
-
-    MouseListener ml = new MouseAdapter() {
-      public void mousePressed(MouseEvent e) {
-        int selRow = logTree.getRowForLocation(e.getX(), e.getY());
-        selPath = logTree.getPathForLocation(e.getX(), e.getY());
-        if ( selRow!=-1 & e.getButton()>1 ) {
-	  String nodeString="\""+((DefaultMutableTreeNode) selPath.getLastPathComponent()).getUserObject()+"\"";
-	  JMenuItem itemm=new JMenuItem("Delete logs "+nodeString);
-	  itemm.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e){
-	      removeNodeFromParent((DefaultMutableTreeNode) selPath.getLastPathComponent());
-	    }
-	  });
-	  JPopupMenu jpopup=new JPopupMenu();
-	  jpopup.add(itemm);
-          jpopup.show(jp, e.getX(), e.getY());
-        }
-      }
-    };
-    this.logTree.addMouseListener(ml);
+   
+    this.logTree.addMouseListener(this);
 
     jp.add(new JScrollPane(logTree), BorderLayout.CENTER);    
-    
+    jp.setMinimumSize(new Dimension(500,25));
+
     eventName.put(new Integer(Bundle.ACTIVE),     "ACTIVE     ");
     eventName.put(new Integer(Bundle.INSTALLED),  "INSTALLED  ");
     eventName.put(new Integer(Bundle.RESOLVED),   "RESOLVED   ");
@@ -129,84 +107,128 @@
     eventName.put(new Integer(Bundle.UNINSTALLED),"UNINSTALLED");
   }
 
+  /////////////////////////////////////////////////////
+  //           Mouse Listener Interface              //
+  /////////////////////////////////////////////////////
+  public void mouseEntered(MouseEvent e){}
+  public void mouseClicked(MouseEvent e) {}
+  public void mouseExited(MouseEvent e){}
+  public void mouseReleased(MouseEvent e){} 
+  public void mousePressed(MouseEvent e) {
+    int selRow = logTree.getRowForLocation(e.getX(), e.getY());
+    selPath = logTree.getPathForLocation(e.getX(), e.getY());
+    JScrollPane jsp_tmp=(JScrollPane) logTree.getParent().getParent();
+    JScrollBar horizontalJsb=jsp_tmp.getHorizontalScrollBar();
+    JScrollBar verticalJsb=jsp_tmp.getVerticalScrollBar();
+
+    if ( e.getClickCount()==1 & selRow!=-1 & e.getButton()>1 ) { // show JPopupMenu
+      String nodeString="\""+((DefaultMutableTreeNode) selPath.getLastPathComponent()).getUserObject()+"\"";
+      JPopupMenu jpopup=new JPopupMenu();
+      JMenuItem jmiRemove=new JMenuItem("Remove logs \""+nodeString.substring(0,Math.min(15,nodeString.length()))+((nodeString.length()>15)?"...\"":"\""));
+      jmiRemove.addActionListener(new ActionListener(){
+        public void actionPerformed(ActionEvent e){
+	  removeLog_actionPerformed();
+        }	
+      });
+      jpopup.add(jmiRemove);
+      if (selPath.getPath().length==3) {
+        JMenuItem jmiLogLvl=new JMenuItem("Set log lvl");
+        jmiLogLvl.addActionListener(new ActionListener(){
+          public void actionPerformed(ActionEvent e){
+            setLogLvl(selPath);
+          }
+        });
+        jpopup.add(jmiLogLvl);
+      }
+      jpopup.show(jp, e.getX()-horizontalJsb.getValue(), e.getY()-verticalJsb.getValue());
+    } else if ( e.getClickCount()==2 & selPath!=null) { // expand selected path
+      if (logTree.isExpanded(selPath)) {
+        logTree.collapsePath(selPath);
+      } else {
+        logTree.expandPath(selPath);
+      }
+    } else if ( e.getClickCount()==1 & selPath!=null ) { // reload logTree and let selected path location
+      int horizontal_jsb_init_value=horizontalJsb.getValue();
+      int vertical_jsb_init_value=verticalJsb.getValue();
+      int row_y_init_loc=(int) ((logTree.getRowBounds(selRow)).getY());
+      Enumeration enu=logTree.getExpandedDescendants(new TreePath(rootNode));
+      reload();
+      if (enu!=null) {
+        while (enu.hasMoreElements()) {
+	  logTree.expandPath((TreePath) enu.nextElement());
+        }
+      }
+      // without next line if scrollbar_value=scrollbar_max it's generate a bad shift (may be vertical scrollbar height)
+      logTree.scrollPathToVisible(selPath);
+      int row_y_new_loc=(int) ((logTree.getRowBounds(logTree.getRowForPath(selPath))).getY());
+      int vertical_jsb_new_value=vertical_jsb_init_value+(row_y_new_loc-row_y_init_loc);
+      verticalJsb.setValue(vertical_jsb_new_value);
+      horizontalJsb.setValue(horizontal_jsb_init_value);
+      logTree.setSelectionPath(selPath);
+      logTree.repaint();
+    }
+  }
+
   /////////////////////////////////////
-  //  Plugin Interface ////////////////
+  //        Plugin Interface         //
   /////////////////////////////////////
   public String getName(){ return "JTree Remote Logger";}
   public Component getGUI(){return this.jp;}
 
-/* a supprimer si on enleve l'heritage CommonPlugin -> Plugin */
+  /* a supprimer si on enleve l'heritage CommonPlugin -> Plugin */
   public String pluginLocation(){
     return null;
   }
   public void registerServicePlugin(){}
   public void unregisterServicePlugin(){}
-/* fin a supprimer */
+  /* fin a supprimer */
  
   public void propertyChange(PropertyChangeEvent e){
-    //System.out.println("PCE : "+e.getPropertyName());
+    // TODO : DEBUG
+    // Sometimes ???
+    //   *1)  when stay with "return" key pressed => JoptionPane miss getValue()
+    //   *2)  when commonPanel started after a new_node_connection event.
+    //        Slow or slowed (by a key pressed for exemple) computer.
+    //        => gui.NodesTree fireNewNodeConnection after each PCE_common_plugin_added for each connected nodes
     if (e.getPropertyName().equals(Plugin.NEW_NODE_CONNECTION)){
       try{
-        MBeanServerConnection mbs=(MBeanServerConnection)e.getNewValue();
-        if (nodes.get(mbs)==null){
-          //System.out.println("RemoteLogger_jtree add a notification listener on this Remote Logger : "+mbs);
-	  ((MBeanServerConnection)e.getNewValue()).addNotificationListener(new ObjectName("OSGI:name=Remote Logger"), this, null, e.getOldValue());
-          nodes.put(mbs, "ok");
-	  if (oldLogChoice==OLDLOG_THIS_TIME | oldLogChoice==JOptionPane.CLOSED_OPTION ) {
-	    oldLogChoice=JOptionPane.showOptionDialog(jp,"Do you want old log from gateway :\n"+((String) e.getOldValue())+" ?","Old log management",JOptionPane.DEFAULT_OPTION,JOptionPane.QUESTION_MESSAGE,null,new Object[] {"This time", "Always", "Never"},"This time");
-	  }
-          switch (oldLogChoice) {
-            case (OLDLOG_ALWAYS) : { 
+        MBeanServerConnection mbsc=(MBeanServerConnection)e.getNewValue();
+	if ( !nodes.containsValue(mbsc) ) {
+	  String connString=(String) e.getOldValue();
+	  mbsc.addNotificationListener(new ObjectName("OSGI:name=Remote Logger"), this, null, connString);
+	  nodes.put(connString, mbsc);
+	  this.addNodesIpRef(connString);
+          if (oldLogChoice==OLDLOG_THIS_TIME | oldLogChoice==OLDLOG_NOT_THIS_TIME) {
+            JOptionPane jop = new JOptionPane("Do you want old log from gateway :\n"+connString+" ?", JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, new String[] {OLDLOG_THIS_TIME, OLDLOG_NOT_THIS_TIME, OLDLOG_ALWAYS, OLDLOG_NEVER}, OLDLOG_THIS_TIME);
+            JDialog dialog = jop.createDialog(jp, "Old log management");
+	    //dialog.setModal(true);
+	    dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
+	    dialog.show();
+	    oldLogChoice = (String) jop.getValue();
+	    if (oldLogChoice==JOptionPane.UNINITIALIZED_VALUE) {
+              oldLogChoice=OLDLOG_THIS_TIME; // *1)
 	    }
-	    case (OLDLOG_THIS_TIME) : {
-	    }
-	    case (JOptionPane.CLOSED_OPTION) : {
-	      mbs.invoke(new ObjectName("OSGI:name=Remote Logger"), "sendOldLog", new Object[]{}, new String[]{});
-              break;
-	    }
-	    case (OLDLOG_NEVER) : { 
-	    }
+	  } 
+          if (oldLogChoice==OLDLOG_THIS_TIME | oldLogChoice==OLDLOG_ALWAYS) {
+            mbsc.invoke(new ObjectName("OSGI:name=Remote Logger"), "sendOldLog", new Object[]{}, new String[]{});
 	  }
         }
       } catch(Exception ex){
-        ex.printStackTrace();
+        System.out.println("[RemoteLogger_jtree] error : "+ex);
       }
     }
   }
-
-  private DefaultMutableTreeNode createIfNeed(String nodeToCreateAndGet, DefaultMutableTreeNode parent, boolean isOldLog){
-    int childNumber=this.getChildCount(parent);
-    DefaultMutableTreeNode theNode=null;
-    for (int i=0 ; i<childNumber ; i++){ // is node even exist ?
-      String string_pool=((DefaultMutableTreeNode)(this.getChild(parent, i))).toString();
-      if (string_pool.equals(nodeToCreateAndGet)){
-        theNode=(DefaultMutableTreeNode) (this.getChild(parent, i));
-        break;
-      }
-    }
-    if (theNode==null){ // create the node
-      theNode=new DefaultMutableTreeNode(nodeToCreateAndGet);
-      // Unable to set tree expand whithout a first node so :
-      if (rootNode.getChildCount()==0){
-        this.insertNodeInto(theNode, parent, 0);
-        logTree.expandPath(new TreePath(rootNode.getPath()));
-      } else{
-        if(isOldLog){
-          this.insertNodeInto(theNode, parent, parent.getChildCount());
-        } else {
-          this.insertNodeInto(theNode, parent, 0);
-        }
-      }
-    }
-    return theNode;
-  }
-
+ 
+  ///////////////////////////////////////////////////
+  //       NotificationListener implementation     //  
+  ///////////////////////////////////////////////////
   public void handleNotification(Notification notification, Object handback) {
+    TreePath treeP=logTree.getLeadSelectionPath();
     StringTokenizer st=new StringTokenizer(handback.toString(),":");
     boolean isOldLog=false;
     String ip=st.nextToken();
     String ref=st.nextToken();
-    
+  
     st = new StringTokenizer(notification.getMessage(),"*");
     long ts=notification.getTimeStamp();
     String time="??:??:??";
@@ -228,13 +250,140 @@
     String lvl=st.nextToken();
     String msg=st.nextToken();
     // Get and maybe create parents nodes : ip / ref / idname
-    DefaultMutableTreeNode dmtn_ip=createIfNeed(ip, rootNode, isOldLog);
-    DefaultMutableTreeNode dmtn_ref=createIfNeed(ref, dmtn_ip, isOldLog);
-    DefaultMutableTreeNode dmtn_idname=createIfNeed(idname, dmtn_ref, isOldLog);
+    DefaultMutableTreeNode dmtn_ip=createIfNeed(ip, rootNode);
+    DefaultMutableTreeNode dmtn_ref=createIfNeed(ref, dmtn_ip);
+    DefaultMutableTreeNode dmtn_idname=createIfNeed(idname, dmtn_ref);
     // insert the leaf with message under id/ref/idname
     DefaultMutableTreeNode dmtn=new DefaultMutableTreeNode(date+" | "+time+" | "+state+" | "+lvl+" | "+msg,false);
-    this.insertNodeInto(dmtn, dmtn_idname, (isOldLog)?dmtn_idname.getChildCount():0);
-    this.reload(dmtn_idname);
+    this.insertNodeInto(dmtn, dmtn_idname, 0);
+
+    TreePath selectedPath=this.logTree.getLeadSelectionPath();
+    if (selectedPath!=null) {
+      this.logTree.setSelectionRow(-1);
+      this.logTree.repaint();
+    }
   }
-  
+
+  //////////////////////////////////////////
+  //     MBean attribute manipulation     //
+  //////////////////////////////////////////
+  private Integer getLogLvl(String connString) {
+    Integer val=new Integer(0);
+    try {
+      MBeanServerConnection mb=(MBeanServerConnection) nodes.get(connString);
+      val=(Integer) mb.getAttribute(new ObjectName("OSGI:name=Remote Logger"), "LogLvl");
+    } catch (Exception exc) {
+      System.out.println("errrrror : "+exc);
+    }
+    return val;
+  }
+
+  private void setLogLvl(TreePath tp) {
+    Object[] o=tp.getPath();
+    String connS=""+o[1]+":"+o[2];
+    MBeanServerConnection mb=(MBeanServerConnection) nodes.get(connS);
+    try {
+      Integer curentVal=(Integer) mb.getAttribute(new ObjectName("OSGI:name=Remote Logger"), "LogLvl");
+
+      JOptionPane jop = new JOptionPane("Select a log level for \""+connS+"\" :", JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, LOG_LVL, LOG_LVL[curentVal.intValue()-1]);
+      JDialog dialog = jop.createDialog(jp, "Log level");
+      dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
+      dialog.show();
+      String choice = (String) jop.getValue();
+      Integer newVal=new Integer(4);
+      if (choice.equals("Error")) {newVal=new Integer(1);}
+      else if (choice.equals("Warning")) {newVal=new Integer(2);}
+      else if (choice.equals("Info")) {newVal=new Integer(3);}
+      else if (choice.equals("Debug")) {newVal=new Integer(4);}
+
+      mb.setAttribute(new ObjectName("OSGI:name=Remote Logger"), new Attribute("LogLvl", newVal));
+      DefaultMutableTreeNode ddmmttnn=(DefaultMutableTreeNode) tp.getLastPathComponent();
+      logLvlHt.put(ddmmttnn, newVal);
+    } catch (Exception ex) {
+      JOptionPane.showMessageDialog(jp,"Error with \""+connS+"\" :\n"+ex, "Error :", JOptionPane.ERROR_MESSAGE);
+    }
+  }
+
+  //////////////////////////////////////////
+  //         PRIVATE TOOLS                //
+  //////////////////////////////////////////
+  private void removeLog_actionPerformed() {
+    //System.out.println("selected path="+this.selPath);
+    Object[] o= this.selPath.getPath();
+    DefaultMutableTreeNode selectedDmtn=(DefaultMutableTreeNode) this.selPath.getLastPathComponent();
+    // Select root to avoid remove the selection and generate select=-1 which generate blue font
+    logTree.setSelectionRow(0);
+    if (o.length==5) {
+      // Can't remove first child of a bundle to avoid modify tree node color
+      if ( ((DefaultMutableTreeNode) selectedDmtn.getParent()).getFirstChild()!=selectedDmtn ) {
+        removeNodeFromParent(selectedDmtn);
+      }
+    } else if (o.length==4) {
+      removeNodeFromParent(selectedDmtn);
+    } else if (o.length==3) {
+      Enumeration enume=selectedDmtn.children();
+      Vector v=new Vector();
+      while (enume.hasMoreElements()) {
+        v.add(enume.nextElement()); // modification on an enumeration element destroy the enumeration
+      }
+      for (int i=0; i<v.size() ; i++) {
+        DefaultMutableTreeNode ddmtn_tmp=(DefaultMutableTreeNode) v.elementAt(i);
+        removeNodeFromParent(ddmtn_tmp);
+      }
+    } else if (o.length==2) {
+      Enumeration enu_1=selectedDmtn.children();
+      while (enu_1.hasMoreElements()) {
+        DefaultMutableTreeNode dmtn_child=(DefaultMutableTreeNode) enu_1.nextElement();
+        Enumeration enu_2=dmtn_child.children();
+        Vector v=new Vector();
+        while (enu_2.hasMoreElements()) {
+          v.add(enu_2.nextElement());
+        }
+        for (int i=0; i<v.size() ; i++) {
+          DefaultMutableTreeNode ddmtn_tmp=(DefaultMutableTreeNode) v.elementAt(i);
+          removeNodeFromParent(ddmtn_tmp);
+        }
+      }
+    }
+  }
+
+  private void addNodesIpRef(String connString) {
+    String ip=connString.split(":")[0];
+    String ref=connString.split(":")[1];
+    DefaultMutableTreeNode dmtn_ip=createIfNeed(ip, rootNode);
+    DefaultMutableTreeNode dmtn_ref=createIfNeed(ref, dmtn_ip);
+    Integer lL=this.getLogLvl(connString);
+    logLvlHt.put(dmtn_ref, lL);
+    logTree.setSelectionRow(-1);
+    // Unable to set tree expand whithout a first node so :
+    logTree.expandPath(new TreePath(rootNode.getPath()));
+    logTree.repaint();
+  }
+
+  protected Integer getTreeNodeLogLvl(DefaultMutableTreeNode dmtn) {
+    // used by treeCellRenderer
+    return (Integer) logLvlHt.get(dmtn);
+  }
+
+  private DefaultMutableTreeNode createIfNeed(String nodeToCreateAndGet, DefaultMutableTreeNode parent) {
+    int childNumber=this.getChildCount(parent);
+    DefaultMutableTreeNode theNode=null;
+    for (int i=0 ; i<childNumber ; i++){ // is node even exist ?
+      String string_pool=((DefaultMutableTreeNode)(this.getChild(parent, i))).toString();
+      if (string_pool.equals(nodeToCreateAndGet)){
+        theNode=(DefaultMutableTreeNode) (this.getChild(parent, i));
+        break;
+      }
+    }
+    if (theNode==null){ // create the node
+      theNode=new DefaultMutableTreeNode(nodeToCreateAndGet);
+      this.insertNodeInto(theNode, parent, 0);
+    }
+    return theNode;
+  }
+ 
+  protected void fireTreeNodesInserted(Object source, Object path[], int childIndices[], Object children[]) {
+    // Do nothing to avoid refresh jtree after each log.
+  }
+
 }
diff --git a/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java b/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java
index 69714b4..f57ff90 100644
--- a/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java
+++ b/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/Activator.java
@@ -45,7 +45,7 @@
   protected BundleContext m_context = null;
 
   protected ArrayList m_pluginList = null;
-  protected ArrayList m_commonpluginList = null; //TODO To I need this table ?
+  protected ArrayList m_commonpluginList = null;  //TODO Do I need this table ?
   private EventListenerList m_listenerList = null;
   
   private JFrame m_frame = null;
@@ -57,6 +57,9 @@
     m_listenerList = new EventListenerList();
   }
 
+  ///////////////////////////////////////
+  //         BundleActivator           //
+  ///////////////////////////////////////
   public void start(BundleContext context) {
     m_context = context;
 
@@ -72,9 +75,6 @@
               if(svcObj instanceof CommonPlugin){
                 m_commonpluginList.add(svcObj);
                 firePropertyChangedEvent(CommonPlugin.COMMON_PLUGIN_ADDED, null, svcObj);
-		//evite d'attendre le Thread pr que le common plugin remotelogger_jtree/jtable chope le MBean remote logger :
-		//nodesTree.tryToConnectAllNodes();
-		//createDefaultNodes(false);
               }else if (svcObj instanceof Plugin){
                 m_pluginList.add(svcObj);
                 firePropertyChangedEvent(Plugin.PLUGIN_ADDED, null, svcObj);
@@ -117,7 +117,7 @@
       m_frame.setIconImage(Toolkit.getDefaultToolkit().getImage(m_context.getBundle().getResource("images/logo.gif")));
       //m_frame.setResizable(false);
       //m_frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-      //add a windowListener to save screen size preference
+      // TODO : add a windowListener and use a Preferences service to save screen size
       m_frame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent we) {
           JFrame jf=(JFrame) we.getWindow();
@@ -129,8 +129,6 @@
         }
       });
 	    
-      //Dimension wndSize = m_frame.getToolkit().getScreenSize();
-      //m_frame.setBounds(wndSize.width / 8, wndSize.height / 8, 1000, 700);
       Dimension maxdim = m_frame.getToolkit().getScreenSize();
       int m_width=maxdim.width-100;
       int m_height=maxdim.height-100;
@@ -152,13 +150,25 @@
 
     // Now try to manually initialize the plugin list
     // since some might already be available.
-    //initializePlugins();
-    this.nodesTree.runDiscovery();
-
+    // initializePlugins();
+    
     m_frame.setVisible(true);
+    this.nodesTree.runDiscovery();
+  }
+ 
+  public void stop(BundleContext context) {
+    if (m_frame != null) {
+      this.nodesTree.stop();
+      m_frame.setVisible(false);
+      m_frame.dispose();
+      m_frame = null;
+    }
   }
 
-  private synchronized void initializePlugins() { // Never used ?
+  ////////////////////////////////////
+  //
+  ////////////////////////////////////
+  /*private synchronized void initializePlugins() { // Never used ?
     System.out.println("??? private synchronized void initializePlugins() ???");
     try {
       // Get all model services.
@@ -171,7 +181,6 @@
           if (!m_pluginList.contains(svcObj)) {
             m_pluginList.add(svcObj);
             firePropertyChangedEvent(Plugin.PLUGIN_ADDED, null, (Plugin)svcObj);
-	    //this.nodesTree.valueChanged(null);
           }
         }
       }
@@ -183,7 +192,6 @@
           if (!m_commonpluginList.contains(svcObj)) {
             m_commonpluginList.add(svcObj);
             firePropertyChangedEvent(CommonPlugin.COMMON_PLUGIN_ADDED, null, (CommonPlugin)svcObj);
-	    //this.nodesTree.valueChanged(null);
           }
         }
       }
@@ -192,16 +200,7 @@
       System.err.println("ShellGuiActivator: " + ex);
       ex.printStackTrace();
     }
-  }
-
-  public void stop(BundleContext context) {
-    if (m_frame != null) {
-      this.nodesTree.stop();
-      m_frame.setVisible(false);
-      m_frame.dispose();
-      m_frame = null;
-    }
-  }
+  }*/
 
   //////////////////////////////
   // Event methods.           //
@@ -215,22 +214,11 @@
   }
 
   public void firePropertyChangedEvent(String name, Object oldValue, Object newValue) {
+    //System.out.println("[Gui Activator] fire PCE("+name+","+oldValue+","+newValue+")");
     PropertyChangeEvent event = null;
     // Guaranteed to return a non-null array
     Object[] listeners = m_listenerList.getListenerList();
 
-/* a supprimer de ici
-    String mb="";
-    //System.out.println("name="+name);
-    if(name.equals("pluggin_added") | name.equals("pluggin_removed")){
-      mb="java.awt.Component";
-    } else {
-      mb=newValue.toString();
-      mb=mb.substring((mb.indexOf("$")==-1)?0:mb.indexOf("$")+1,mb.length());
-    }
-    System.out.println("console.gui whill firePCE "+(int)(listeners.length/2)+"* : (this,"+name+","+oldValue+","+mb+")");
-/* a ici */
-
     // Process the listeners last to first, notifying
     // those that are interested in this event 
     for (int i = listeners.length - 2; i >= 0; i -= 2) {
diff --git a/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java b/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java
index 48a7534..f099311 100644
--- a/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java
+++ b/mosgi.console.gui/src/main/java/org/apache/felix/mosgi/console/gui/NodesTree.java
@@ -18,14 +18,14 @@
  */
 package org.apache.felix.mosgi.console.gui;
 
-//import java.awt.GridLayout;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeEvent;
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import javax.swing.JOptionPane;
-
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTree;
@@ -41,6 +41,7 @@
 import java.util.Enumeration;
 import org.osgi.framework.BundleContext;
 import org.apache.felix.mosgi.console.ifc.Plugin;
+import org.apache.felix.mosgi.console.ifc.CommonPlugin;
 import org.apache.felix.framework.cache.BundleCache;
 
 import javax.management.MBeanServerConnection;
@@ -55,7 +56,7 @@
 
 //import javax.jmdns.ServiceInfo;
 
-public class NodesTree extends JPanel implements TreeSelectionListener, NotificationListener, ActionListener {
+public class NodesTree extends JPanel implements TreeSelectionListener, NotificationListener, ActionListener, PropertyChangeListener {
 
   static String TOP_NAME="Servers";
   static int POOLING_TIME=2000;
@@ -84,7 +85,6 @@
 
   public NodesTree(Activator a,BundleContext bc) {
     super(new BorderLayout());
-    //super(new GridLayout(1, 0));
     this.a=a;
     this.bc=bc;
     this.pt=new PoolingThread();
@@ -108,8 +108,20 @@
     poolThread.start();
   }
 
-
-
+  //////////////////////////////////////////////////
+  //          PropertyChangeListener              //
+  //////////////////////////////////////////////////
+  public void propertyChange(PropertyChangeEvent event) {
+    if (event.getPropertyName().equals(CommonPlugin.COMMON_PLUGIN_ADDED)) {
+      Enumeration enu=connectedNodes.keys();
+      while (enu.hasMoreElements()) {
+        // Common plugin added after a gateway connection so firePCE(Plugin.NEW_NODE_CONNECTION, connString , mbsc) again :
+        String key=(String) enu.nextElement();
+        System.out.println("   "+key+"="+connectedNodes.get(key));
+        a.firePropertyChangedEvent(Plugin.NEW_NODE_CONNECTION, key, connectedNodes.get(key));
+      }
+    }
+  }
 
   //////////////////////////////////////////////////////
   //               TreeSelectionListener              //
@@ -160,8 +172,9 @@
   }
 
   public void actionPerformed(ActionEvent e) {
+    // TODO : 
     Object object = e.getSource();
-    if (object==addNodeButton) {
+    if (object==addNodeButton) { // Add a new node into tree
       String connString = JOptionPane.showInputDialog("Please input a connection string : ", "127.0.0.1:1099/vosgi");
       TreePath tp=tree.getSelectionPath();
       if (connString!=null) {
@@ -170,7 +183,7 @@
 	isAllNodesConnected=false;
 	tree.setSelectionPath(tp);
       }
-    } else if (object==removeNodeButton) {
+    } else if (object==removeNodeButton) { // Remove a nod from tree
       DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
       String connString=(String) node.getUserObject();
       if (connString!=null){
@@ -270,13 +283,12 @@
       }catch(MalformedObjectNameException e){
         e.printStackTrace();
       }catch(Exception e){
-        //e.printStackTrace();
+	//use one thread per node to avoid being freeze by a timeOutConnection
 	System.out.println("gui.NodesTree.connectToNode("+connString+") : "+e);
 	System.out.println("  => Delete this node ? to implement... ?");
 
       }
     }else{
-      // a.firePCE(NEW_NODE_CONNECTION, connString, ls) inutile maintenant je sais plus pourqouoi ca l'etait d'ailleur ???
       return true;
     }
   return false;
diff --git a/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java b/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java
index ef35567..ef44cfc 100644
--- a/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java
+++ b/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/Logger.java
@@ -39,6 +39,7 @@
 
 import java.io.Serializable;
 import java.util.Enumeration;
+import java.util.Vector;
 
 public class Logger extends NotificationBroadcasterSupport implements LogListener,BundleActivator,ServiceListener, LoggerMBean, Serializable{
 
@@ -51,24 +52,42 @@
 
   private Object logMutex=new Object();
 
-  private boolean debugLogFlag=true;
-  private boolean errorLogFlag=true;
-  private boolean infoLogFlag=true;
-  private boolean warningLogFlag=true;
+  private static final String[] LOG_LVL=new String[] {"","ERROR  ","WARNING ","INFO   ","DEBUG  "};
+  private Integer logLvl=new Integer(4);
 
   private MBeanServer agent=null;
   private ObjectName remoteLoggerON=null;
 
-//LogerMBean Interface
+  /////////////////////////////////
+  //     LogerMBean Interface    //
+  /////////////////////////////////
   public void sendOldLog(){
-    System.out.println("mosgi.jmx.remoteLogger.Logger : send old log");
+    System.out.println("[remoteLogger.Logger] send old log");
     Enumeration oldLog = this.lrs.getLog();
+    Vector invert=new Vector();
     while(oldLog.hasMoreElements()) {
-      logged((LogEntry)(oldLog.nextElement()),true);
+      LogEntry le=(LogEntry) (oldLog.nextElement());
+      invert.insertElementAt(le,0);
+    }
+    for (int i=0 ; i<invert.size() ; i++) {
+      logged( (LogEntry) invert.elementAt(i), true );
     }
   }
 
-//ServiceListener Interface
+  public void setLogLvl(Integer lvl) {
+    this.logLvl=lvl;
+    String logLvlToString=(new String[] {"Error", "Warning", "Info", "Debug"})[lvl.intValue()-1];
+    this.log(LogService.LOG_INFO, "Log level is now \""+logLvlToString+"\".");
+    System.out.println("[Logger] : modification of log lvl : logLvl="+logLvl+" ("+logLvlToString+")");
+  }
+
+  public Integer getLogLvl() {
+    return logLvl;
+  }
+
+  ///////////////////////////////////////
+  //      ServiceListener Interface    //
+  ///////////////////////////////////////
   public void serviceChanged(ServiceEvent serviceevent) {
     ServiceReference servicereference= serviceevent.getServiceReference();
     String as[]=(String[])servicereference.getProperty("objectClass");
@@ -90,69 +109,44 @@
     }
   }
 
-
-//LogListener Interface
+  /////////////////////////////////////////
+  //      LogListener Interface          //
+  /////////////////////////////////////////
   public void logged(LogEntry log){
     logged(log, false);
   }
+
   public void logged(LogEntry log, boolean oldLog){
-    String reg=new String("*");
-    StringBuffer message=new StringBuffer();
-    //System.out.print("mosgi.jmx.remotelogger : new log : ");
-
     synchronized (logMutex){
-      try{
-        long id=log.getBundle().getBundleId();
-	if (id<10) {
-	  message.append(" "+id);
-	} else{
-          message.append(""+id);
-	}
-      }catch(NullPointerException e){
-        message.append("Unknown source");
-      }
+      if (log.getLevel() <= logLvl.intValue() & this.agent!=null) {
+        String reg=new String("*");
+        StringBuffer message=new StringBuffer();
+        try{
+          long id=log.getBundle().getBundleId();
+	  message.append( ((id<10)?" ":"")+id );
+        } catch(NullPointerException e){
+          message.append("Unknown source");
+        }
      
-      String lSymbolicName=log.getBundle().getSymbolicName();
-      if(lSymbolicName != null){
-        message.append(reg+lSymbolicName);
-      }else {
-        message.append(reg+"\"null\"");
-      }
+        String lSymbolicName=log.getBundle().getSymbolicName();
+        message.append( reg+ ((lSymbolicName!=null)?lSymbolicName:"\"null\"") );
 
-      message.append(reg+log.getBundle().getState());
+        message.append(reg+log.getBundle().getState());
 
-      int lLevel=log.getLevel();
-      if(debugLogFlag && lLevel==LogService.LOG_DEBUG){
-        message.append(reg+"DEBUG  ");
-      }else if (errorLogFlag && lLevel==LogService.LOG_ERROR){
-        message.append(reg+"ERROR  ");
-      }else if(infoLogFlag && lLevel==LogService.LOG_INFO){
-        message.append(reg+"INFO   ");
-      }else if(warningLogFlag && lLevel==LogService.LOG_WARNING){
-        message.append(reg+"WARNING");
-      }else {
-        message.append(reg+"NOLEVEL");
-      }
+	message.append(reg+LOG_LVL[log.getLevel()]);
 	 
-      // into log.getMessage() replaceAll regex char by an other
-      String msg=log.getMessage();
-      if (msg!=null){
-	message.append(reg+msg.replace('*','X'));
-      } else {
-	message.append(reg+"\"null\"");
+        // into log.getMessage() replaceAll regex char by an other
+        String msg=log.getMessage();
+        message.append( reg+ ((msg!=null)?msg.replace('*','X'):"\"null\"") );
+
+        this.sendNotification(new  AttributeChangeNotification(this.remoteLoggerON, 0, (oldLog)?0:System.currentTimeMillis(), message.toString(), null, "Log", null, null));
       }
     }
-    //System.out.println(message.toString());
-    if (this.agent!=null){ // On envoie tous les logs a un MBeanServer
-      //System.out.println("this.agent != null => remoteLogger.Logger.sendNotifiaction(...."+message.toString());
-      //System.out.println("RemoteLogger send notification : "+oldLog+" : "+message.toString()); 
-      this.sendNotification(new  AttributeChangeNotification(this.remoteLoggerON, 0, 
-						             (oldLog)?0:System.currentTimeMillis(),
-						             message.toString(), null, "Log", null, null));
-    }
   }
 
-//BundleActivator Interface
+  //////////////////////////////////
+  //  BundleActivator Interface   //
+  //////////////////////////////////
   public void start(BundleContext bc) throws Exception{
     this.version=(String)bc.getBundle().getHeaders().get(Constants.BUNDLE_VERSION);
     this.bc=bc;
@@ -177,28 +171,29 @@
     if (sr2!=null){
       this.registerToAgent(sr2);
     }
-    this.log(LogService.LOG_INFO, "Remote Logger started "+version);
-
+    this.log(LogService.LOG_INFO, "Remote Logger started (logLvl="+logLvl+")"+version);
   }
      
   public void stop(BundleContext bc) throws Exception{
-   this.log(LogService.LOG_INFO, "Stopping remote Logger "+version);
-   if (this.lrs==null){
-      System.out.println("ERROR : Logger.stop : there is no logger or reader to stop");
-   } else {
-     this.lrs.removeLogListener(this);
-     this.bc.removeServiceListener(this);
-   }
-   if (this.agent!=null){
-     this.unRegisterFromAgent();
-   }
-   this.agent=null;
-   this.lrs=null; 
-   this.log(LogService.LOG_INFO, "Remote Logger stopped"+version);
-   this.bc=null;
- }
+    this.log(LogService.LOG_INFO, "Stopping remote Logger "+version);
+    if (this.lrs==null){
+       System.out.println("ERROR : Logger.stop : there is no logger or reader to stop");
+    } else {
+      this.lrs.removeLogListener(this);
+      this.bc.removeServiceListener(this);
+    }
+    if (this.agent!=null){
+      this.unRegisterFromAgent();
+    }
+    this.agent=null;
+    this.lrs=null; 
+    this.log(LogService.LOG_INFO, "Remote Logger stopped"+version);
+    this.bc=null;
+  }
 
-//private methods 
+  //////////////////////////////
+  //     private methods      //
+  //////////////////////////////
   private void registerLogReaderService(ServiceReference sr) {
     //System.out.println("mosgi.jmx.remoteLogger.Logger.registerLogReaderService("+sr.toString()+") : oldLog=");
     this.lrs=(LogReaderService)this.bc.getService(sr);
diff --git a/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java b/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java
index 33d67ee..f2fb5cb 100644
--- a/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java
+++ b/mosgi.jmx.remotelogger/src/main/java/org/apache/felix/mosgi/jmx/remotelogger/LoggerMBean.java
@@ -21,5 +21,7 @@
 public interface LoggerMBean{
 
   public void sendOldLog();
+  public void setLogLvl(Integer lvl);
+  public Integer getLogLvl();
 
 }
