Index: trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 10598)
+++ trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 10599)
@@ -318,6 +318,8 @@
      *
      * @since 8954
-     */
-    public abstract static class Strategy {
+     * @since 10599 (functional interface)
+     */
+    @FunctionalInterface
+    public interface Strategy {
 
         /**
@@ -327,5 +329,5 @@
          * @return the way to keep
          */
-        public abstract Way determineWayToKeep(Iterable<Way> wayChunks);
+        Way determineWayToKeep(Iterable<Way> wayChunks);
 
         /**
@@ -333,8 +335,6 @@
          * @return strategy which selects the way chunk with the highest node count to keep
          */
-        public static Strategy keepLongestChunk() {
-            return new Strategy() {
-                @Override
-                public Way determineWayToKeep(Iterable<Way> wayChunks) {
+        static Strategy keepLongestChunk() {
+            return wayChunks -> {
                     Way wayToKeep = null;
                     for (Way i : wayChunks) {
@@ -344,6 +344,5 @@
                     }
                     return wayToKeep;
-                }
-            };
+                };
         }
 
@@ -352,11 +351,6 @@
          * @return strategy which selects the first way chunk
          */
-        public static Strategy keepFirstChunk() {
-            return new Strategy() {
-                @Override
-                public Way determineWayToKeep(Iterable<Way> wayChunks) {
-                    return wayChunks.iterator().next();
-                }
-            };
+        static Strategy keepFirstChunk() {
+            return wayChunks -> wayChunks.iterator().next();
         }
     }
Index: trunk/src/org/openstreetmap/josm/command/Command.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/Command.java	(revision 10598)
+++ trunk/src/org/openstreetmap/josm/command/Command.java	(revision 10599)
@@ -37,6 +37,8 @@
  *
  * @author imi
+ * @since 21 (creation)
+ * @since 10599 (signature)
  */
-public abstract class Command extends PseudoCommand {
+public abstract class Command implements PseudoCommand {
 
     private static final class CloneVisitor extends AbstractVisitor {
Index: trunk/src/org/openstreetmap/josm/command/PseudoCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/PseudoCommand.java	(revision 10598)
+++ trunk/src/org/openstreetmap/josm/command/PseudoCommand.java	(revision 10599)
@@ -12,6 +12,8 @@
  * as subcommand of real commands but it is just an empty shell and can not be
  * executed or undone.
+ * @since  3262 (creation)
+ * @since 10599 (functional interface)
  */
-public abstract class PseudoCommand {
+public interface PseudoCommand {
 
     /**
@@ -19,5 +21,5 @@
      * @return description text representing this command
      */
-    public abstract String getDescriptionText();
+    String getDescriptionText();
 
     /**
@@ -25,5 +27,5 @@
      * @return descriptive icon of this command
      */
-    public Icon getDescriptionIcon() {
+    default Icon getDescriptionIcon() {
         return null;
     }
@@ -33,5 +35,5 @@
      * @return primitives that take part in this command
      */
-    public abstract Collection<? extends OsmPrimitive> getParticipatingPrimitives();
+    Collection<? extends OsmPrimitive> getParticipatingPrimitives();
 
     /**
@@ -40,5 +42,5 @@
      * @return the subcommands, null if there are no child commands
      */
-    public Collection<PseudoCommand> getChildren() {
+    default Collection<PseudoCommand> getChildren() {
         return null;
     }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 10598)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 10599)
@@ -130,5 +130,6 @@
      * Represents a fix to a validation test. The fixing {@link Command} can be obtained by {@link #createCommand(OsmPrimitive, Selector)}.
      */
-    abstract static class FixCommand {
+    @FunctionalInterface
+    interface FixCommand {
         /**
          * Creates the fixing {@link Command} for the given primitive. The {@code matchingSelector} is used to evaluate placeholders
@@ -138,7 +139,7 @@
          * @return fix command
          */
-        abstract Command createCommand(final OsmPrimitive p, final Selector matchingSelector);
-
-        private static void checkObject(final Object obj) {
+        Command createCommand(final OsmPrimitive p, final Selector matchingSelector);
+
+        static void checkObject(final Object obj) {
             CheckParameterUtil.ensureThat(obj instanceof Expression || obj instanceof String,
                     "instance of Exception or String expected, but got " + obj);
@@ -152,5 +153,5 @@
          * @return result string
          */
-        private static String evaluateObject(final Object obj, final OsmPrimitive p, final Selector matchingSelector) {
+        static String evaluateObject(final Object obj, final OsmPrimitive p, final Selector matchingSelector) {
             final String s;
             if (obj instanceof Expression) {
@@ -173,5 +174,5 @@
             return new FixCommand() {
                 @Override
-                Command createCommand(OsmPrimitive p, Selector matchingSelector) {
+                public Command createCommand(OsmPrimitive p, Selector matchingSelector) {
                     final Tag tag = Tag.ofString(evaluateObject(obj, p, matchingSelector));
                     return new ChangePropertyCommand(p, tag.getKey(), tag.getValue());
@@ -194,5 +195,5 @@
             return new FixCommand() {
                 @Override
-                Command createCommand(OsmPrimitive p, Selector matchingSelector) {
+                public Command createCommand(OsmPrimitive p, Selector matchingSelector) {
                     final String key = evaluateObject(obj, p, matchingSelector);
                     return new ChangePropertyCommand(p, key, "");
@@ -215,5 +216,5 @@
             return new FixCommand() {
                 @Override
-                Command createCommand(OsmPrimitive p, Selector matchingSelector) {
+                public Command createCommand(OsmPrimitive p, Selector matchingSelector) {
                     return new ChangePropertyKeyCommand(p,
                             TagCheck.insertArguments(matchingSelector, oldKey, p),
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(revision 10598)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java	(revision 10599)
@@ -30,9 +30,9 @@
 import org.openstreetmap.josm.tools.Utils;
 
-public abstract class Condition {
-
-    public abstract boolean applies(Environment e);
-
-    public static Condition createKeyValueCondition(String k, String v, Op op, Context context, boolean considerValAsKey) {
+public interface Condition {
+
+    boolean applies(Environment e);
+
+    static Condition createKeyValueCondition(String k, String v, Op op, Context context, boolean considerValAsKey) {
         switch (context) {
         case PRIMITIVE:
@@ -57,9 +57,9 @@
     }
 
-    public static Condition createRegexpKeyRegexpValueCondition(String k, String v, Op op) {
+    static Condition createRegexpKeyRegexpValueCondition(String k, String v, Op op) {
         return new RegexpKeyValueRegexpCondition(k, v, op);
     }
 
-    public static Condition createKeyCondition(String k, boolean not, KeyMatchType matchType, Context context) {
+    static Condition createKeyCondition(String k, boolean not, KeyMatchType matchType, Context context) {
         switch (context) {
         case PRIMITIVE:
@@ -77,13 +77,13 @@
     }
 
-    public static PseudoClassCondition createPseudoClassCondition(String id, boolean not, Context context) {
+    static PseudoClassCondition createPseudoClassCondition(String id, boolean not, Context context) {
         return PseudoClassCondition.createPseudoClassCondition(id, not, context);
     }
 
-    public static ClassCondition createClassCondition(String id, boolean not, Context context) {
+    static ClassCondition createClassCondition(String id, boolean not, Context context) {
         return new ClassCondition(id, not);
     }
 
-    public static ExpressionCondition createExpressionCondition(Expression e, Context context) {
+    static ExpressionCondition createExpressionCondition(Expression e, Context context) {
         return new ExpressionCondition(e);
     }
@@ -92,5 +92,5 @@
      * This is the operation that {@link KeyValueCondition} uses to match.
      */
-    public enum Op {
+    enum Op {
         /** The value equals the given reference. */
         EQ,
@@ -183,5 +183,5 @@
      * Context, where the condition applies.
      */
-    public enum Context {
+    enum Context {
         /**
          * normal primitive selector, e.g. way[highway=residential]
@@ -200,5 +200,5 @@
      * Extra class for performance reasons.
      */
-    public static class SimpleKeyValueCondition extends Condition {
+    class SimpleKeyValueCondition implements Condition {
         /**
          * The key to search for.
@@ -240,5 +240,5 @@
      *
      */
-    public static class KeyValueCondition extends Condition {
+    class KeyValueCondition implements Condition {
         /**
          * The key to search for.
@@ -288,5 +288,5 @@
     }
 
-    public static class KeyValueRegexpCondition extends KeyValueCondition {
+    class KeyValueRegexpCondition extends KeyValueCondition {
 
         public final Pattern pattern;
@@ -317,5 +317,5 @@
     }
 
-    public static class RegexpKeyValueRegexpCondition extends KeyValueRegexpCondition {
+    class RegexpKeyValueRegexpCondition extends KeyValueRegexpCondition {
 
         public final Pattern keyPattern;
@@ -337,5 +337,5 @@
     }
 
-    public static class RoleCondition extends Condition {
+    class RoleCondition implements Condition {
         public final String role;
         public final Op op;
@@ -354,5 +354,5 @@
     }
 
-    public static class IndexCondition extends Condition {
+    class IndexCondition implements Condition {
         public final String index;
         public final Op op;
@@ -377,5 +377,5 @@
      * This defines how {@link KeyCondition} matches a given key.
      */
-    public enum KeyMatchType {
+    enum KeyMatchType {
         /**
          * The key needs to be equal to the given label.
@@ -417,5 +417,5 @@
      * </pre>
      */
-    public static class KeyCondition extends Condition {
+    class KeyCondition implements Condition {
 
         /**
@@ -499,5 +499,5 @@
     }
 
-    public static class ClassCondition extends Condition {
+    class ClassCondition implements Condition {
 
         public final String id;
@@ -524,5 +524,9 @@
      * are written in lower case with dashes between words.
      */
-    static class PseudoClasses {
+    final class PseudoClasses {
+
+        private PseudoClasses() {
+            // Hide default constructor for utilities classes
+        }
 
         /**
@@ -687,5 +691,5 @@
     }
 
-    public static class PseudoClassCondition extends Condition {
+    class PseudoClassCondition implements Condition {
 
         public final Method method;
@@ -736,5 +740,5 @@
     }
 
-    public static class OpenEndPseudoClassCondition extends PseudoClassCondition {
+    class OpenEndPseudoClassCondition extends PseudoClassCondition {
         public OpenEndPseudoClassCondition(boolean not) {
             super(null, not);
@@ -747,5 +751,5 @@
     }
 
-    public static class ExpressionCondition extends Condition {
+    class ExpressionCondition implements Condition {
 
         private final Expression e;
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java	(revision 10598)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java	(revision 10599)
@@ -34,7 +34,9 @@
  *   options <tt>mappaint.nameOrder</tt> and <tt>mappaint.nameComplementOrder</tt>.</li>
  * </ul>
- *
+ * @since  3987 (creation)
+ * @since 10599 (functional interface)
  */
-public abstract class LabelCompositionStrategy {
+@FunctionalInterface
+public interface LabelCompositionStrategy {
 
     /**
@@ -46,7 +48,7 @@
      * if no suitable value could be composed
      */
-    public abstract String compose(OsmPrimitive primitive);
-
-    public static class StaticLabelCompositionStrategy extends LabelCompositionStrategy {
+    String compose(OsmPrimitive primitive);
+
+    class StaticLabelCompositionStrategy implements LabelCompositionStrategy {
         private final String defaultLabel;
 
@@ -83,5 +85,5 @@
     }
 
-    public static class TagLookupCompositionStrategy extends LabelCompositionStrategy {
+    class TagLookupCompositionStrategy implements LabelCompositionStrategy {
 
         private final String defaultLabelTag;
@@ -127,6 +129,5 @@
     }
 
-    public static class DeriveLabelFromNameTagsCompositionStrategy
-        extends LabelCompositionStrategy implements PreferenceChangedListener {
+    class DeriveLabelFromNameTagsCompositionStrategy implements LabelCompositionStrategy, PreferenceChangedListener {
 
         /**
Index: trunk/src/org/openstreetmap/josm/gui/util/RotationAngle.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/RotationAngle.java	(revision 10598)
+++ trunk/src/org/openstreetmap/josm/gui/util/RotationAngle.java	(revision 10599)
@@ -12,14 +12,17 @@
 
 /**
- * Determines how an icon is to be rotated depending on the primitive to displayed.
+ * Determines how an icon is to be rotated depending on the primitive to be displayed.
+ * @since  8199 (creation)
+ * @since 10599 (functional interface)
  */
-public abstract class RotationAngle {
+@FunctionalInterface
+public interface RotationAngle {
 
     /**
-     * Calculates the rotation angle depending on the primitive to displayed.
+     * Calculates the rotation angle depending on the primitive to be displayed.
      * @param p primitive
      * @return rotation angle
      */
-    public abstract double getRotationAngle(OsmPrimitive p);
+    double getRotationAngle(OsmPrimitive p);
 
     /**
@@ -28,5 +31,5 @@
      * @return rotation angle
      */
-    public static RotationAngle buildStaticRotation(final double angle) {
+    static RotationAngle buildStaticRotation(final double angle) {
         return new RotationAngle() {
             @Override
@@ -47,5 +50,5 @@
      * @return rotation angle
      */
-    public static RotationAngle buildStaticRotation(final String string) {
+    static RotationAngle buildStaticRotation(final String string) {
         try {
             return buildStaticRotation(parseCardinalRotation(string));
@@ -63,5 +66,5 @@
      * @return the angle in radians
      */
-    public static double parseCardinalRotation(final String cardinal) {
+    static double parseCardinalRotation(final String cardinal) {
         switch (cardinal.toLowerCase(Locale.ENGLISH)) {
             case "n":
@@ -98,5 +101,5 @@
      * @return rotation angle
      */
-    public static RotationAngle buildWayDirectionRotation() {
+    static RotationAngle buildWayDirectionRotation() {
         return new RotationAngle() {
             @Override
