diff --git a/.gitmodules b/.gitmodules
index 457a0be6..262501a5 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
-[submodule "tools/font8x8"]
- path = tools/font8x8
- url = https://github.com/dhepper/font8x8
[submodule "tools/8x8fonts/font8x8"]
path = tools/8x8fonts/font8x8
url = https://github.com/dhepper/font8x8
diff --git a/tools/8x8fonts/.gitignore b/tools/8x8fonts/.gitignore
new file mode 100644
index 00000000..64a2ee78
--- /dev/null
+++ b/tools/8x8fonts/.gitignore
@@ -0,0 +1,2 @@
+*.o
+generate_png_fonts
diff --git a/tools/8x8fonts/Makefile b/tools/8x8fonts/Makefile
new file mode 100644
index 00000000..dbc1d470
--- /dev/null
+++ b/tools/8x8fonts/Makefile
@@ -0,0 +1,43 @@
+# There is no uname under windows, but we can guess we are there with the COMSPEC env.var
+# Windows specific
+ifdef ComSpec
+# sometimes, it is ComSpec, sometimes it is COMSPEC
+COMSPEC = $(ComSpec)
+endif
+ifdef COMSPEC
+WIN32 = 1
+endif
+
+PKG_CONFIG = $(shell which pkg-config)
+MKDIR = mkdir -p
+
+ifeq ($(WIN32),1)
+PKG_CONFIG := PKG_CONFIG_PATH=../../3rdparty/usr-win32/lib/pkgconfig $(PKG_CONFIG)
+endif
+
+CFLAGS = -Wall
+CFLAGS += $(shell $(PKG_CONFIG) --cflags libpng)
+LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libpng)
+LDLIBS += $(shell $(PKG_CONFIG) --libs-only-l libpng)
+
+FONTDIR = ../../share/grafx2/skins/
+FONTFILES = unicode_0390-03C9.png unicode_3040-309F.png
+FONTPATHS = $(addprefix $(FONTDIR), $(FONTFILES))
+
+BINDIR = ../../bin
+BIN = $(BINDIR)/generate_png_fonts
+
+.PHONY: all clean
+
+all: $(FONTPATHS)
+
+clean:
+ $(RM) *.o $(BIN)
+ $(RM) $(FONTPATHS)
+
+$(BIN): generate_png_fonts.o
+ $(MKDIR) $(BINDIR)
+ $(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) $(LDLIBS)
+
+$(FONTPATHS): $(BIN)
+ $(BIN) $(FONTDIR)
diff --git a/tools/8x8fonts/generate_png_fonts.c b/tools/8x8fonts/generate_png_fonts.c
new file mode 100644
index 00000000..9caad906
--- /dev/null
+++ b/tools/8x8fonts/generate_png_fonts.c
@@ -0,0 +1,142 @@
+/* vim:expandtab:ts=2 sw=2:
+*/
+/* Grafx2 - The Ultimate 256-color bitmap paint program
+
+ Copyright 2019 Thomas Bernard
+
+ Grafx2 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; version 2
+ of the License.
+
+ Grafx2 is 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 Grafx2; if not, see
+*/
+
+#include
+#include
+#include
+
+#include
+#include
+
+#include "font8x8/font8x8_greek.h"
+#include "font8x8/font8x8_hiragana.h"
+
+#define GENERATE_PNG(font, start) generate_png_font(directory, (const char *)font, start, sizeof(font) / 8)
+
+int generate_png_font(const char * directory, const char * font, unsigned int start, size_t count)
+{
+ char filename[256];
+ FILE * fp;
+ png_structp png;
+ png_infop info;
+ unsigned int width = 256; // 32 chars
+ unsigned int height;
+ unsigned int end = start + count - 1;
+ unsigned char * pixels;
+ unsigned int c, l, b, x, y;
+ png_color palette[2] = { { 0, 0, 192}, {255, 255, 255} };
+
+ snprintf(filename, sizeof(filename), "%sunicode_%04X-%04X.png",
+ directory, start, end);
+ printf("writing %s\n", filename);
+ height = 8 * ((count + 31) >> 5);
+ printf(" size : %dx%d\n", width, height);
+ pixels = malloc(width * height);
+ if (pixels == NULL)
+ {
+ fprintf(stderr, "Failed to allocate %d bytes\n", width * height);
+ return -1;
+ }
+ memset(pixels, 0, width * height);
+
+ // generate the bitmap
+ for (c = 0; c < count; c++)
+ {
+ x = (c & 31) << 3;
+ y = (c >> 5) << 3;
+ for (l = 0; l < 8; l++)
+ {
+ int data = font[8*c + l];
+ for (b = 0; b < 8; b++)
+ {
+ if (data & 1)
+ pixels[((y + l) << 8) + x + b] = 1;
+ data >>= 1;
+ }
+ }
+ }
+
+ // write to file
+ fp = fopen(filename, "wb");
+ if (fp == NULL)
+ {
+ free(pixels);
+ return -1;
+ }
+ png = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+ (png_voidp)NULL/*user_error_ptr*/,
+ /*user_error_fn*/NULL, /*user_warning_fn*/NULL);
+ if (png == NULL)
+ {
+ return -1;
+ }
+ info = png_create_info_struct(png);
+ if (info == NULL)
+ {
+ png_destroy_write_struct(&png, NULL);
+ return -1;
+ }
+ if (setjmp(png_jmpbuf(png)))
+ {
+ png_destroy_write_struct(&png, &info);
+ fclose(fp);
+ free(pixels);
+ return -1;
+ }
+ png_init_io(png, fp);
+ /* Set the zlib compression level */
+ png_set_compression_level(png, Z_BEST_COMPRESSION);
+ /* Set PNG header */
+ png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_PALETTE,
+ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
+ PNG_FILTER_TYPE_DEFAULT);
+ /* Set palette */
+ png_set_PLTE(png, info, palette, 2);
+
+ png_write_info(png, info);
+ for (y = 0; y < height; y++)
+ png_write_row(png, pixels + (y << 8));
+ png_write_end(png, info);
+ //png_write_flush(png);
+
+ png_destroy_write_struct(&png, &info);
+ fclose(fp);
+ free(pixels);
+ return 0;
+}
+
+int main(int argc, char * * argv)
+{
+ const char * directory = "./";
+ int r;
+
+ printf("GrafX2 unicode font generator\n");
+ if (argc > 1)
+ directory = argv[1];
+
+ r = GENERATE_PNG(font8x8_greek, 0x0390);
+ if (r != 0)
+ return r;
+ r = GENERATE_PNG(font8x8_hiragana, 0x3040);
+ if (r != 0)
+ return r;
+
+ return 0;
+}