Index: src/org/openstreetmap/josm/data/notes/Note.java
===================================================================
--- src/org/openstreetmap/josm/data/notes/Note.java	(revision 18863)
+++ src/org/openstreetmap/josm/data/notes/Note.java	(working copy)
@@ -190,6 +190,25 @@
     }
 
     /**
+     * Is this note modified? A new note and a note with a new comment is
+     * considered to be modified. Actions such as Close, ReOpen adds a new
+     * comment and is therefor considered modified.
+     * @since xxx
+     */
+    public boolean isModified() {
+        if (this.getId() < 0) { //notes with negative IDs are new
+            return true;
+        }
+        for (NoteComment comment : getComments()) {
+            if (comment.isNew()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
      * Copies values from a new note into an existing one. Used after a note
      * has been updated on the server and the local copy needs refreshing.
      * @param note New values to copy
Index: src/org/openstreetmap/josm/data/notes/NoteComment.java
===================================================================
--- src/org/openstreetmap/josm/data/notes/NoteComment.java	(revision 18863)
+++ src/org/openstreetmap/josm/data/notes/NoteComment.java	(working copy)
@@ -7,7 +7,7 @@
 import org.openstreetmap.josm.data.osm.User;
 
 /**
- * Represents a comment made on a note. All notes have at least on comment
+ * Represents a comment made on a note. All notes have at least one comment
  * which is the comment the note was opened with. Comments are immutable.
  * @since 7451
  */
@@ -17,8 +17,6 @@
     private final User user;
     private final Instant commentTimestamp;
     private final Action action;
-
-    //not currently used. I'm planning on using this to keep track of new actions that need to be uploaded
     private boolean isNew;
 
     /**
Index: src/org/openstreetmap/josm/data/osm/NoteData.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/NoteData.java	(revision 18863)
+++ src/org/openstreetmap/josm/data/osm/NoteData.java	(working copy)
@@ -119,14 +119,9 @@
      */
     public synchronized boolean isModified() {
         for (Note note : noteList) {
-            if (note.getId() < 0) { //notes with negative IDs are new
+            if (note.isModified()) {
                 return true;
             }
-            for (NoteComment comment : note.getComments()) {
-                if (comment.isNew()) {
-                    return true;
-                }
-            }
         }
         return false;
     }
@@ -232,6 +227,19 @@
     }
 
     /**
+     * Delete a note from the local data layer.
+     * @param note Note to remove.
+     * @since xxx
+     */
+    public synchronized void deleteNote(Note note) {
+        if (!noteList.contains(note)) {
+            throw new IllegalArgumentException("Note to delete must be in layer");
+        }
+        noteList.removeElem(note);
+        dataUpdated();
+    }
+
+    /**
      * Reopen a closed note.
      * @param note Note to reopen. Must already exist in the layer
      * @param text Comment to attach to the reopen action, if desired
Index: src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 18863)
+++ src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(working copy)
@@ -46,6 +46,7 @@
 import org.openstreetmap.josm.data.osm.ChangesetCache;
 import org.openstreetmap.josm.data.osm.NoteData;
 import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener;
+import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.NoteInputDialog;
@@ -81,6 +82,7 @@
     private final JosmTextField filter = setupFilter();
     private final AddCommentAction addCommentAction;
     private final CloseAction closeAction;
+    private final DeleteAction deleteAction;
     private final DownloadNotesInViewAction downloadNotesInViewAction;
     private final NewAction newAction;
     private final ReopenAction reopenAction;
@@ -97,6 +99,7 @@
                 KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), 150);
         addCommentAction = new AddCommentAction();
         closeAction = new CloseAction();
+        deleteAction = new DeleteAction();
         downloadNotesInViewAction = DownloadNotesInViewAction.newActionWithDownloadIcon();
         newAction = new NewAction();
         reopenAction = new ReopenAction();
@@ -148,6 +151,7 @@
         notesPopupMenu.add(openInBrowserAction);
         notesPopupMenu.add(closeAction);
         notesPopupMenu.add(reopenAction);
+        notesPopupMenu.add(deleteAction);
         displayList.addMouseListener(new PopupMenuLauncher(notesPopupMenu));
     }
 
@@ -474,6 +478,44 @@
     }
 
     /**
+     * Delete a note from the local layer.
+     */
+    class DeleteAction extends JosmAction {
+
+        /**
+         * Constructs a new {@code DeleteAction}.
+         */
+        DeleteAction() {
+            super(tr("Delete note"), "dialogs/delete", tr("Delete note"),
+                    Shortcut.registerShortcut("notes:comment:delete", tr("Notes: Delete note"), KeyEvent.VK_UNDEFINED, Shortcut.NONE),
+                    false, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            Note note = displayList.getSelectedValue();
+
+            // Can happen when called from a keyboard binding.
+            if (note == null) {
+                return;
+            }
+
+            if (note.isModified()) {
+                ExtendedDialog ed = new ExtendedDialog(MainApplication.getMainFrame(), tr("Delete note"), tr("Delete"), tr("Cancel"));
+                ed.setButtonIcons("dialogs/delete", "cancel");
+                ed.setContent(tr("Note has been localy modified. Continue with deletion?"));
+                ed.showDialog();
+                if (ed.getValue() != 1) {
+                    return;
+                }
+            }
+
+            noteData.deleteNote(note);
+            noteData.setSelectedNote(null);
+        }
+    }
+
+    /**
      * Create a new note
      */
     class NewAction extends JosmAction {
