diff -r b8fde7c97ae5 AuthoringTool/src/com/oracle/javafx/authoring/watch/ProjectWatcher.java
--- a/AuthoringTool/src/com/oracle/javafx/authoring/watch/ProjectWatcher.java	Mon Jul 02 09:21:16 2012 +0200
+++ b/AuthoringTool/src/com/oracle/javafx/authoring/watch/ProjectWatcher.java	Mon Jul 02 11:19:05 2012 +0200
@@ -274,7 +274,7 @@
         public void propertyChanged(Object node, Prop prop, Object newValue, Object oldValue) {           
             assert node instanceof Parent;
             Parent p = (Parent) node;
-            // First remve all watchers for the existig files
+            // First remove all watchers for the existig files
             @SuppressWarnings("unchecked") //NOI18N
             Collection<String> old = (Collection<String>) oldValue;
             if (old != null) {
@@ -288,6 +288,7 @@
                     }
                 }
             }
+            watcher.clearParentStylesheets(p);
             // Then add them all
             @SuppressWarnings("unchecked") //NOI18N
             Collection<String> newList = (Collection<String>) newValue;
@@ -629,26 +630,69 @@
                 }
             }
         };
+        if(el.getNode() instanceof Parent){
+            Parent p = (Parent) el.getNode();
+            clearParentStylesheets(p);
+        }
         visitElementRecursive(el, remover);
     }
     
+    private void clearParentStylesheets(Parent p) {
+        final List<File> toremove = Utils.newList();
+        for (Entry<File, Set<Parent>> entry : parentRunnables.entrySet()) {
+            Set<Parent> set = entry.getValue();
+            if (set.contains(p)) {
+                set.remove(p);
+            }
+            if (set.isEmpty()) {
+                toremove.add(entry.getKey());
+            }
+        }
+        for(File f: toremove){
+            parentRunnables.remove(f);
+        }
+    }
+    
     // Add all files associated to the Element.
     public void addFiles(Element el) {
         FileVisitor adder = new AddVisitor(el.getNode());
         visitElementRecursive(el, adder);
     }
-    
-    private void addStylesheets(final Parent parent, final List<File> css) {
-        final Runnable nodeRunnable = new Runnable() {
 
-            @Override
-            public void run() {
-                CssUtils.updateStylesheets(project, parent, css);
-                cssRunnable.run();
+    /**
+     * We keep the association between the stylesheet to the Parent in order to broadcast changes.
+     * We do not have the same problem with Images or Includes because 
+     * in the case of images and includes we trigger a refresh of the FXML (migration) -
+     * so all objects referencing the changed files are automatically updated. 
+     * The way stylesheet are handled is a bit different 
+     * - a stylesheet change does not trigger a refresh of the FXML 
+     * - hence the need to keep track of all the parents in order to update them one by one.
+     */
+    private final Map<File, Set<Parent>> parentRunnables = Utils.newMap();
+
+    private void addStylesheets(Parent parent, final List<File> css) {
+        for (final File f : css) {
+            Set<Parent> parents = parentRunnables.get(f);
+            if (parents == null) {
+                parents = Utils.newSet();
+                parentRunnables.put(f, parents);
             }
-        };
-        for (File f : css) {
-            add(f, nodeRunnable);
+            parents.add(parent);
+            final Runnable parentRunnable = new Runnable() {
+                @Override
+                public void run() {
+                    Set<Parent> parents = parentRunnables.get(f);
+                    for (Parent p : parents) {
+                        try {
+                            CssUtils.updateStylesheets(project, p, css);
+                        }catch(Throwable thr){
+                            Utils.println("Can't update stylesheets", thr);
+                        }
+                    }
+                    cssRunnable.run();
+                }
+            };
+            add(f, parentRunnable);
         }
     }
     
@@ -665,6 +709,7 @@
             File f = entry.getKey();
             FileWatcher.remove(f, this);
         }
+        parentRunnables.clear();
         torun.clear();
     }
 
diff -r b8fde7c97ae5 AuthoringTool/test/com/oracle/javafx/authoring/css/CssUtilsTest.java
--- a/AuthoringTool/test/com/oracle/javafx/authoring/css/CssUtilsTest.java	Mon Jul 02 09:21:16 2012 +0200
+++ b/AuthoringTool/test/com/oracle/javafx/authoring/css/CssUtilsTest.java	Mon Jul 02 11:19:05 2012 +0200
@@ -31,6 +31,8 @@
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.Callable;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.scene.Group;
@@ -1414,7 +1416,7 @@
             Element be = Element.create(b);
             Transaction t = proj.getTransactionManager().create("Add button");
             t.addElementChild(proj.getScreenData().getRootElement(), be);
-            List<String> sclass = new ArrayList<String>();
+            List<String> sclass = new ArrayList<String>(b.getStyleClass());
             sclass.add(clazz);
             t.setProperty(be, b, PropUtils.Node_STYLE_CLASS, sclass, null);
             t.close();
@@ -1594,6 +1596,80 @@
         }
     }
     
+     @Test
+    public void testSameStylesheets() throws Exception {
+        System.out.println("testSameStylesheets start");
+        final File f = newFile("tescss", ".toto {-fx-text-fill:red;}");
+        final Project proj = TestUtils.createTmpProject();
+        final Button b = new Button();
+        final Element butElement = Element.create(b);
+        
+        final Frame fra = Frame.make(proj);
+        fra.show();
+        
+        final Button b2 = new Button();
+        final Element butElement2 = Element.create(b2);
+        
+        Transaction t1 = proj.getTransactionManager().create("Add same stylesheet to both Element");
+        
+        t1.addElementChild(proj.getScreenData().getRootElement(), butElement);
+        t1.addElementChild(proj.getScreenData().getRootElement(), butElement2);
+        
+        ObservableList<String> sc = FXCollections.observableArrayList();
+        sc.add("toto");
+        t1.setProperty(butElement, b, ModelProperty.of(PropUtils.Node_STYLE_CLASS), sc, b.getStylesheets());
+        t1.setProperty(butElement2, b2, ModelProperty.of(PropUtils.Node_STYLE_CLASS), sc, b2.getStylesheets());
+        
+        ObservableList<String> lst = FXCollections.observableArrayList();
+        lst.add(f.toURI().toString());
+        t1.setProperty(butElement, b, ModelProperty.of(PropUtils.Parent_STYLESHEETS), lst, b.getStylesheets());
+        t1.setProperty(butElement2, b2, ModelProperty.of(PropUtils.Parent_STYLESHEETS), lst, b2.getStylesheets());
+        
+        t1.close();
+                
+         final Callable<Boolean> condition = new Callable<Boolean>() {
+             @Override
+             public Boolean call() throws Exception {
+                 return b.getTextFill() == Color.RED && b2.getTextFill() == Color.RED;
+             }
+         };
+
+         final Runnable step1 = new Runnable() {
+             @Override
+             public void run() {
+                 Transaction t2 = proj.getTransactionManager().create("Clear button's stylesheets");
+                 // Now remove the stylesheet from the  button
+                 ObservableList<String> lst2 = FXCollections.observableArrayList();
+                 t2.setProperty(butElement, b, ModelProperty.of(PropUtils.Parent_STYLESHEETS), lst2, b.getStylesheets());
+
+                 t2.close();
+                 try {
+                     // Update file and wait for CSS to reapply
+                     writeAuthorCssAndRefresh(fra, ".toto {-fx-text-fill:green;}", f);
+                 } catch (Exception ex) {
+                     throw new RuntimeException(ex);
+                 }
+
+                 final Callable<Boolean> condition2 = new Callable<Boolean>() {
+                     @Override
+                     public Boolean call() throws Exception {
+                         return b2.getTextFill() == Color.GREEN;
+                     }
+                 };
+                 final Runnable step2 = new Runnable() {
+                     @Override
+                     public void run() {
+                         System.out.println("testSameStylesheets end");
+                         proj.close();
+                     }
+                 };
+                 waitFor("Remaining Button text to be styled", condition2, new Duration(5000), step2);
+             }
+         };
+
+         waitFor("Button text to be styled", condition, new Duration(5000), step1);
+    }
+    
     private boolean runFXb14() {
         if (System.getProperty("javafx.runtime.version").indexOf("b14") == -1) {
             return false;
