Reduce warnings
diff --git a/javaparser-core/bnd.bnd b/javaparser-core/bnd.bnd
index 55833db..b09e6e2 100644
--- a/javaparser-core/bnd.bnd
+++ b/javaparser-core/bnd.bnd
@@ -4,8 +4,11 @@
 # Export all packages except impl
 -exportcontents: \
     com.github.javaparser, \
+    com.github.javaparser.printer, \
+    com.github.javaparser.utils, \
     com.github.javaparser.ast, \
     com.github.javaparser.ast.body, \
+    com.github.javaparser.ast.imports, \
     com.github.javaparser.ast.comments, \
     com.github.javaparser.ast.nodeTypes, \
     com.github.javaparser.ast.expr, \
diff --git a/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java b/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java
index 0cce4d7..ccd1ced 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java
@@ -321,6 +321,7 @@
      * @return Expression representing the Java expression
      * @throws ParseProblemException if the source code has parser errors
      */
+    @SuppressWarnings("unchecked")
     public static <T extends Expression> T parseExpression(final String expression) {
         return (T) simplifiedParse(EXPRESSION, provider(expression));
     }
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java b/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java
index 26ba8aa..72c1b44 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/Node.java
@@ -373,6 +373,7 @@
      * @return The data or null of no data was found for the given key
      * @see DataKey
      */
+    @SuppressWarnings("unchecked")
     public <M> M getData(final DataKey<M> key) {
         if (data == null) {
             return null;
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/NodeList.java b/javaparser-core/src/main/java/com/github/javaparser/ast/NodeList.java
index 79f0580..2f3a8db 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/NodeList.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/NodeList.java
@@ -15,6 +15,10 @@
 
 /**
  * A list of nodes.
+ * It usually has a parent node.
+ * Different from normal Nodes, this does not mean that it is a child of that parent.
+ * Instead, this list will make every node it contains a child of its parent.
+ * This way, a NodeList does not create an extra level inside the AST.
  *
  * @param <N> the type of nodes contained.
  */
@@ -53,15 +57,13 @@
             notifyElementRemoved(index, node);
             node.setParentNode(null);
         }
-        boolean remove = innerList.remove(node);
-        return remove;
+        return innerList.remove(node);
     }
 
+    @SafeVarargs
     public static <X extends Node> NodeList<X> nodeList(X... nodes) {
         final NodeList<X> nodeList = new NodeList<>();
-        for (X node : nodes) {
-            nodeList.add(node);
-        }
+        Collections.addAll(nodeList, nodes);
         return nodeList;
     }
 
@@ -75,9 +77,7 @@
 
     public static <X extends Node> NodeList<X> nodeList(NodeList<X> nodes) {
         final NodeList<X> nodeList = new NodeList<>();
-        for (X node : nodes) {
-            nodeList.add(node);
-        }
+        nodeList.addAll(nodes);
         return nodeList;
     }
 
@@ -180,7 +180,6 @@
     }
 
     /**
-     * @param action
      * @see java.lang.Iterable#forEach(java.util.function.Consumer)
      */
     @Override
@@ -189,8 +188,6 @@
     }
 
     /**
-     * @param o
-     * @return
      * @see java.util.List#contains(java.lang.Object)
      */
     @Override
@@ -199,7 +196,6 @@
     }
 
     /**
-     * @return
      * @see java.util.List#toArray()
      */
     @Override
@@ -208,8 +204,6 @@
     }
 
     /**
-     * @param a
-     * @return
      * @see java.util.List#toArray(java.lang.Object[])
      */
     @Override
@@ -218,8 +212,6 @@
     }
 
     /**
-     * @param o
-     * @return
      * @see java.util.List#remove(java.lang.Object)
      */
     @Override
@@ -232,8 +224,6 @@
     }
 
     /**
-     * @param c
-     * @return
      * @see java.util.List#containsAll(java.util.Collection)
      */
     @Override
@@ -242,20 +232,15 @@
     }
 
     /**
-     * @param c
-     * @return
      * @see java.util.List#addAll(java.util.Collection)
      */
     @Override
     public boolean addAll(Collection<? extends N> c) {
-        c.forEach(e -> add(e));
+        c.forEach(this::add);
         return !c.isEmpty();
     }
 
     /**
-     * @param index
-     * @param c
-     * @return
      * @see java.util.List#addAll(int, java.util.Collection)
      */
     @Override
@@ -267,8 +252,6 @@
     }
 
     /**
-     * @param c
-     * @return
      * @see java.util.List#removeAll(java.util.Collection)
      */
     @Override
@@ -281,8 +264,6 @@
     }
 
     /**
-     * @param c
-     * @return
      * @see java.util.List#retainAll(java.util.Collection)
      */
     @Override
@@ -297,7 +278,6 @@
     }
 
     /**
-     * @param operator
      * @see java.util.List#replaceAll(java.util.function.UnaryOperator)
      */
     @Override
@@ -308,8 +288,6 @@
     }
 
     /**
-     * @param filter
-     * @return
      * @see java.util.Collection#removeIf(java.util.function.Predicate)
      */
     @Override
@@ -332,8 +310,6 @@
     }
 
     /**
-     * @param o
-     * @return
      * @see java.util.List#equals(java.lang.Object)
      */
     @Override
@@ -342,7 +318,6 @@
     }
 
     /**
-     * @return
      * @see java.util.List#hashCode()
      */
     @Override
@@ -351,8 +326,6 @@
     }
 
     /**
-     * @param o
-     * @return
      * @see java.util.List#indexOf(java.lang.Object)
      */
     @Override
@@ -361,8 +334,6 @@
     }
 
     /**
-     * @param o
-     * @return
      * @see java.util.List#lastIndexOf(java.lang.Object)
      */
     @Override
@@ -371,7 +342,6 @@
     }
 
     /**
-     * @return
      * @see java.util.List#listIterator()
      */
     @Override
@@ -380,8 +350,6 @@
     }
 
     /**
-     * @param index
-     * @return
      * @see java.util.List#listIterator(int)
      */
     @Override
@@ -390,7 +358,6 @@
     }
 
     /**
-     * @return
      * @see java.util.Collection#parallelStream()
      */
     @Override
@@ -399,9 +366,6 @@
     }
 
     /**
-     * @param fromIndex
-     * @param toIndex
-     * @return
      * @see java.util.List#subList(int, int)
      */
     @Override
@@ -410,7 +374,6 @@
     }
 
     /**
-     * @return
      * @see java.util.List#spliterator()
      */
     @Override
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/body/TypeDeclaration.java b/javaparser-core/src/main/java/com/github/javaparser/ast/body/TypeDeclaration.java
index cb7912c..871a128 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/body/TypeDeclaration.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/body/TypeDeclaration.java
@@ -135,6 +135,7 @@
         return (T) this;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public T setName(SimpleName name) {
         notifyPropertyChange(ObservableProperty.NAME, this.name, name);
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LambdaExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LambdaExpr.java
index 58eb511..5ad1808 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LambdaExpr.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LambdaExpr.java
@@ -26,7 +26,7 @@
 import com.github.javaparser.ast.body.Parameter;
 import com.github.javaparser.ast.nodeTypes.NodeWithParameters;
 import com.github.javaparser.ast.observer.ObservableProperty;
-import com.github.javaparser.ast.stmt.EmptyStmt;
+import com.github.javaparser.ast.stmt.ReturnStmt;
 import com.github.javaparser.ast.stmt.Statement;
 import com.github.javaparser.ast.visitor.GenericVisitor;
 import com.github.javaparser.ast.visitor.VoidVisitor;
@@ -50,7 +50,7 @@
     public LambdaExpr() {
         this(null,
                 new NodeList<>(),
-                new EmptyStmt(),
+                new ReturnStmt(),
                 false);
     }
 
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/NameExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/NameExpr.java
index 3331920..5c59073 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/NameExpr.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/NameExpr.java
@@ -63,10 +63,12 @@
         v.visit(this, arg);
     }
 
+    @Override
     public final SimpleName getName() {
         return name;
     }
 
+    @Override
     public NameExpr setName(final SimpleName name) {
         notifyPropertyChange(ObservableProperty.NAME, this.name, name);
         this.name = assertNotNull(name);
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithArguments.java b/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithArguments.java
index 9ec380a..3154009 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithArguments.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithArguments.java
@@ -14,11 +14,13 @@
         return getArguments().get(i);
     }
 
+    @SuppressWarnings("unchecked")
     default N addArgument(String arg) {
         addArgument(new NameExpr(arg));
         return (N) this;
     }
 
+    @SuppressWarnings("unchecked")
     default N addArgument(Expression arg) {
         getArguments().add(arg);
         return (N) this;
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithName.java b/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithName.java
index 9a7f21c..2d8190f 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithName.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithName.java
@@ -38,6 +38,7 @@
 
     N setName(Name name);
 
+    @SuppressWarnings("unchecked")
     default N setName(String name) {
         setName(parse(name));
         return (N) this;
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithType.java b/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithType.java
index 382786f..b938ce2 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithType.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/NodeWithType.java
@@ -56,11 +56,13 @@
      * @param typeClass the type

      * @return this

      */

+    @SuppressWarnings("unchecked")

     default N setType(Class<?> typeClass) {

         ((Node) this).tryAddImportToParentCompilationUnit(typeClass);

         return setType((T) new ClassOrInterfaceType(typeClass.getSimpleName()));

     }

 

+    @SuppressWarnings("unchecked")

     default N setType(final String type) {

         ClassOrInterfaceType classOrInterfaceType = new ClassOrInterfaceType(type);

         return setType((T) classOrInterfaceType);

diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/DoStmt.java b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/DoStmt.java
index 49769cb..8b64bc9 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/DoStmt.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/DoStmt.java
@@ -39,7 +39,7 @@
     private Expression condition;
 
     public DoStmt() {
-        this(null, new EmptyStmt(), new BooleanLiteralExpr());
+        this(null, new ReturnStmt(), new BooleanLiteralExpr());
     }
 
     public DoStmt(final Statement body, final Expression condition) {
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/ForStmt.java b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/ForStmt.java
index 1b734b7..ff44699 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/ForStmt.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/ForStmt.java
@@ -52,7 +52,7 @@
                 new NodeList<>(),
                 new BooleanLiteralExpr(),
                 new NodeList<>(),
-                new EmptyStmt());
+                new ReturnStmt());
     }
 
     public ForStmt(final NodeList<Expression> initialization, final Expression compare,
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/ForeachStmt.java b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/ForeachStmt.java
index bea1aa8..404fc86 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/ForeachStmt.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/ForeachStmt.java
@@ -47,7 +47,7 @@
         this(null,
                 new VariableDeclarationExpr(),
                 new NameExpr(),
-                new EmptyStmt());
+                new ReturnStmt());
     }
 
     public ForeachStmt(final VariableDeclarationExpr variable,
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/IfStmt.java b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/IfStmt.java
index 379d0a1..d75f442 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/IfStmt.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/IfStmt.java
@@ -46,7 +46,7 @@
     public IfStmt() {
         this(null,
                 new BooleanLiteralExpr(),
-                new EmptyStmt(),
+                new ReturnStmt(),
                 null);
     }
 
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/LabeledStmt.java b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/LabeledStmt.java
index 126c39a..28f0e42 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/LabeledStmt.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/LabeledStmt.java
@@ -22,6 +22,7 @@
 package com.github.javaparser.ast.stmt;
 
 import com.github.javaparser.Range;
+import com.github.javaparser.ast.expr.SimpleName;
 import com.github.javaparser.ast.observer.ObservableProperty;
 import com.github.javaparser.ast.visitor.GenericVisitor;
 import com.github.javaparser.ast.visitor.VoidVisitor;
@@ -29,23 +30,24 @@
 import static com.github.javaparser.utils.Utils.assertNotNull;
 
 /**
+ * A statement that is labeled, like <code>label123: println("continuing");</code>
  * @author Julio Vilmar Gesser
  */
 public final class LabeledStmt extends Statement {
 
-    private String label;
+    private SimpleName label;
 
     private Statement statement;
 
     public LabeledStmt() {
-        this(null, "empty", new EmptyStmt());
+        this(null, new SimpleName(), new ReturnStmt());
     }
 
     public LabeledStmt(final String label, final Statement statement) {
-        this(null, label, statement);
+        this(null, new SimpleName(label), statement);
     }
 
-    public LabeledStmt(Range range, final String label, final Statement statement) {
+    public LabeledStmt(Range range, final SimpleName label, final Statement statement) {
         super(range);
         setLabel(label);
         setStatement(statement);
@@ -61,24 +63,25 @@
         v.visit(this, arg);
     }
 
-    public String getLabel() {
-        return label;
-    }
-
     public Statement getStatement() {
         return statement;
     }
 
-    public LabeledStmt setLabel(final String label) {
-        notifyPropertyChange(ObservableProperty.LABEL, this.label, label);
-        this.label = assertNotNull(label);
-        return this;
-    }
-
     public LabeledStmt setStatement(final Statement statement) {
         notifyPropertyChange(ObservableProperty.STATEMENT, this.statement, statement);
         this.statement = assertNotNull(statement);
         setAsParentNodeOf(this.statement);
         return this;
     }
+
+    public final SimpleName getLabel() {
+        return label;
+    }
+
+    public LabeledStmt setLabel(final SimpleName label) {
+        notifyPropertyChange(ObservableProperty.LABEL, this.label, label);
+        this.label = assertNotNull(label);
+        setAsParentNodeOf(label);
+        return this;
+    }
 }
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/WhileStmt.java b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/WhileStmt.java
index 0a022d3..7d65770 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/WhileStmt.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/WhileStmt.java
@@ -39,7 +39,7 @@
     private Statement body;
 
     public WhileStmt() {
-        this(null, new BooleanLiteralExpr(), new EmptyStmt());
+        this(null, new BooleanLiteralExpr(), new ReturnStmt());
     }
 
     public WhileStmt(final Expression condition, final Statement body) {
diff --git a/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java
index f3170a1..11706ab 100644
--- a/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java
+++ b/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java
@@ -860,7 +860,7 @@
     @Override
     public void visit(final LabeledStmt n, final Void arg) {
         printJavaComment(n.getComment(), arg);
-        printer.print(n.getLabel());
+        n.getLabel().accept(this, arg);
         printer.print(": ");
         n.getStatement().accept(this, arg);
     }
diff --git a/javaparser-core/src/main/javacc/java_1_8.jj b/javaparser-core/src/main/javacc/java_1_8.jj
index c4e43d1..04c6ebf 100644
--- a/javaparser-core/src/main/javacc/java_1_8.jj
+++ b/javaparser-core/src/main/javacc/java_1_8.jj
@@ -2807,18 +2807,18 @@
 }
 {
   "assert" {begin=tokenBegin();} check = Expression() [ ":" msg = Expression() ] ";"
-  { return new AssertStmt(range(begin, tokenEnd()),check, msg);  }
+  { return new AssertStmt(range(begin, tokenEnd()), check, msg);  }
 }
 
 LabeledStmt LabeledStatement():
 {
-	String label;
+	SimpleName label;
 	Statement stmt;
 	Position begin;
 }
 {
-  <IDENTIFIER> {begin=tokenBegin();} { label = token.image; } ":" stmt = Statement()
-  { return new LabeledStmt(range(begin, tokenEnd()),label, stmt); }
+  label = SimpleName() {begin=tokenBegin();} ":" stmt = Statement()
+  { return new LabeledStmt(range(begin, tokenEnd()), label, stmt); }
 }
 
 BlockStmt Block():