diff --git a/src/h/ST_Node_t___or_object_t.java b/src/h/ST_Node_t___or_object_t.java
new file mode 100644
index 000000000..b67442fae
--- /dev/null
+++ b/src/h/ST_Node_t___or_object_t.java
@@ -0,0 +1,52 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of Smetana.
+ * Smetana is a partial translation of Graphviz/Dot sources from C to Java.
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * This translation is distributed under the same Licence as the original C program:
+ * 
+ *************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: See CVS logs. Details at http://www.graphviz.org/
+ *************************************************************************
+ *
+ * THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
+ * LICENSE ("AGREEMENT"). [Eclipse Public License - v 1.0]
+ * 
+ * ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES
+ * RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+ * 
+ * You may obtain a copy of the License at
+ * 
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package h;
+
+import smetana.core.__ptr__;
+
+public interface ST_Node_t___or_object_t extends __ptr__ {
+
+}
diff --git a/src/net/sourceforge/plantuml/QString.java b/src/net/sourceforge/plantuml/QString.java
new file mode 100644
index 000000000..caeaea54b
--- /dev/null
+++ b/src/net/sourceforge/plantuml/QString.java
@@ -0,0 +1,90 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ *
+ */
+package net.sourceforge.plantuml;
+
+public class QString {
+
+	private final String data;
+	private final long mask;
+
+	public QString(String data) {
+		this.data = data;
+		this.mask = getMask(data);
+	}
+	
+	@Override
+	public String toString() {
+		return data;
+	}
+
+	public boolean containsQ(QString other) {
+		if ((this.mask & other.mask) != other.mask) {
+			return false;
+		}
+		return this.data.contains(other.data);
+	}
+
+	static long getMask(String s) {
+		long result = 0;
+		for (int i = 0; i < s.length(); i++) {
+			result |= getMask(s.charAt(i));
+		}
+		return result;
+	}
+
+	static long getMask(char c) {
+		if (c >= '0' && c <= '9') {
+			final int n = c - '0';
+			return 1L << n;
+		}
+		if (c >= 'a' && c <= 'z') {
+			final int n = c - 'a' + 10;
+			return 1L << n;
+		}
+		if (c >= 'A' && c <= 'Z') {
+			final int n = c - 'A' + 10 + 26;
+			return 1L << n;
+		}
+		if (c == '_') {
+			return 1L << (10 + 26 + 26);
+		}
+		if (c == '(') {
+			return 1L << 63;
+		}
+		return 0;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/ant/CheckZipTask.java b/src/net/sourceforge/plantuml/ant/CheckZipTask.java
new file mode 100644
index 000000000..a53f4f165
--- /dev/null
+++ b/src/net/sourceforge/plantuml/ant/CheckZipTask.java
@@ -0,0 +1,136 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ *
+ */
+package net.sourceforge.plantuml.ant;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.FileList;
+import org.apache.tools.ant.types.FileSet;
+
+public class CheckZipTask extends Task {
+
+	private String zipfile = null;
+	private List<FileSet> filesets = new ArrayList<FileSet>();
+	private List<FileList> filelists = new ArrayList<FileList>();
+
+	/**
+	 * Add a set of files to touch
+	 */
+	public void addFileset(FileSet set) {
+		filesets.add(set);
+	}
+
+	/**
+	 * Add a filelist to touch
+	 */
+	public void addFilelist(FileList list) {
+		filelists.add(list);
+	}
+
+	// The method executing the task
+	@Override
+	public void execute() throws BuildException {
+
+		myLog("Check " + zipfile);
+
+		try {
+			loadZipFile(new File(zipfile));
+			for (FileList fileList : filelists) {
+				manageFileList(fileList);
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+			throw new BuildException(e.toString());
+		}
+	}
+
+	private void manageFileList(FileList fileList) {
+		boolean error = false;
+		final String[] srcFiles = fileList.getFiles(getProject());
+		for (String s : srcFiles) {
+			if (isPresentInFile(s) == false) {
+				myLog("Missing " + s);
+				error = true;
+			}
+		}
+		if (error) {
+			throw new BuildException("Some entries are missing in the zipfile");
+		}
+	}
+
+	private boolean isPresentInFile(String s) {
+		return entries.contains(s);
+	}
+
+	private final List<String> entries = new ArrayList<String>();
+
+	private void loadZipFile(File file) throws IOException {
+
+		this.entries.clear();
+		final PrintWriter pw = new PrintWriter("tmp.txt");
+		final ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
+		ZipEntry ze = zis.getNextEntry();
+
+		while (ze != null) {
+			final String fileName = ze.getName();
+			this.entries.add(fileName);
+			if (fileName.endsWith("/") == false) {
+				pw.println("<file name=\"" + fileName + "\" />");
+			}
+			ze = zis.getNextEntry();
+		}
+		pw.close();
+		zis.close();
+	}
+
+	private synchronized void myLog(String s) {
+		this.log(s);
+	}
+
+	public void setZipfile(String s) {
+		this.zipfile = s;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/command/CommandMainframe.java b/src/net/sourceforge/plantuml/command/CommandMainframe.java
new file mode 100644
index 000000000..9ca260caa
--- /dev/null
+++ b/src/net/sourceforge/plantuml/command/CommandMainframe.java
@@ -0,0 +1,55 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.command;
+
+import java.util.List;
+
+import net.sourceforge.plantuml.UmlDiagram;
+import net.sourceforge.plantuml.cucadiagram.Display;
+
+public class CommandMainframe extends SingleLineCommand<UmlDiagram> {
+
+	public CommandMainframe() {
+		super("(?i)^mainframe(?:[%s]*:[%s]*|[%s]+)(.*[\\p{L}0-9_.].*)$");
+	}
+
+	@Override
+	protected CommandExecutionResult executeArg(UmlDiagram diagram, List<String> arg) {
+		final Display label = Display.getWithNewlines(arg.get(0));
+		diagram.setMainFrame(label);
+		return CommandExecutionResult.ok();
+	}
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/CommandComment.java b/src/net/sourceforge/plantuml/nwdiag/CommandComment.java
new file mode 100644
index 000000000..22b0687c8
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/CommandComment.java
@@ -0,0 +1,61 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.command.SingleLineCommand2;
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.command.regex.RegexResult;
+
+public class CommandComment extends SingleLineCommand2<NwDiagram> {
+
+	public CommandComment() {
+		super(getRegexConcat());
+	}
+
+	static RegexConcat getRegexConcat() {
+		return new RegexConcat(new RegexLeaf("^"), //
+				new RegexLeaf("[%s]*//.*"), //
+				new RegexLeaf("$"));
+	}
+
+	@Override
+	protected CommandExecutionResult executeArg(NwDiagram diagram, RegexResult arg) {
+		return CommandExecutionResult.ok();
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/CommandElement.java b/src/net/sourceforge/plantuml/nwdiag/CommandElement.java
new file mode 100644
index 000000000..e4964345c
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/CommandElement.java
@@ -0,0 +1,65 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.command.SingleLineCommand2;
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.command.regex.RegexResult;
+
+public class CommandElement extends SingleLineCommand2<NwDiagram> {
+
+	public CommandElement() {
+		super(getRegexConcat());
+	}
+
+	static RegexConcat getRegexConcat() {
+		return new RegexConcat(new RegexLeaf("^"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("NAME", "([\\p{L}0-9_]+)"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("DEFINITION", "(\\[(.*)\\])?"), //
+				new RegexLeaf(";?"), //
+				new RegexLeaf("$"));
+	}
+
+	@Override
+	protected CommandExecutionResult executeArg(NwDiagram diagram, RegexResult arg) {
+		return diagram.addElement(arg.get("NAME", 0), arg.get("DEFINITION", 1));
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/CommandEndSomething.java b/src/net/sourceforge/plantuml/nwdiag/CommandEndSomething.java
new file mode 100644
index 000000000..7a82545a0
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/CommandEndSomething.java
@@ -0,0 +1,63 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.command.SingleLineCommand2;
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.command.regex.RegexResult;
+
+public class CommandEndSomething extends SingleLineCommand2<NwDiagram> {
+
+	public CommandEndSomething() {
+		super(getRegexConcat());
+	}
+
+	static RegexConcat getRegexConcat() {
+		return new RegexConcat(new RegexLeaf("^"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("\\}"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("$"));
+	}
+
+	@Override
+	protected CommandExecutionResult executeArg(NwDiagram diagram, RegexResult arg) {
+		return diagram.endSomething();
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/CommandGroup.java b/src/net/sourceforge/plantuml/nwdiag/CommandGroup.java
new file mode 100644
index 000000000..5d78d0bfb
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/CommandGroup.java
@@ -0,0 +1,67 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.command.SingleLineCommand2;
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.command.regex.RegexResult;
+
+public class CommandGroup extends SingleLineCommand2<NwDiagram> {
+
+	public CommandGroup() {
+		super(getRegexConcat());
+	}
+
+	static RegexConcat getRegexConcat() {
+		return new RegexConcat(new RegexLeaf("^"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("group"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("NAME", "([\\p{L}0-9_]+)?"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("\\{"), //
+				new RegexLeaf("$"));
+	}
+
+
+	@Override
+	protected CommandExecutionResult executeArg(NwDiagram diagram, RegexResult arg) {
+		return diagram.openGroup(arg.get("NAME", 0));
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/CommandLink.java b/src/net/sourceforge/plantuml/nwdiag/CommandLink.java
new file mode 100644
index 000000000..ed6d34969
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/CommandLink.java
@@ -0,0 +1,67 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.command.SingleLineCommand2;
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.command.regex.RegexResult;
+
+public class CommandLink extends SingleLineCommand2<NwDiagram> {
+
+	public CommandLink() {
+		super(getRegexConcat());
+	}
+
+	static RegexConcat getRegexConcat() {
+		return new RegexConcat(new RegexLeaf("^"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("NAME1", "[\\p{L}0-9_]+"), //
+				new RegexLeaf("[%s]*--[%s]*"), //
+				new RegexLeaf("NAME2", "[\\p{L}0-9_]+"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf(";?"), //
+				new RegexLeaf("$"));
+	}
+
+
+	@Override
+	protected CommandExecutionResult executeArg(NwDiagram diagram, RegexResult arg) {
+		return diagram.link();
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/CommandNetwork.java b/src/net/sourceforge/plantuml/nwdiag/CommandNetwork.java
new file mode 100644
index 000000000..0564dfc6a
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/CommandNetwork.java
@@ -0,0 +1,66 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.command.SingleLineCommand2;
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.command.regex.RegexResult;
+
+public class CommandNetwork extends SingleLineCommand2<NwDiagram> {
+
+	public CommandNetwork() {
+		super(getRegexConcat());
+	}
+
+	static RegexConcat getRegexConcat() {
+		return new RegexConcat(new RegexLeaf("^"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("network"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("NAME", "([\\p{L}0-9_]+)?"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("\\{"), //
+				new RegexLeaf("$"));
+	}
+
+	@Override
+	protected CommandExecutionResult executeArg(NwDiagram diagram, RegexResult arg) {
+		return diagram.openNetwork(arg.get("NAME", 0));
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/CommandNwDiagInit.java b/src/net/sourceforge/plantuml/nwdiag/CommandNwDiagInit.java
new file mode 100644
index 000000000..be8aae651
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/CommandNwDiagInit.java
@@ -0,0 +1,64 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.command.SingleLineCommand2;
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.command.regex.RegexResult;
+
+public class CommandNwDiagInit extends SingleLineCommand2<NwDiagram> {
+
+	public CommandNwDiagInit() {
+		super(getRegexConcat());
+	}
+
+	static RegexConcat getRegexConcat() {
+		return new RegexConcat(new RegexLeaf("^"), //
+				new RegexLeaf("TYPE", "nwdiag"), //
+				new RegexLeaf("[%s]+"), //
+				new RegexLeaf("\\{"), //
+				new RegexLeaf("$"));
+	}
+
+	@Override
+	protected CommandExecutionResult executeArg(NwDiagram diagram, RegexResult arg) {
+		diagram.init();
+		return CommandExecutionResult.ok();
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/CommandProperty.java b/src/net/sourceforge/plantuml/nwdiag/CommandProperty.java
new file mode 100644
index 000000000..458281b2d
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/CommandProperty.java
@@ -0,0 +1,68 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.command.SingleLineCommand2;
+import net.sourceforge.plantuml.command.regex.RegexConcat;
+import net.sourceforge.plantuml.command.regex.RegexLeaf;
+import net.sourceforge.plantuml.command.regex.RegexResult;
+
+public class CommandProperty extends SingleLineCommand2<NwDiagram> {
+
+	public CommandProperty() {
+		super(getRegexConcat());
+	}
+
+	static RegexConcat getRegexConcat() {
+		return new RegexConcat(new RegexLeaf("^"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("NAME", "(address|color)"), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("="), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf("VALUE", "\"(.*)\""), //
+				new RegexLeaf("[%s]*"), //
+				new RegexLeaf(";?"), //
+				new RegexLeaf("$"));
+	}
+
+	@Override
+	protected CommandExecutionResult executeArg(NwDiagram diagram, RegexResult arg) {
+		return diagram.setProperty(arg.get("NAME", 0), arg.get("VALUE", 0));
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/DiagElement.java b/src/net/sourceforge/plantuml/nwdiag/DiagElement.java
new file mode 100644
index 000000000..c204bf3c5
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/DiagElement.java
@@ -0,0 +1,120 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import net.sourceforge.plantuml.ColorParam;
+import net.sourceforge.plantuml.SpriteContainerEmpty;
+import net.sourceforge.plantuml.cucadiagram.Display;
+import net.sourceforge.plantuml.graphic.FontConfiguration;
+import net.sourceforge.plantuml.graphic.HorizontalAlignment;
+import net.sourceforge.plantuml.graphic.HtmlColorUtils;
+import net.sourceforge.plantuml.graphic.SymbolContext;
+import net.sourceforge.plantuml.graphic.TextBlock;
+import net.sourceforge.plantuml.graphic.TextBlockUtils;
+import net.sourceforge.plantuml.graphic.USymbol;
+import net.sourceforge.plantuml.ugraphic.UFont;
+
+public class DiagElement {
+
+	private USymbol shape = USymbol.RECTANGLE;
+	private final String name;
+	private String description;
+	private final Network mainNetwork;
+
+	@Override
+	public String toString() {
+		return name;
+	}
+
+	public DiagElement(String name, Network network) {
+		this.description = name;
+		this.mainNetwork = network;
+		this.name = name;
+	}
+
+	private TextBlock toTextBlock(String s) {
+		if (s == null) {
+			return null;
+		}
+		if (s.length() == 0) {
+			return TextBlockUtils.empty(0, 0);
+		}
+		s = s.replace(", ", "\\n");
+		return Display.getWithNewlines(s).create(getFontConfiguration(), HorizontalAlignment.LEFT,
+				new SpriteContainerEmpty());
+	}
+
+	private FontConfiguration getFontConfiguration() {
+		final UFont font = UFont.serif(11);
+		return new FontConfiguration(font, HtmlColorUtils.BLACK, HtmlColorUtils.BLACK, false);
+	}
+
+	public LinkedElement asTextBlock(final String adress1, final String adress2) {
+		final TextBlock ad1 = toTextBlock(adress1);
+		final TextBlock ad2 = toTextBlock(adress2);
+		final SymbolContext symbolContext = new SymbolContext(ColorParam.activityBackground.getDefaultValue(),
+				ColorParam.activityBorder.getDefaultValue()).withShadow(true);
+		final TextBlock desc = toTextBlock(description);
+		final TextBlock box = shape
+				.asSmall(TextBlockUtils.empty(0, 0), desc, TextBlockUtils.empty(0, 0), symbolContext);
+		return new LinkedElement(ad1, box, ad2, mainNetwork, this);
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public final Network getMainNetwork() {
+		return mainNetwork;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public final void setShape(String shapeName) {
+		if ("database".equalsIgnoreCase(shapeName)) {
+			this.shape = USymbol.DATABASE;
+		}
+		if ("node".equalsIgnoreCase(shapeName)) {
+			this.shape = USymbol.NODE;
+		}
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/DiagGroup.java b/src/net/sourceforge/plantuml/nwdiag/DiagGroup.java
new file mode 100644
index 000000000..58c8cd936
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/DiagGroup.java
@@ -0,0 +1,82 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import net.sourceforge.plantuml.graphic.HtmlColor;
+
+public class DiagGroup {
+
+	private final String name;
+	private final Network network;
+	private final Set<String> elements = new HashSet<String>();
+	private HtmlColor color;
+
+	@Override
+	public String toString() {
+		return name + " " + network + " " + elements;
+	}
+
+	public DiagGroup(String name, Network network) {
+		this.name = name;
+		this.network = network;
+	}
+
+	public final String getName() {
+		return name;
+	}
+
+	public void addElement(String name) {
+		this.elements.add(name);
+	}
+
+	public boolean matches(LinkedElement tested) {
+		if (network != null && network != tested.getNetwork()) {
+			return false;
+		}
+		return elements.contains(tested.getElement().getName());
+	}
+
+	public final HtmlColor getColor() {
+		return color;
+	}
+
+	public final void setColor(HtmlColor color) {
+		this.color = color;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/GridTextBlockDecorated.java b/src/net/sourceforge/plantuml/nwdiag/GridTextBlockDecorated.java
new file mode 100644
index 000000000..9ddf958eb
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/GridTextBlockDecorated.java
@@ -0,0 +1,136 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import java.util.Collection;
+
+import net.sourceforge.plantuml.graphic.HtmlColor;
+import net.sourceforge.plantuml.graphic.HtmlColorSetSimple;
+import net.sourceforge.plantuml.graphic.StringBounder;
+import net.sourceforge.plantuml.ugraphic.MinMax;
+import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
+import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.URectangle;
+import net.sourceforge.plantuml.ugraphic.UTranslate;
+
+public class GridTextBlockDecorated extends GridTextBlockSimple {
+
+	public static final HtmlColorSetSimple colors = new HtmlColorSetSimple();
+
+	public static final int NETWORK_THIN = 5;
+
+	private final Collection<DiagGroup> groups;
+
+	public GridTextBlockDecorated(int lines, int cols, Collection<DiagGroup> groups) {
+		super(lines, cols);
+		this.groups = groups;
+	}
+
+	@Override
+	public void drawGrid(UGraphic ug) {
+		for (DiagGroup group : groups) {
+			drawGroups(ug, group);
+		}
+		drawNetworkTube(ug);
+	}
+
+	private void drawGroups(UGraphic ug, DiagGroup group) {
+		final StringBounder stringBounder = ug.getStringBounder();
+
+		MinMax size = null;
+		double y = 0;
+		for (int i = 0; i < data.length; i++) {
+			final double lineHeight = lineHeight(stringBounder, i);
+			double x = 0;
+			for (int j = 0; j < data[i].length; j++) {
+				final double colWidth = colWidth(stringBounder, j);
+				final LinkedElement element = data[i][j];
+				if (element != null && group.matches(element)) {
+					final MinMax minMax = element.getMinMax(stringBounder, colWidth, lineHeight).translate(
+							new UTranslate(x, y));
+					size = size == null ? minMax : size.addMinMax(minMax);
+				}
+				x += colWidth;
+			}
+			y += lineHeight;
+		}
+		if (size != null) {
+			HtmlColor color = group.getColor();
+			if (color == null) {
+				color = colors.getColorIfValid("#AAA");
+			}
+			size.draw(ug, color);
+		}
+
+	}
+
+	private void drawNetworkTube(final UGraphic ug) {
+		final StringBounder stringBounder = ug.getStringBounder();
+		double y = 0;
+		for (int i = 0; i < data.length; i++) {
+			final Network network = getNetwork(i);
+			double x = 0;
+			double xmin = -1;
+			double xmax = 0;
+			for (int j = 0; j < data[i].length; j++) {
+				final boolean hline = isPresent(i, j) || isPresent(i - 1, j);
+				if (hline && xmin < 0) {
+					xmin = x;
+				}
+				x += colWidth(stringBounder, j);
+				if (hline) {
+					xmax = x;
+				}
+			}
+			final URectangle rect = new URectangle(xmax - xmin, NETWORK_THIN);
+			rect.setDeltaShadow(1.0);
+			UGraphic ug2 = ug.apply(new UTranslate(xmin, y));
+			if (network != null && network.getColor() != null) {
+				ug2 = ug2.apply(new UChangeBackColor(network.getColor()));
+			}
+			ug2.draw(rect);
+			y += lineHeight(stringBounder, i);
+		}
+	}
+
+	private Network getNetwork(int i) {
+		for (int j = 0; j < data[i].length; j++) {
+			if (isPresent(i, j)) {
+				return data[i][j].getNetwork();
+			}
+		}
+		return null;
+	}
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/GridTextBlockSimple.java b/src/net/sourceforge/plantuml/nwdiag/GridTextBlockSimple.java
new file mode 100644
index 000000000..d435a560a
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/GridTextBlockSimple.java
@@ -0,0 +1,131 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import java.awt.geom.Dimension2D;
+import java.awt.geom.Rectangle2D;
+
+import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.graphic.InnerStrategy;
+import net.sourceforge.plantuml.graphic.StringBounder;
+import net.sourceforge.plantuml.graphic.TextBlock;
+import net.sourceforge.plantuml.ugraphic.MinMax;
+import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.UTranslate;
+
+public class GridTextBlockSimple implements TextBlock {
+
+	protected final LinkedElement data[][];
+
+	public GridTextBlockSimple(int lines, int cols) {
+		this.data = new LinkedElement[lines][cols];
+	}
+
+	protected boolean isPresent(int i, int j) {
+		if (i == -1) {
+			return false;
+		}
+		return data[i][j] != null;
+	}
+
+	public void drawGrid(UGraphic ug) {
+	}
+
+	public void drawU(UGraphic ug) {
+		drawGrid(ug);
+		final StringBounder stringBounder = ug.getStringBounder();
+		double y = 0;
+		for (int i = 0; i < data.length; i++) {
+			final double lineHeight = lineHeight(stringBounder, i);
+			double x = 0;
+			for (int j = 0; j < data[i].length; j++) {
+				final double colWidth = colWidth(stringBounder, j);
+				if (data[i][j] != null) {
+					data[i][j].drawMe(ug.apply(new UTranslate(x, y)), colWidth, lineHeight);
+				}
+				x += colWidth;
+			}
+			y += lineHeight;
+		}
+	}
+
+	protected double colWidth(StringBounder stringBounder, final int j) {
+		double width = 0;
+		for (int i = 0; i < data.length; i++) {
+			if (data[i][j] != null) {
+				width = Math.max(width, data[i][j].naturalDimension(stringBounder).getWidth());
+			}
+		}
+		return width;
+	}
+
+	public double lineHeight(StringBounder stringBounder, final int i) {
+		double height = 0;
+		for (int j = 0; j < data[i].length; j++) {
+			if (data[i][j] != null) {
+				height = Math.max(height, data[i][j].naturalDimension(stringBounder).getHeight());
+			}
+		}
+		return height;
+	}
+
+	public Dimension2D calculateDimension(StringBounder stringBounder) {
+		if (data.length == 0) {
+			return new Dimension2DDouble(0, 0);
+		}
+		double height = 0;
+		for (int i = 0; i < data.length; i++) {
+			height += lineHeight(stringBounder, i);
+		}
+		double width = 0;
+		for (int j = 0; j < data[0].length; j++) {
+			width += colWidth(stringBounder, j);
+		}
+		return new Dimension2DDouble(width, height);
+	}
+
+	public Rectangle2D getInnerPosition(String member, StringBounder stringBounder, InnerStrategy strategy) {
+		throw new UnsupportedOperationException("member=" + member + " " + getClass().toString());
+	}
+
+	public MinMax getMinMax(StringBounder stringBounder) {
+		throw new UnsupportedOperationException(getClass().toString());
+	}
+
+	public void add(int i, int j, LinkedElement value) {
+		data[i][j] = value;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/LinkedElement.java b/src/net/sourceforge/plantuml/nwdiag/LinkedElement.java
new file mode 100644
index 000000000..443e9490a
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/LinkedElement.java
@@ -0,0 +1,136 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import java.awt.geom.Dimension2D;
+
+import net.sourceforge.plantuml.ColorParam;
+import net.sourceforge.plantuml.Dimension2DDouble;
+import net.sourceforge.plantuml.graphic.HtmlColor;
+import net.sourceforge.plantuml.graphic.StringBounder;
+import net.sourceforge.plantuml.graphic.TextBlock;
+import net.sourceforge.plantuml.ugraphic.MinMax;
+import net.sourceforge.plantuml.ugraphic.UChangeColor;
+import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.ULine;
+import net.sourceforge.plantuml.ugraphic.UTranslate;
+import net.sourceforge.plantuml.utils.MathUtils;
+
+public class LinkedElement {
+
+	private final TextBlock ad1;
+	private final TextBlock box;
+	private final TextBlock ad2;
+	private final Network network;
+	private final DiagElement element;
+
+	public LinkedElement(TextBlock ad1, TextBlock box, TextBlock ad2, Network network, DiagElement element) {
+		this.ad1 = ad1;
+		this.box = box;
+		this.ad2 = ad2;
+		this.network = network;
+		this.element = element;
+	}
+
+	private final double marginAd = 10;
+	private final double marginBox = 15;
+
+	public MinMax getMinMax(StringBounder stringBounder, double width, double height) {
+		final double xMiddle = width / 2;
+		final double yMiddle = height / 2;
+		final Dimension2D dimBox = box.calculateDimension(stringBounder);
+
+		final double x1 = xMiddle - dimBox.getWidth() / 2;
+		final double y1 = yMiddle - dimBox.getHeight() / 2;
+		final double x2 = xMiddle + dimBox.getWidth() / 2;
+		final double y2 = yMiddle + dimBox.getHeight() / 2;
+		return MinMax.getEmpty(false).addPoint(x1 - 5, y1 - 5).addPoint(x2 + 5, y2 + 5);
+	}
+
+	public void drawMe(UGraphic ug, double width, double height) {
+		final double xMiddle = width / 2;
+		final double yMiddle = height / 2;
+		final StringBounder stringBounder = ug.getStringBounder();
+		final Dimension2D dimBox = box.calculateDimension(stringBounder);
+
+		final double y1 = yMiddle - dimBox.getHeight() / 2;
+		final double y2 = yMiddle + dimBox.getHeight() / 2;
+
+		drawCenter(ug, box, xMiddle, yMiddle);
+
+		final HtmlColor color = ColorParam.activityBorder.getDefaultValue();
+		ug = ug.apply(new UChangeColor(color));
+		drawHLine(ug, xMiddle, GridTextBlockDecorated.NETWORK_THIN, y1);
+		if (ad2 != null) {
+			drawHLine(ug, xMiddle, y2, height);
+		}
+
+		drawCenter(ug, ad1, xMiddle, (GridTextBlockDecorated.NETWORK_THIN + y1) / 2);
+		if (ad2 != null) {
+			drawCenter(ug, ad2, xMiddle, (y2 + height - GridTextBlockDecorated.NETWORK_THIN) / 2);
+		}
+	}
+
+	private void drawCenter(UGraphic ug, TextBlock block, double x, double y) {
+		final Dimension2D dim = block.calculateDimension(ug.getStringBounder());
+		block.drawU(ug.apply(new UTranslate(x - dim.getWidth() / 2, y - dim.getHeight() / 2)));
+
+	}
+
+	private void drawHLine(UGraphic ug, double x, double y1, double y2) {
+		final ULine line = new ULine(0, y2 - y1);
+		ug.apply(new UTranslate(x, y1)).draw(line);
+	}
+
+	public Dimension2D naturalDimension(StringBounder stringBounder) {
+		final Dimension2D dim1 = ad1.calculateDimension(stringBounder);
+		final Dimension2D dimBox = box.calculateDimension(stringBounder);
+		final Dimension2D dim2 = ad2 == null ? new Dimension2DDouble(0, 0) : ad2.calculateDimension(stringBounder);
+		final double width = MathUtils.max(dim1.getWidth() + 2 * marginAd, dimBox.getWidth() + 2 * marginBox,
+				dim2.getWidth() + 2 * marginAd);
+		final double height = dim1.getHeight() + 2 * marginAd + dimBox.getHeight() + 2 * marginBox + dim2.getHeight()
+				+ 2 * marginAd;
+		return new Dimension2DDouble(width, height);
+	}
+
+	public final Network getNetwork() {
+		return network;
+	}
+
+	public final DiagElement getElement() {
+		return element;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/Network.java b/src/net/sourceforge/plantuml/nwdiag/Network.java
new file mode 100644
index 000000000..1c3b252b0
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/Network.java
@@ -0,0 +1,103 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import net.sourceforge.plantuml.graphic.HtmlColor;
+
+public class Network {
+
+	private final String name;
+	private final Map<DiagElement, String> localElements = new LinkedHashMap<DiagElement, String>();
+	private HtmlColor color;
+
+	private String ownAdress;
+
+	@Override
+	public String toString() {
+		return name;
+	}
+
+	public Network(String name) {
+		this.name = name;
+	}
+
+	public String getAdress(DiagElement element) {
+		return localElements.get(element);
+	}
+
+	public void addElement(DiagElement element, Map<String, String> props) {
+		String address = props.get("address");
+		if (address == null) {
+			address = "";
+		}
+		if (address.length() == 0 && localElements.containsKey(element)) {
+			return;
+		}
+		localElements.put(element, address);
+	}
+
+	public boolean constainsLocally(String name) {
+		for (DiagElement element : localElements.keySet()) {
+			if (element.getName().equals(name)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public final String getOwnAdress() {
+		return ownAdress;
+	}
+
+	public final void setOwnAdress(String ownAdress) {
+		this.ownAdress = ownAdress;
+	}
+
+	public final String getName() {
+		return name;
+	}
+
+	public final HtmlColor getColor() {
+		return color;
+	}
+
+	public final void setColor(HtmlColor color) {
+		this.color = color;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java b/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java
new file mode 100644
index 000000000..e1ac9d3c4
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/NwDiagram.java
@@ -0,0 +1,291 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import java.awt.geom.Dimension2D;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import net.sourceforge.plantuml.ColorParam;
+import net.sourceforge.plantuml.FileFormatOption;
+import net.sourceforge.plantuml.Scale;
+import net.sourceforge.plantuml.SpriteContainerEmpty;
+import net.sourceforge.plantuml.UmlDiagram;
+import net.sourceforge.plantuml.UmlDiagramType;
+import net.sourceforge.plantuml.command.CommandExecutionResult;
+import net.sourceforge.plantuml.core.DiagramDescription;
+import net.sourceforge.plantuml.core.ImageData;
+import net.sourceforge.plantuml.cucadiagram.Display;
+import net.sourceforge.plantuml.graphic.FontConfiguration;
+import net.sourceforge.plantuml.graphic.HorizontalAlignment;
+import net.sourceforge.plantuml.graphic.HtmlColor;
+import net.sourceforge.plantuml.graphic.HtmlColorUtils;
+import net.sourceforge.plantuml.graphic.StringBounder;
+import net.sourceforge.plantuml.graphic.TextBlock;
+import net.sourceforge.plantuml.graphic.UDrawable;
+import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
+import net.sourceforge.plantuml.ugraphic.ImageBuilder;
+import net.sourceforge.plantuml.ugraphic.UChangeBackColor;
+import net.sourceforge.plantuml.ugraphic.UChangeColor;
+import net.sourceforge.plantuml.ugraphic.UEmpty;
+import net.sourceforge.plantuml.ugraphic.UFont;
+import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.UTranslate;
+
+public class NwDiagram extends UmlDiagram {
+
+	private boolean initDone;
+	private final Map<String, DiagElement> elements = new LinkedHashMap<String, DiagElement>();
+	private final List<Network> networks = new ArrayList<Network>();
+	private final List<DiagGroup> groups = new ArrayList<DiagGroup>();
+	private DiagGroup currentGroup = null;
+
+	public DiagramDescription getDescription() {
+		return new DiagramDescription("(Nwdiag)");
+	}
+
+	@Override
+	public UmlDiagramType getUmlDiagramType() {
+		return UmlDiagramType.NWDIAG;
+	}
+
+	public void init() {
+		initDone = true;
+	}
+
+	private Network currentNetwork() {
+		if (networks.size() == 0) {
+			return null;
+		}
+		return networks.get(networks.size() - 1);
+	}
+
+	public CommandExecutionResult openGroup(String name) {
+		if (initDone == false) {
+			return error();
+		}
+		currentGroup = new DiagGroup(name, currentNetwork());
+		groups.add(currentGroup);
+		return CommandExecutionResult.ok();
+	}
+
+	public CommandExecutionResult openNetwork(String name) {
+		if (initDone == false) {
+			return error();
+		}
+		final Network network = new Network(name);
+		networks.add(network);
+		return CommandExecutionResult.ok();
+	}
+
+	public CommandExecutionResult endSomething() {
+		if (initDone == false) {
+			return error();
+		}
+		this.currentGroup = null;
+		return CommandExecutionResult.ok();
+	}
+
+	public CommandExecutionResult addElement(String name, String definition) {
+		if (initDone == false) {
+			return error();
+		}
+		if (currentGroup != null) {
+			currentGroup.addElement(name);
+		}
+		if (currentNetwork() != null) {
+			DiagElement element = elements.get(name);
+			if (element == null) {
+				element = new DiagElement(name, currentNetwork());
+				elements.put(name, element);
+			}
+			final Map<String, String> props = toSet(definition);
+			final String description = props.get("description");
+			if (description != null) {
+				element.setDescription(description);
+			}
+			final String shape = props.get("shape");
+			if (shape != null) {
+				element.setShape(shape);
+			}
+			currentNetwork().addElement(element, props);
+		}
+		return CommandExecutionResult.ok();
+	}
+
+	private CommandExecutionResult error() {
+		return CommandExecutionResult.error("");
+	}
+
+	private Map<String, String> toSet(String definition) {
+		final Map<String, String> result = new HashMap<String, String>();
+		if (definition == null) {
+			return result;
+		}
+		final Pattern p = Pattern.compile("\\s*(\\w+)\\s*=\\s*(\"([^\"]*)\"|[^\\s,]+)");
+		final Matcher m = p.matcher(definition);
+		while (m.find()) {
+			final String name = m.group(1);
+			final String value = m.group(3) == null ? m.group(2) : m.group(3);
+			result.put(name, value);
+		}
+		return result;
+
+	}
+
+	@Override
+	protected ImageData exportDiagramInternal(OutputStream os, int index, FileFormatOption fileFormatOption)
+			throws IOException {
+		final Scale scale = getScale();
+
+		final double dpiFactor = scale == null ? 1 : scale.getScale(100, 100);
+		final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), dpiFactor, null, "", "", 0, 0,
+				null, false);
+		final UDrawable result = getUDrawable();
+		imageBuilder.setUDrawable(result);
+
+		return imageBuilder.writeImageTOBEMOVED(fileFormatOption, 0, os);
+	}
+
+	private UDrawable getUDrawable() {
+		return new UDrawable() {
+			public void drawU(UGraphic ug) {
+				drawMe(ug);
+			}
+		};
+	}
+
+	private TextBlock toTextBlock(String name, String s) {
+		if (s != null) {
+			name += "\\n" + s;
+		}
+		return Display.getWithNewlines(name).create(getFontConfiguration(), HorizontalAlignment.RIGHT,
+				new SpriteContainerEmpty());
+	}
+
+	private FontConfiguration getFontConfiguration() {
+		final UFont font = UFont.serif(11);
+		return new FontConfiguration(font, HtmlColorUtils.BLACK, HtmlColorUtils.BLACK, false);
+	}
+
+	private void drawMe(UGraphic ug) {
+		final double margin = 5;
+		ug = ug.apply(new UTranslate(margin, margin));
+
+		final StringBounder stringBounder = ug.getStringBounder();
+		final GridTextBlockDecorated grid = new GridTextBlockDecorated(networks.size(), elements.size(), groups);
+
+		for (int i = 0; i < networks.size(); i++) {
+			final Network current = networks.get(i);
+			final Network next = i + 1 < networks.size() ? networks.get(i + 1) : null;
+			int j = 0;
+			for (Map.Entry<String, DiagElement> ent : elements.entrySet()) {
+				final DiagElement element = ent.getValue();
+				if (element.getMainNetwork() == current && current.constainsLocally(ent.getKey())) {
+					final String ad1 = current.getAdress(element);
+					final String ad2 = next == null ? null : next.getAdress(element);
+					grid.add(i, j, element.asTextBlock(ad1, ad2));
+				}
+				j++;
+			}
+		}
+
+		double deltaX = 0;
+		double deltaY = 0;
+		for (int i = 0; i < networks.size(); i++) {
+			final Network current = networks.get(i);
+			final String address = current.getOwnAdress();
+			final TextBlock desc = toTextBlock(current.getName(), address);
+			final Dimension2D dim = desc.calculateDimension(stringBounder);
+			if (i == 0) {
+				deltaY = (dim.getHeight() - GridTextBlockDecorated.NETWORK_THIN) / 2;
+			}
+			deltaX = Math.max(deltaX, dim.getWidth());
+		}
+		double y = 0;
+		for (int i = 0; i < networks.size(); i++) {
+			final Network current = networks.get(i);
+			final String address = current.getOwnAdress();
+			final TextBlock desc = toTextBlock(current.getName(), address);
+			final Dimension2D dim = desc.calculateDimension(stringBounder);
+			desc.drawU(ug.apply(new UTranslate(deltaX - dim.getWidth(), y)));
+
+			y += grid.lineHeight(stringBounder, i);
+		}
+		deltaX += 5;
+
+		grid.drawU(ug.apply(new UChangeColor(ColorParam.activityBorder.getDefaultValue()))
+				.apply(new UChangeBackColor(ColorParam.activityBackground.getDefaultValue()))
+				.apply(new UTranslate(deltaX, deltaY)));
+		final Dimension2D dimGrid = grid.calculateDimension(stringBounder);
+
+		ug.apply(new UTranslate(dimGrid.getWidth() + deltaX + margin, dimGrid.getHeight() + deltaY + margin)).draw(
+				new UEmpty(1, 1));
+
+	}
+
+	public CommandExecutionResult setProperty(String property, String value) {
+		if (initDone == false) {
+			return error();
+		}
+		if ("address".equalsIgnoreCase(property) && currentNetwork() != null) {
+			currentNetwork().setOwnAdress(value);
+		}
+		if ("color".equalsIgnoreCase(property)) {
+			final HtmlColor color = GridTextBlockDecorated.colors.getColorIfValid(value);
+			if (currentGroup != null) {
+				currentGroup.setColor(color);
+			} else if (currentNetwork() != null) {
+				currentNetwork().setColor(color);
+			}
+		}
+		return CommandExecutionResult.ok();
+	}
+
+	public CommandExecutionResult link() {
+		if (initDone == false) {
+			return error();
+		}
+		return CommandExecutionResult.ok();
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/nwdiag/NwDiagramFactory.java b/src/net/sourceforge/plantuml/nwdiag/NwDiagramFactory.java
new file mode 100644
index 000000000..3dee33be6
--- /dev/null
+++ b/src/net/sourceforge/plantuml/nwdiag/NwDiagramFactory.java
@@ -0,0 +1,67 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.nwdiag;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sourceforge.plantuml.command.Command;
+import net.sourceforge.plantuml.command.UmlDiagramFactory;
+
+public class NwDiagramFactory extends UmlDiagramFactory {
+
+	@Override
+	public NwDiagram createEmptyDiagram() {
+		return new NwDiagram();
+	}
+
+	@Override
+	protected List<Command> createCommands() {
+
+		final List<Command> cmds = new ArrayList<Command>();
+		addCommonCommands(cmds);
+		cmds.add(new CommandNwDiagInit());
+		cmds.add(new CommandComment());
+		cmds.add(new CommandElement());
+		cmds.add(new CommandGroup());
+		cmds.add(new CommandNetwork());
+		cmds.add(new CommandLink());
+		cmds.add(new CommandProperty());
+		cmds.add(new CommandEndSomething());
+		return cmds;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/preproc/DefinesGet.java b/src/net/sourceforge/plantuml/preproc/DefinesGet.java
new file mode 100644
index 000000000..7b2f3bc2d
--- /dev/null
+++ b/src/net/sourceforge/plantuml/preproc/DefinesGet.java
@@ -0,0 +1,58 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.preproc;
+
+public class DefinesGet {
+
+	private final Defines defines;
+
+	public DefinesGet(Defines defines) {
+		this.defines = defines;
+	}
+
+	public final Defines get() {
+		return defines;
+	}
+
+	public void saveState() {
+		this.defines.saveState1();
+	}
+
+	public void restoreState() {
+		this.defines.restoreState1();
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/preproc/ReadLineEmpty.java b/src/net/sourceforge/plantuml/preproc/ReadLineEmpty.java
new file mode 100644
index 000000000..2395f9ec1
--- /dev/null
+++ b/src/net/sourceforge/plantuml/preproc/ReadLineEmpty.java
@@ -0,0 +1,49 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.preproc;
+
+import net.sourceforge.plantuml.CharSequence2;
+
+public class ReadLineEmpty implements ReadLine {
+
+	public void close() {
+	}
+
+	public CharSequence2 readLine() {
+		return null;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/preproc2/PreprocessorIncludeStrategy.java b/src/net/sourceforge/plantuml/preproc2/PreprocessorIncludeStrategy.java
new file mode 100644
index 000000000..144b55ff0
--- /dev/null
+++ b/src/net/sourceforge/plantuml/preproc2/PreprocessorIncludeStrategy.java
@@ -0,0 +1,49 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * Modified by: Nicolas Jouanin
+ * 
+ *
+ */
+package net.sourceforge.plantuml.preproc2;
+
+public enum PreprocessorIncludeStrategy {
+	ONCE, MANY;
+
+	public static PreprocessorIncludeStrategy fromString(String group) {
+		if ("once".equalsIgnoreCase(group)) {
+			return ONCE;
+		}
+		return MANY;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/project3/Moment.java b/src/net/sourceforge/plantuml/project3/Moment.java
new file mode 100644
index 000000000..99525f154
--- /dev/null
+++ b/src/net/sourceforge/plantuml/project3/Moment.java
@@ -0,0 +1,44 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.project3;
+
+public interface Moment {
+
+	public Instant getStart();
+
+	public Instant getEnd();
+
+}
diff --git a/src/net/sourceforge/plantuml/project3/MomentImpl.java b/src/net/sourceforge/plantuml/project3/MomentImpl.java
new file mode 100644
index 000000000..0c9888bdb
--- /dev/null
+++ b/src/net/sourceforge/plantuml/project3/MomentImpl.java
@@ -0,0 +1,56 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ * 
+ *
+ */
+package net.sourceforge.plantuml.project3;
+
+public class MomentImpl implements Moment {
+
+	private final Instant start;
+	private final Instant end;
+
+	public MomentImpl(Instant start, Instant end) {
+		this.start = start;
+		this.end = end;
+	}
+
+	public Instant getStart() {
+		return start;
+	}
+
+	public Instant getEnd() {
+		return end;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/version/LicenseType.java b/src/net/sourceforge/plantuml/version/LicenseType.java
new file mode 100644
index 000000000..2288596a6
--- /dev/null
+++ b/src/net/sourceforge/plantuml/version/LicenseType.java
@@ -0,0 +1,54 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.version;
+
+public enum LicenseType {
+
+	NONE, NAMED, DISTRIBUTOR, UNKNOWN;
+
+	public static LicenseType fromInt(int type) {
+		if (type == -1) {
+			return NONE;
+		}
+		if (type == 0) {
+			return NAMED;
+		}
+		if (type == 2) {
+			return DISTRIBUTOR;
+		}
+		return UNKNOWN;
+	}
+
+}
diff --git a/src/net/sourceforge/plantuml/version/PSystemKeycheck.java b/src/net/sourceforge/plantuml/version/PSystemKeycheck.java
new file mode 100644
index 000000000..17bad33e5
--- /dev/null
+++ b/src/net/sourceforge/plantuml/version/PSystemKeycheck.java
@@ -0,0 +1,154 @@
+/* ========================================================================
+ * PlantUML : a free UML diagram generator
+ * ========================================================================
+ *
+ * (C) Copyright 2009-2017, Arnaud Roques
+ *
+ * Project Info:  http://plantuml.com
+ * 
+ * If you like this project or if you find it useful, you can support us at:
+ * 
+ * http://plantuml.com/patreon (only 1$ per month!)
+ * http://plantuml.com/paypal
+ * 
+ * This file is part of PlantUML.
+ *
+ * PlantUML is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * PlantUML distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+ * USA.
+ *
+ *
+ * Original Author:  Arnaud Roques
+ *
+ */
+package net.sourceforge.plantuml.version;
+
+import java.awt.Color;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.prefs.BackingStoreException;
+
+import net.sourceforge.plantuml.AbstractPSystem;
+import net.sourceforge.plantuml.FileFormatOption;
+import net.sourceforge.plantuml.OptionFlags;
+import net.sourceforge.plantuml.SignatureUtils;
+import net.sourceforge.plantuml.core.DiagramDescription;
+import net.sourceforge.plantuml.core.ImageData;
+import net.sourceforge.plantuml.flashcode.FlashCodeFactory;
+import net.sourceforge.plantuml.flashcode.FlashCodeUtils;
+import net.sourceforge.plantuml.graphic.GraphicStrings;
+import net.sourceforge.plantuml.graphic.HtmlColorUtils;
+import net.sourceforge.plantuml.graphic.TextBlock;
+import net.sourceforge.plantuml.graphic.UDrawable;
+import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
+import net.sourceforge.plantuml.ugraphic.ImageBuilder;
+import net.sourceforge.plantuml.ugraphic.UGraphic;
+import net.sourceforge.plantuml.ugraphic.UImage;
+import net.sourceforge.plantuml.ugraphic.UTranslate;
+
+public class PSystemKeycheck extends AbstractPSystem {
+
+	final private String key;
+	final private String sig;
+
+	public PSystemKeycheck(String sig, String key) {
+		this.sig = sig;
+		this.key = key;
+	}
+
+	@Override
+	final protected ImageData exportDiagramNow(OutputStream os, int num, FileFormatOption fileFormat, long seed)
+			throws IOException {
+		final ImageBuilder imageBuilder = new ImageBuilder(new ColorMapperIdentity(), 1.0, HtmlColorUtils.WHITE,
+				getMetadata(), null, 0, 0, null, false);
+
+		imageBuilder.setUDrawable(new UDrawable() {
+			public void drawU(UGraphic ug) {
+				try {
+					drawInternal(ug);
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		});
+		return imageBuilder.writeImageTOBEMOVED(fileFormat, seed, os);
+	}
+
+	public DiagramDescription getDescription() {
+		return new DiagramDescription("(Key)");
+	}
+
+	private void drawInternal(UGraphic ug) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
+		final List<String> strings = header();
+		try {
+			final LicenseInfo info = LicenseInfo.retrieveNamed(sig, key, false);
+			strings.add("<u>Provided license information</u>:");
+			License.addLicenseInfo(strings, info);
+			strings.add(" ");
+		} catch (Exception e) {
+			e.printStackTrace();
+			strings.add("<i>Error:</i> " + e);
+		}
+
+		final TextBlock disp = GraphicStrings.createBlackOnWhite(strings);
+		disp.drawU(ug);
+	}
+
+	private ArrayList<String> header() {
+		final ArrayList<String> strings = new ArrayList<String>();
+		strings.add("<b>PlantUML version " + Version.versionString() + "</b> (" + Version.compileTimeString() + ")");
+		strings.add("(" + License.getCurrent() + " source distribution)");
+		if (OptionFlags.ALLOW_INCLUDE) {
+			strings.add("Loaded from " + Version.getJarPath());
+		}
+		strings.add(" ");
+		return strings;
+	}
+
+	private void drawFlash(UGraphic ug, LicenseInfo info) throws IOException {
+		final List<String> strings = header();
+		strings.add("To get your <i>Professional Edition License</i>,");
+		strings.add("please send this qrcode to <b>plantuml@gmail.com</b> :");
+
+		TextBlock disp = GraphicStrings.createBlackOnWhite(strings);
+		disp.drawU(ug);
+
+		ug = ug.apply(new UTranslate(0, disp.calculateDimension(ug.getStringBounder()).getHeight()));
+		final FlashCodeUtils utils = FlashCodeFactory.getFlashCodeUtils();
+		final BufferedImage im = utils.exportFlashcode(
+				Version.versionString() + "\n" + SignatureUtils.toHexString(Magic.signature()), Color.BLACK,
+				Color.WHITE);
+		if (im != null) {
+			final UImage flash = new UImage(im).scaleNearestNeighbor(4);
+			ug.draw(flash);
+			ug = ug.apply(new UTranslate(0, flash.getHeight()));
+		}
+
+		if (info.isNone() == false) {
+			strings.clear();
+			strings.add("<u>Installed license</u>:");
+			License.addLicenseInfo(strings, info);
+			strings.add(" ");
+			disp = GraphicStrings.createBlackOnWhite(strings);
+			disp.drawU(ug);
+		}
+
+	}
+}
diff --git a/src/net/sourceforge/plantuml/version/arecibo.png b/src/net/sourceforge/plantuml/version/arecibo.png
new file mode 100644
index 000000000..d509fce87
Binary files /dev/null and b/src/net/sourceforge/plantuml/version/arecibo.png differ
diff --git a/src/net/sourceforge/plantuml/version/time01.png b/src/net/sourceforge/plantuml/version/time01.png
new file mode 100644
index 000000000..20359077f
Binary files /dev/null and b/src/net/sourceforge/plantuml/version/time01.png differ
diff --git a/src/net/sourceforge/plantuml/version/time15.png b/src/net/sourceforge/plantuml/version/time15.png
new file mode 100644
index 000000000..8f4a6a0fd
Binary files /dev/null and b/src/net/sourceforge/plantuml/version/time15.png differ