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;
+}