diff --git a/documentation/src/common.dox b/documentation/src/common.dox
index dc8843eeeba5c08139288cd4dcd9d8ae1fc8d1a4..5677bb5e545e716157df26e91e3109b59ac01940 100644
--- a/documentation/src/common.dox
+++ b/documentation/src/common.dox
@@ -601,9 +601,9 @@ needs no additional maintenance. It is also C++98 compatible. For example:
 \code
 #include <FL/fl_callback_macros.H>
 ...
-Fl_String *str = new Fl_String("FLTK");
+std::string *str = new std::string("FLTK");
 Fl_Button *btn = new Fl_Button(10, 10, 100, 100);
-FL_METHOD_CALLBACK_2(btn,  Fl_String, str, insert,  int, 2,  const char*, "...");
+FL_METHOD_CALLBACK_2(btn,  std::string, str, insert,  int, 2,  const char*, "...");
 ...
 Fl_Button *inline_cb_btn_2 = new Fl_Button(390, 60, 180, 25, "2 args");
 FL_INLINE_CALLBACK_2( inline_cb_btn_2,
diff --git a/fluid/ExternalCodeEditor_UNIX.h b/fluid/ExternalCodeEditor_UNIX.h
index a619cd352abdf2894c6a4b8efef7c01dac0e91d8..9d49cf617afd972c631df49ef788c82e74c01eda 100644
--- a/fluid/ExternalCodeEditor_UNIX.h
+++ b/fluid/ExternalCodeEditor_UNIX.h
@@ -24,7 +24,7 @@ class ExternalCodeEditor {
   time_t file_mtime_;                   // last modify time of the file (used to determine if file changed)
   size_t file_size_;                    // last file size (used to determine if changed)
   const char *filename_;
-  Fl_String command_line_;
+  std::string command_line_;
   int last_error_;
   int alert_pipe_[2];
   bool alert_pipe_open_;
diff --git a/fluid/Fd_Snap_Action.cxx b/fluid/Fd_Snap_Action.cxx
index ce3d6f08290adaeb66ba42200e83803eade58934..1e9fee1a318b462599105b9e300844a3e9f000ea 100644
--- a/fluid/Fd_Snap_Action.cxx
+++ b/fluid/Fd_Snap_Action.cxx
@@ -18,7 +18,6 @@
 
 #include "Fl_Group_Type.h"
 #include "settings_panel.h"
-#include "shell_command.h"  // get and set Fl_String preferences
 #include "file.h"
 
 #include <FL/fl_draw.H>
@@ -388,7 +387,7 @@ void Fd_Layout_Suite::read(Fd_Project_Reader *in) {
  Also updates the FLUID user interface.
  */
 void Fd_Layout_Suite::update_label() {
-  Fl_String sym;
+  std::string sym;
   switch (storage_) {
     case FD_STORE_INTERNAL: sym.assign("@fd_beaker  "); break;
     case FD_STORE_USER: sym.assign("@fd_user  "); break;
@@ -650,7 +649,7 @@ void Fd_Layout_List::update_menu_labels() {
 /**
  Load all user layouts from the FLUID user preferences.
  */
-int Fd_Layout_List::load(const Fl_String &filename) {
+int Fd_Layout_List::load(const std::string &filename) {
   remove_all(FD_STORE_FILE);
   Fl_Preferences prefs(filename.c_str(), "layout.fluid.fltk.org", NULL, Fl_Preferences::C_LOCALE);
   read(prefs, FD_STORE_FILE);
@@ -660,7 +659,7 @@ int Fd_Layout_List::load(const Fl_String &filename) {
 /**
  Save all user layouts to the FLUID user preferences.
  */
-int Fd_Layout_List::save(const Fl_String &filename) {
+int Fd_Layout_List::save(const std::string &filename) {
   assert(this);
   Fl_Preferences prefs(filename.c_str(), "layout.fluid.fltk.org", NULL, (Fl_Preferences::Root)(Fl_Preferences::C_LOCALE|Fl_Preferences::CLEAR));
   prefs.clear();
@@ -691,7 +690,7 @@ void Fd_Layout_List::write(Fl_Preferences &prefs, Fd_Tool_Store storage) {
  */
 void Fd_Layout_List::read(Fl_Preferences &prefs, Fd_Tool_Store storage) {
   Fl_Preferences prefs_list(prefs, "Layouts");
-  Fl_String cs;
+  std::string cs;
   int cp = 0;
   preferences_get(prefs_list, "current_suite", cs, "");
   prefs_list.get("current_preset", cp, 0);
@@ -741,7 +740,7 @@ void Fd_Layout_List::read(Fd_Project_Reader *in) {
   const char *key;
   key = in->read_word(1);
   if (key && !strcmp(key, "{")) {
-    Fl_String cs;
+    std::string cs;
     int cp = 0;
     for (;;) {
       key = in->read_word();
@@ -786,7 +785,7 @@ void Fd_Layout_List::current_suite(int ix) {
  \param[in] arg_name name of the selected suite
  \return if no name is given or the name is not found, keep the current suite selected
  */
-void Fd_Layout_List::current_suite(Fl_String arg_name) {
+void Fd_Layout_List::current_suite(std::string arg_name) {
   if (arg_name.empty()) return;
   for (int i = 0; i < list_size_; ++i) {
     Fd_Layout_Suite &suite = list_[i];
diff --git a/fluid/Fd_Snap_Action.h b/fluid/Fd_Snap_Action.h
index 5b3731087de4799b91ac1083685834ce4b85bae4..bfb32624cb8259f88b9aa43e53857770ad51307e 100644
--- a/fluid/Fd_Snap_Action.h
+++ b/fluid/Fd_Snap_Action.h
@@ -119,7 +119,7 @@ public:
   bool list_is_static_;
   int current_suite_;
   int current_preset_;
-  Fl_String filename_;
+  std::string filename_;
 public:
   Fd_Layout_List();
   ~Fd_Layout_List();
@@ -127,7 +127,7 @@ public:
   void update_menu_labels();
   int current_suite() const { return current_suite_; }
   void current_suite(int ix);
-  void current_suite(Fl_String);
+  void current_suite(std::string);
   int current_preset() const { return current_preset_; }
   void current_preset(int ix);
   Fd_Layout_Suite &operator[](int ix) { return list_[ix]; }
@@ -135,8 +135,8 @@ public:
   void rename(const char *name);
   void capacity(int);
 
-  int load(const Fl_String &filename);
-  int save(const Fl_String &filename);
+  int load(const std::string &filename);
+  int save(const std::string &filename);
   void write(Fl_Preferences &prefs, Fd_Tool_Store storage);
   void read(Fl_Preferences &prefs, Fd_Tool_Store storage);
   void write(Fd_Project_Writer*);
diff --git a/fluid/autodoc.cxx b/fluid/autodoc.cxx
index ef022790bbd732ddbd918a6d86b0e1eaf88e6caf..a6c7f2fc50e678ffd0b899856df9a60a401846f3 100644
--- a/fluid/autodoc.cxx
+++ b/fluid/autodoc.cxx
@@ -368,7 +368,7 @@ int fl_snapshot(const char *filename, Fl_Widget *w,
 /** @} */
 
 
-void run_autodoc(const Fl_String &target_dir) {
+void run_autodoc(const std::string &target_dir) {
   // A list of all the margins we will use later
   Fl_Margin win_margin(0, 0, 0, 0);
   Fl_Margin win_blend(10, 10, 10, 10);
diff --git a/fluid/autodoc.h b/fluid/autodoc.h
index 060b166abf5a6b78a0ba67db8ecfd5ffee71cc3f..1d6ec621b1a3bfd9fd4684824c1373b7c2847f08 100644
--- a/fluid/autodoc.h
+++ b/fluid/autodoc.h
@@ -53,7 +53,7 @@ extern const int FL_SNAP_TO_WINDOW;
 
 extern Fl_Widget *FL_SNAP_AREA_CLEAR;
 
-extern void run_autodoc(const Fl_String &target_dir);
+extern void run_autodoc(const std::string &target_dir);
 
 #endif
 
diff --git a/fluid/code.cxx b/fluid/code.cxx
index af8dba5048788f8b365f14f5f47ccadbbfc6d370..0e715441a2cd27fb0c6fa5f875e86d61e494bc2b 100644
--- a/fluid/code.cxx
+++ b/fluid/code.cxx
@@ -85,7 +85,7 @@ int write_escaped_strings(FILE *out, const char *text) {
  \param[in] filename file path and name to a file that will hold the strings
  \return 1 if the file could not be opened for writing, or the result of `fclose`.
  */
-int write_strings(const Fl_String &filename) {
+int write_strings(const std::string &filename) {
   Fl_Type *p;
   Fl_Widget_Type *w;
   int i;
@@ -797,7 +797,7 @@ int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_codeview) {
   }
   // Remember the last code file location for MergeBack
   if (s && g_project.write_mergeback_data && !to_codeview) {
-    Fl_String proj_filename = g_project.projectfile_path() + g_project.projectfile_name();
+    std::string proj_filename = g_project.projectfile_path() + g_project.projectfile_name();
     int i, n = proj_filename.size();
     for (i=0; i<n; i++) if (proj_filename[i]=='\\') proj_filename[i] = '/';
     Fl_Preferences build_records(Fl_Preferences::USER_L, "fltk.org", "fluid-build");
@@ -848,7 +848,7 @@ int Fd_Code_Writer::write_code(const char *s, const char *t, bool to_codeview) {
       write_c("#include \"%s\"\n", g_project.header_file_name.c_str());
     }
   }
-  Fl_String loc_include, loc_conditional;
+  std::string loc_include, loc_conditional;
   if (g_project.i18n_type==FD_I18N_GNU) {
     loc_include = g_project.i18n_gnu_include;
     loc_conditional = g_project.i18n_gnu_conditional;
diff --git a/fluid/code.h b/fluid/code.h
index dba552e4d0bbec3bb6bce6d5b7f490ceafe7a45f..84d6a4218752444cd9bffcf4543e9182845e7797 100644
--- a/fluid/code.h
+++ b/fluid/code.h
@@ -29,7 +29,7 @@ struct Fd_Text_Tree;
 struct Fd_Pointer_Tree;
 
 int is_id(char c);
-int write_strings(const Fl_String &filename);
+int write_strings(const std::string &filename);
 
 class Fd_Code_Writer
 {
diff --git a/fluid/codeview_panel.cxx b/fluid/codeview_panel.cxx
index 0c46696e375eadfb2335f09e37fe315758008858..78674a7d80e0737a1452287abcf0afc4f421a461 100644
--- a/fluid/codeview_panel.cxx
+++ b/fluid/codeview_panel.cxx
@@ -182,9 +182,9 @@ void update_codeview_cb(class Fl_Button*, void*) {
       cv_strings->buffer()->loadfile(fn);
       cv_strings->scroll(top, 0);
     } else if (cv_source->visible_r() || cv_header->visible_r()) {
-      Fl_String code_file_name_bak = g_project.code_file_name;
+      std::string code_file_name_bak = g_project.code_file_name;
       g_project.code_file_name = cv_source_filename;
-      Fl_String header_file_name_bak = g_project.header_file_name;
+      std::string header_file_name_bak = g_project.header_file_name;
       g_project.header_file_name = cv_header_filename;
 
       // generate the code and load the files
diff --git a/fluid/codeview_panel.fl b/fluid/codeview_panel.fl
index 80f74f13feee8dc29138aa313880ab993bdae9e8..5417ad9c7e50c9a039a9eecbf0d3bc10736feb5e 100644
--- a/fluid/codeview_panel.fl
+++ b/fluid/codeview_panel.fl
@@ -203,9 +203,9 @@ and load those into the Code Viewer widgets.} open return_type void
     cv_strings->buffer()->loadfile(fn);
     cv_strings->scroll(top, 0);
   } else if (cv_source->visible_r() || cv_header->visible_r()) {
-    Fl_String code_file_name_bak = g_project.code_file_name;
+    std::string code_file_name_bak = g_project.code_file_name;
     g_project.code_file_name = cv_source_filename;
-    Fl_String header_file_name_bak = g_project.header_file_name;
+    std::string header_file_name_bak = g_project.header_file_name;
     g_project.header_file_name = cv_header_filename;
 
     // generate the code and load the files
diff --git a/fluid/fluid.cxx b/fluid/fluid.cxx
index c8b2292d1ff27cb952686d9b5317fb110da10a99..e6520b6c0bd935ff0088c489757051ddf74cd399 100644
--- a/fluid/fluid.cxx
+++ b/fluid/fluid.cxx
@@ -148,7 +148,7 @@ int modflag_c = 0;
 
 /// Application work directory, stored here when temporarily changing to the source code directory.
 /// \see goto_source_dir()
-static Fl_String app_work_dir;
+static std::string app_work_dir;
 
 /// Used as a counter to set the .fl project dir as the current directory.
 /// \see enter_project_dir(), leave_project_dir()
@@ -170,20 +170,20 @@ int show_version = 0;        // fluid -v
 int batch_mode = 0;             // if set (-c, -u) don't open display
 
 /// command line arguments that overrides the generate code file extension or name
-Fl_String g_code_filename_arg;
+std::string g_code_filename_arg;
 
 /// command line arguments that overrides the generate header file extension or name
-Fl_String g_header_filename_arg;
+std::string g_header_filename_arg;
 
 /// current directory path at application launch
-Fl_String g_launch_path;
+std::string g_launch_path;
 
 /// if set, generate images for automatic documentation in this directory
-Fl_String g_autodoc_path;
+std::string g_autodoc_path;
 
 /// path to store temporary files during app run
 /// \see tmpdir_create_called
-Fl_String tmpdir_path;
+std::string tmpdir_path;
 
 /// true if the temporary file path was already created
 /// \see tmpdir_path
@@ -267,7 +267,7 @@ void Fluid_Project::update_settings_dialog() {
  \param[in] str directory or path name
  \return a new string, ending with a '/'
  */
-static Fl_String end_with_slash(const Fl_String &str) {
+static std::string end_with_slash(const std::string &str) {
   char last = str[str.size()-1];
   if (last !='/' && last != '\\')
     return str + "/";
@@ -293,7 +293,7 @@ static void create_tmpdir() {
   //    C:/Windows/Temp/
   //    C:\Users\<username>\AppData\Local\Temp
   fl_snprintf(buf, sizeof(buf)-1, "fluid-%d/", (long)GetCurrentProcessId());
-  Fl_String name = buf;
+  std::string name = buf;
   wchar_t tempdirW[FL_PATH_MAX+1];
   char tempdir[FL_PATH_MAX+1];
   unsigned len = GetTempPathW(FL_PATH_MAX, tempdirW);
@@ -303,15 +303,15 @@ static void create_tmpdir() {
     unsigned wn = fl_utf8fromwc(tempdir, FL_PATH_MAX, tempdirW, len);
     tempdir[wn] = 0;
   }
-  Fl_String path = tempdir;
+  std::string path = tempdir;
   end_with_slash(path);
   path += name;
   fl_make_path(path.c_str());
   if (fl_access(path.c_str(), 6) == 0) tmpdir_path = path;
 #else
   fl_snprintf(buf, sizeof(buf)-1, "fluid-%d/", getpid());
-  Fl_String name = buf;
-  Fl_String path = fl_getenv("TMPDIR");
+  std::string name = buf;
+  std::string path = fl_getenv("TMPDIR");
   if (!path.empty()) {
     end_with_slash(path);
     path += name;
@@ -319,7 +319,7 @@ static void create_tmpdir() {
     if (fl_access(path.c_str(), 6) == 0) tmpdir_path = path;
   }
   if (tmpdir_path.empty()) {
-    path = Fl_String("/tmp/") + name;
+    path = std::string("/tmp/") + name;
     fl_make_path(path.c_str());
     if (fl_access(path.c_str(), 6) == 0) tmpdir_path = path;
   }
@@ -327,7 +327,7 @@ static void create_tmpdir() {
   if (tmpdir_path.empty()) {
     char pbuf[FL_PATH_MAX+1];
     fluid_prefs.get_userdata_path(pbuf, FL_PATH_MAX);
-    path = Fl_String(pbuf);
+    path = std::string(pbuf);
     end_with_slash(path);
     path += name;
     fl_make_path(path.c_str());
@@ -357,7 +357,7 @@ static void delete_tmpdir() {
   int n_de = fl_filename_list(tmpdir_path.c_str(), &de);
   if (n_de >= 0) {
     for (int i=0; i<n_de; i++) {
-      Fl_String path = tmpdir_path + de[i]->d_name;
+      std::string path = tmpdir_path + de[i]->d_name;
       fl_unlink(path.c_str());
     }
     fl_filename_free_list(&de, n_de);
@@ -379,7 +379,7 @@ static void delete_tmpdir() {
  \return the path to the temporary directory, ending in a '/', or and empty
       string if no directory could be created.
  */
-const Fl_String &get_tmpdir() {
+const std::string &get_tmpdir() {
   if (!tmpdir_create_called)
     create_tmpdir();
   return tmpdir_path;
@@ -465,7 +465,7 @@ void enter_project_dir() {
   // store the current working directory for later
   app_work_dir = fl_getcwd();
   // set the current directory to the path of our .fl file
-  Fl_String project_path = fl_filename_path(fl_filename_absolute(filename));
+  std::string project_path = fl_filename_path(fl_filename_absolute(filename));
   if (fl_chdir(project_path.c_str()) == -1) {
     fprintf(stderr, "** Fluid internal error: enter_project_dir() can't chdir to %s: %s\n",
             project_path.c_str(), strerror(errno));
@@ -610,7 +610,7 @@ void save_cb(Fl_Widget *, void *v) {
     if (fnfc.show() != 0) return;
     c = fnfc.filename();
     if (!fl_access(c, 0)) {
-      Fl_String basename = fl_filename_name(Fl_String(c));
+      std::string basename = fl_filename_name(std::string(c));
       if (fl_choice("The file \"%s\" already exists.\n"
                     "Do you want to replace it?", "Cancel",
                     "Replace", NULL, basename.c_str()) == 0) return;
@@ -972,19 +972,19 @@ bool new_project_from_template() {
  \param title a text describing the action after selecting a file (load, merge, ...)
  \return the file path and name, or an empty string if the operation was canceled
  */
-Fl_String open_project_filechooser(const Fl_String &title) {
+std::string open_project_filechooser(const std::string &title) {
   Fl_Native_File_Chooser dialog;
   dialog.title(title.c_str());
   dialog.type(Fl_Native_File_Chooser::BROWSE_FILE);
   dialog.filter("FLUID Files\t*.f[ld]\n");
   if (filename) {
-    Fl_String current_project_file = filename;
+    std::string current_project_file = filename;
     dialog.directory(fl_filename_path(current_project_file).c_str());
     dialog.preset_file(fl_filename_name(current_project_file).c_str());
   }
   if (dialog.show() != 0)
-    return Fl_String();
-  return Fl_String(dialog.filename());
+    return std::string();
+  return std::string(dialog.filename());
 }
 
 /**
@@ -997,12 +997,12 @@ Fl_String open_project_filechooser(const Fl_String &title) {
  \param[in] filename_arg path and name of the new project file
  \return false if the operation failed
  */
-bool merge_project_file(const Fl_String &filename_arg) {
+bool merge_project_file(const std::string &filename_arg) {
   bool is_a_merge = (Fl_Type::first != NULL);
-  Fl_String title = is_a_merge ? "Merge Project File" : "Open Project File";
+  std::string title = is_a_merge ? "Merge Project File" : "Open Project File";
 
   // ask for a filename if none was given
-  Fl_String new_filename = filename_arg;
+  std::string new_filename = filename_arg;
   if (new_filename.empty()) {
     new_filename = open_project_filechooser(title);
     if (new_filename.empty()) {
@@ -1052,13 +1052,13 @@ bool merge_project_file(const Fl_String &filename_arg) {
  \param[in] filename_arg load from this file, or show file chooser if empty
  \return false if the operation was canceled or failed otherwise
  */
-bool open_project_file(const Fl_String &filename_arg) {
+bool open_project_file(const std::string &filename_arg) {
   // verify user intention
   if (confirm_project_clear() == false)
     return false;
 
   // ask for a filename if none was given
-  Fl_String new_filename = filename_arg;
+  std::string new_filename = filename_arg;
   if (new_filename.empty()) {
     new_filename = open_project_filechooser("Open Project File");
     if (new_filename.empty()) {
@@ -1078,7 +1078,7 @@ bool open_project_file(const Fl_String &filename_arg) {
  \param[in] c the filename of the new design
  */
 void apple_open_cb(const char *c) {
-  open_project_file(Fl_String(c));
+  open_project_file(std::string(c));
 }
 #endif // __APPLE__
 
@@ -1086,7 +1086,7 @@ void apple_open_cb(const char *c) {
  Get the absolute path of the project file, for example `/Users/matt/dev/`.
  \return the path ending in '/'
  */
-Fl_String Fluid_Project::projectfile_path() const {
+std::string Fluid_Project::projectfile_path() const {
   return end_with_slash(fl_filename_absolute(fl_filename_path(filename), g_launch_path));
 }
 
@@ -1094,7 +1094,7 @@ Fl_String Fluid_Project::projectfile_path() const {
  Get the project file name including extension, for example `test.fl`.
  \return the file name without path
  */
-Fl_String Fluid_Project::projectfile_name() const {
+std::string Fluid_Project::projectfile_name() const {
   return fl_filename_name(filename);
 }
 
@@ -1102,8 +1102,8 @@ Fl_String Fluid_Project::projectfile_name() const {
  Get the absolute path of the generated C++ code file, for example `/Users/matt/dev/src/`.
  \return the path ending in '/'
  */
-Fl_String Fluid_Project::codefile_path() const {
-  Fl_String path = fl_filename_path(code_file_name);
+std::string Fluid_Project::codefile_path() const {
+  std::string path = fl_filename_path(code_file_name);
   if (batch_mode)
     return end_with_slash(fl_filename_absolute(path, g_launch_path));
   else
@@ -1114,8 +1114,8 @@ Fl_String Fluid_Project::codefile_path() const {
  Get the generated C++ code file name including extension, for example `test.cxx`.
  \return the file name without path
  */
-Fl_String Fluid_Project::codefile_name() const {
-  Fl_String name = fl_filename_name(code_file_name);
+std::string Fluid_Project::codefile_name() const {
+  std::string name = fl_filename_name(code_file_name);
   if (name.empty()) {
     return fl_filename_setext(fl_filename_name(filename), ".cxx");
   } else if (name[0] == '.') {
@@ -1129,8 +1129,8 @@ Fl_String Fluid_Project::codefile_name() const {
  Get the absolute path of the generated C++ header file, for example `/Users/matt/dev/src/`.
  \return the path ending in '/'
  */
-Fl_String Fluid_Project::headerfile_path() const {
-  Fl_String path = fl_filename_path(header_file_name);
+std::string Fluid_Project::headerfile_path() const {
+  std::string path = fl_filename_path(header_file_name);
   if (batch_mode)
     return end_with_slash(fl_filename_absolute(path, g_launch_path));
   else
@@ -1141,8 +1141,8 @@ Fl_String Fluid_Project::headerfile_path() const {
  Get the generated C++ header file name including extension, for example `test.cxx`.
  \return the file name without path
  */
-Fl_String Fluid_Project::headerfile_name() const {
-  Fl_String name = fl_filename_name(header_file_name);
+std::string Fluid_Project::headerfile_name() const {
+  std::string name = fl_filename_name(header_file_name);
   if (name.empty()) {
     return fl_filename_setext(fl_filename_name(filename), ".h");
   } else if (name[0] == '.') {
@@ -1160,7 +1160,7 @@ Fl_String Fluid_Project::headerfile_name() const {
  batch mode.
  \return the path ending in '/'
  */
-Fl_String Fluid_Project::stringsfile_path() const {
+std::string Fluid_Project::stringsfile_path() const {
   if (batch_mode)
     return g_launch_path;
   else
@@ -1171,7 +1171,7 @@ Fl_String Fluid_Project::stringsfile_path() const {
  Get the generated i18n text file name including extension, for example `test.po`.
  \return the file name without path
  */
-Fl_String Fluid_Project::stringsfile_name() const {
+std::string Fluid_Project::stringsfile_name() const {
   switch (i18n_type) {
     default: return fl_filename_setext(fl_filename_name(filename), ".txt");
     case FD_I18N_GNU: return fl_filename_setext(fl_filename_name(filename), ".po");
@@ -1183,7 +1183,7 @@ Fl_String Fluid_Project::stringsfile_name() const {
  Get the name of the project file without the filename extension.
  \return the file name without path or extension
  */
-Fl_String Fluid_Project::basename() const {
+std::string Fluid_Project::basename() const {
   return fl_filename_setext(fl_filename_name(filename), "");
 }
 
@@ -1218,14 +1218,14 @@ int write_code_files(bool dont_show_completion_dialog)
 
   // -- generate the file names with absolute paths
   Fd_Code_Writer f;
-  Fl_String code_filename = g_project.codefile_path() + g_project.codefile_name();
-  Fl_String header_filename = g_project.headerfile_path() + g_project.headerfile_name();
+  std::string code_filename = g_project.codefile_path() + g_project.codefile_name();
+  std::string header_filename = g_project.headerfile_path() + g_project.headerfile_name();
 
   // -- write the code and header files
   if (!batch_mode) enter_project_dir();
   int x = f.write_code(code_filename.c_str(), header_filename.c_str());
-  Fl_String code_filename_rel = fl_filename_relative(code_filename);
-  Fl_String header_filename_rel = fl_filename_relative(header_filename);
+  std::string code_filename_rel = fl_filename_relative(code_filename);
+  std::string header_filename_rel = fl_filename_relative(header_filename);
   if (!batch_mode) leave_project_dir();
 
   // -- print error message in batch mode or pop up an error or confirmation dialog box
@@ -1278,8 +1278,8 @@ int mergeback_code_files()
     return 0;
   }
 
-  Fl_String proj_filename = g_project.projectfile_path() + g_project.projectfile_name();
-  Fl_String code_filename;
+  std::string proj_filename = g_project.projectfile_path() + g_project.projectfile_name();
+  std::string code_filename;
 #if 1
   if (!batch_mode) {
     Fl_Preferences build_records(Fl_Preferences::USER_L, "fltk.org", "fluid-build");
@@ -1317,7 +1317,7 @@ void write_strings_cb(Fl_Widget *, void *) {
     save_cb(0,0);
     if (!filename) return;
   }
-  Fl_String filename = g_project.stringsfile_path() + g_project.stringsfile_name();
+  std::string filename = g_project.stringsfile_path() + g_project.stringsfile_name();
   int x = write_strings(filename);
   if (batch_mode) {
     if (x) {
@@ -1626,7 +1626,7 @@ void print_menu_cb(Fl_Widget *, void *) {
     fl_draw(date, w - (int)fl_width(date), fl_height());
 
     // Get the base filename...
-    Fl_String basename = fl_filename_name(Fl_String(filename));
+    std::string basename = fl_filename_name(std::string(filename));
     fl_draw(basename.c_str(), 0, fl_height());
 
     // print centered and scaled to fit in the page
@@ -1657,7 +1657,7 @@ static void menu_file_new_cb(Fl_Widget *, void *) { new_project(); }
 static void menu_file_new_from_template_cb(Fl_Widget *, void *) { new_project_from_template(); }
 static void menu_file_open_cb(Fl_Widget *, void *) { open_project_file(""); }
 static void menu_file_insert_cb(Fl_Widget *, void *) { merge_project_file(""); }
-static void menu_file_open_history_cb(Fl_Widget *, void *v) { open_project_file(Fl_String((const char*)v)); }
+static void menu_file_open_history_cb(Fl_Widget *, void *v) { open_project_file(std::string((const char*)v)); }
 static void menu_layout_sync_resize_cb(Fl_Menu_ *m, void*) {
   if (m->mvalue()->value()) Fl_Type::allow_layout = 1; else Fl_Type::allow_layout = 0; }
 /**
@@ -1943,7 +1943,7 @@ void load_history() {
     fluid_prefs.get( Fl_Preferences::Name("file%d", i), absolute_history[i], "", sizeof(absolute_history[i]));
     if (absolute_history[i][0]) {
       // Make a shortened version of the filename for the menu...
-      Fl_String fn = fl_filename_shortened(absolute_history[i], 48);
+      std::string fn = fl_filename_shortened(absolute_history[i], 48);
       strncpy(relative_history[i], fn.c_str(), sizeof(relative_history[i]) - 1);
       if (i == 9) history_item[i].flags = FL_MENU_DIVIDER;
       else history_item[i].flags = 0;
@@ -2003,7 +2003,7 @@ void update_history(const char *flname) {
 
   // Put the new file at the top...
   strlcpy(absolute_history[0], absolute, sizeof(absolute_history[0]));
-  Fl_String fn = fl_filename_shortened(absolute_history[0], 48);
+  std::string fn = fl_filename_shortened(absolute_history[0], 48);
   strncpy(relative_history[0], fn.c_str(), sizeof(relative_history[0]) - 1);
 
   // Update the menu items as needed...
@@ -2072,9 +2072,9 @@ void set_modflag(int mf, int mfc) {
   }
 
   if (main_window) {
-    Fl_String basename;
+    std::string basename;
     if (!filename) basename = "Untitled.fl";
-    else basename = fl_filename_name(Fl_String(filename));
+    else basename = fl_filename_name(std::string(filename));
     code_ext = fl_filename_ext(g_project.code_file_name.c_str());
     char mod_star = modflag ? '*' : ' ';
     char mod_c_star = modflag_c ? '*' : ' ';
diff --git a/fluid/fluid.h b/fluid/fluid.h
index 7ed488a4ab6b3cf21f2372feb1a134a3e079a303..e8730efb2d5f6868e38aea77a3f4b5d22bdcd1dc 100644
--- a/fluid/fluid.h
+++ b/fluid/fluid.h
@@ -90,11 +90,11 @@ extern int batch_mode;
 
 extern int pasteoffset;
 
-extern Fl_String g_code_filename_arg;
-extern Fl_String g_header_filename_arg;
-extern Fl_String g_launch_path;
+extern std::string g_code_filename_arg;
+extern std::string g_header_filename_arg;
+extern std::string g_launch_path;
 
-extern Fl_String g_autodoc_path;
+extern std::string g_autodoc_path;
 
 // ---- project class declaration
 
@@ -117,39 +117,39 @@ public:
   void reset();
   void update_settings_dialog();
 
-  Fl_String projectfile_path() const;
-  Fl_String projectfile_name() const;
-  Fl_String codefile_path() const;
-  Fl_String codefile_name() const;
-  Fl_String headerfile_path() const;
-  Fl_String headerfile_name() const;
-  Fl_String stringsfile_path() const;
-  Fl_String stringsfile_name() const;
-  Fl_String basename() const;
+  std::string projectfile_path() const;
+  std::string projectfile_name() const;
+  std::string codefile_path() const;
+  std::string codefile_name() const;
+  std::string headerfile_path() const;
+  std::string headerfile_name() const;
+  std::string stringsfile_path() const;
+  std::string stringsfile_name() const;
+  std::string basename() const;
 
   /// One of the available internationalization types.
   Fd_I18n_Type i18n_type;
   /// Include file for GNU i18n, writes an #include statement into the source
   /// file. This is usually `<libintl.h>` or `"gettext.h"` for GNU gettext.
-  Fl_String i18n_gnu_include;
+  std::string i18n_gnu_include;
   // Optional name of a macro for conditional i18n compilation.
-  Fl_String i18n_gnu_conditional;
+  std::string i18n_gnu_conditional;
   /// For the gettext/intl.h options, this is the function that translates text
   /// at runtime. This is usually "gettext" or "_".
-  Fl_String i18n_gnu_function;
+  std::string i18n_gnu_function;
   /// For the gettext/intl.h options, this is the function that marks the translation
   /// of text at initialisation time. This is usually "gettext_noop" or "N_".
-  Fl_String i18n_gnu_static_function;
+  std::string i18n_gnu_static_function;
 
   /// Include file for Posix i18n, write a #include statement into the source
   /// file. This is usually `<nl_types.h>` for Posix catgets.
-  Fl_String i18n_pos_include;
+  std::string i18n_pos_include;
   // Optional name of a macro for conditional i18n compilation.
-  Fl_String i18n_pos_conditional;
+  std::string i18n_pos_conditional;
   /// Name of the nl_catd database
-  Fl_String i18n_pos_file;
+  std::string i18n_pos_file;
   /// Message set ID for the catalog.
-  Fl_String i18n_pos_set;
+  std::string i18n_pos_set;
 
   /// If set, generate code to include the header file form the c++ file
   int include_H_from_C;
@@ -165,9 +165,9 @@ public:
   int code_file_set;
   int write_mergeback_data;
   /// Hold the default extension for header files, or the entire filename if set via command line.
-  Fl_String header_file_name;
+  std::string header_file_name;
   /// Hold the default extension for source code  files, or the entire filename if set via command line.
-  Fl_String code_file_name;
+  std::string code_file_name;
 };
 
 extern Fluid_Project g_project;
@@ -180,7 +180,7 @@ extern void leave_project_dir();
 extern void set_filename(const char *c);
 extern void set_modflag(int mf, int mfc=-1);
 
-extern const Fl_String &get_tmpdir();
+extern const std::string &get_tmpdir();
 
 // ---- public callback functions
 
diff --git a/fluid/fluid_filename.cxx b/fluid/fluid_filename.cxx
index 7031d6527a537d1fe6ce91116498732a679550c1..45cb7469c7229dac48ba9b3e94d78c169a104fc6 100644
--- a/fluid/fluid_filename.cxx
+++ b/fluid/fluid_filename.cxx
@@ -18,10 +18,10 @@
 
   \brief File names and URI utility functions for FLUID only.
 
-  This file defines all fl_filename* functions using Fl_String and also
+  This file defines all fl_filename* functions using std::string and also
   includes the main header file <FL/filename.H>.
 
-  \note This file contains some filename functions using Fl_String which
+  \note This file contains some filename functions using std::string which
         which are used in FLTK 1.4.x but will be removed in the next minor
         or major release after 1.4.x (i.e. 1.5 or maybe 4.0).
 
@@ -45,8 +45,8 @@
  \return the name part of a filename
  \see fl_filename_name(const char *filename)
  */
-Fl_String fl_filename_name(const Fl_String &filename) {
-  return Fl_String(fl_filename_name(filename.c_str()));
+std::string fl_filename_name(const std::string &filename) {
+  return std::string(fl_filename_name(filename.c_str()));
 }
 
 /**
@@ -55,13 +55,13 @@ Fl_String fl_filename_name(const Fl_String &filename) {
  \return the path part of a filename without the name
  \see fl_filename_name(const char *filename)
  */
-Fl_String fl_filename_path(const Fl_String &filename) {
+std::string fl_filename_path(const std::string &filename) {
   const char *base = filename.c_str();
   const char *name = fl_filename_name(base);
   if (name) {
-    return Fl_String(base, (int)(name-base));
+    return std::string(base, (int)(name-base));
   } else {
-    return Fl_String();
+    return std::string();
   }
 }
 
@@ -72,8 +72,8 @@ Fl_String fl_filename_path(const Fl_String &filename) {
     string if the filename has no extension
  \see fl_filename_ext(const char *buf)
  */
-Fl_String fl_filename_ext(const Fl_String &filename) {
-  return Fl_String(fl_filename_ext(filename.c_str()));
+std::string fl_filename_ext(const std::string &filename) {
+  return std::string(fl_filename_ext(filename.c_str()));
 }
 
 /**
@@ -83,11 +83,11 @@ Fl_String fl_filename_ext(const Fl_String &filename) {
  \return the new filename
  \see fl_filename_setext(char *to, int tolen, const char *ext)
  */
-Fl_String fl_filename_setext(const Fl_String &filename, const Fl_String &new_extension) {
+std::string fl_filename_setext(const std::string &filename, const std::string &new_extension) {
   char buffer[FL_PATH_MAX];
   fl_strlcpy(buffer, filename.c_str(), FL_PATH_MAX);
   fl_filename_setext(buffer, FL_PATH_MAX, new_extension.c_str());
-  return Fl_String(buffer);
+  return std::string(buffer);
 }
 
 /**
@@ -96,10 +96,10 @@ Fl_String fl_filename_setext(const Fl_String &filename, const Fl_String &new_ext
  \return the new, expanded filename
  \see fl_filename_expand(char *to, int tolen, const char *from)
 */
-Fl_String fl_filename_expand(const Fl_String &from) {
+std::string fl_filename_expand(const std::string &from) {
   char buffer[FL_PATH_MAX];
   fl_filename_expand(buffer, FL_PATH_MAX, from.c_str());
-  return Fl_String(buffer);
+  return std::string(buffer);
 }
 
 /**
@@ -108,10 +108,10 @@ Fl_String fl_filename_expand(const Fl_String &from) {
  \return the new, absolute filename
  \see fl_filename_absolute(char *to, int tolen, const char *from)
  */
-Fl_String fl_filename_absolute(const Fl_String &from) {
+std::string fl_filename_absolute(const std::string &from) {
   char buffer[FL_PATH_MAX];
   fl_filename_absolute(buffer, FL_PATH_MAX, from.c_str());
-  return Fl_String(buffer);
+  return std::string(buffer);
 }
 
 /**
@@ -122,10 +122,10 @@ Fl_String fl_filename_absolute(const Fl_String &from) {
  \return the new, absolute filename
  \see fl_filename_absolute(char *to, int tolen, const char *from, const char *base)
  */
-Fl_String fl_filename_absolute(const Fl_String &from, const Fl_String &base) {
+std::string fl_filename_absolute(const std::string &from, const std::string &base) {
   char buffer[FL_PATH_MAX];
   fl_filename_absolute(buffer, FL_PATH_MAX, from.c_str(), base.c_str());
-  return Fl_String(buffer);
+  return std::string(buffer);
 }
 
 /**
@@ -134,10 +134,10 @@ Fl_String fl_filename_absolute(const Fl_String &from, const Fl_String &base) {
  \return the new, relative filename
  \see fl_filename_relative(char *to, int tolen, const char *from)
  */
-Fl_String fl_filename_relative(const Fl_String &from) {
+std::string fl_filename_relative(const std::string &from) {
   char buffer[FL_PATH_MAX];
   fl_filename_relative(buffer, FL_PATH_MAX, from.c_str());
-  return Fl_String(buffer);
+  return std::string(buffer);
 }
 
 /**
@@ -147,20 +147,20 @@ Fl_String fl_filename_relative(const Fl_String &from) {
  \return the new, relative filename
  \see fl_filename_relative(char *to, int tolen, const char *from, const char *base)
  */
-Fl_String fl_filename_relative(const Fl_String &from, const Fl_String &base) {
+std::string fl_filename_relative(const std::string &from, const std::string &base) {
   char buffer[FL_PATH_MAX];
   fl_filename_relative(buffer, FL_PATH_MAX, from.c_str(), base.c_str());
-  return Fl_String(buffer);
+  return std::string(buffer);
 }
 
 /** Cross-platform function to get the current working directory
- as a UTF-8 encoded value in an Fl_String.
+ as a UTF-8 encoded value in an std::string.
  \return the CWD encoded as UTF-8
  */
-Fl_String fl_getcwd() {
+std::string fl_getcwd() {
   char buffer[FL_PATH_MAX];
   fl_getcwd(buffer, FL_PATH_MAX);
-  return Fl_String(buffer);
+  return std::string(buffer);
 }
 
 /**
@@ -177,19 +177,19 @@ Fl_String fl_getcwd() {
  \param[in[ max_chars maximum number of characters in result, including ellipsis
  \return shortened file path and name
  */
-Fl_String fl_filename_shortened(const Fl_String &filename, int max_chars) {
+std::string fl_filename_shortened(const std::string &filename, int max_chars) {
   // Insert this as the ellipsis
   static const char *ell = "...";
   static const int ell_bytes = 3;
   // Replace the start of a path with "~" if it matches the home directory
-  static Fl_String tilde = "~/";
-  static Fl_String home;
+  static std::string tilde = "~/";
+  static std::string home;
   static int home_chars = -1;
   if (home_chars==-1) {
     home = fl_filename_expand(tilde);
     home_chars = fl_utf_nb_char((const uchar*)home.c_str(), home.size());
   }
-  Fl_String homed_filename;
+  std::string homed_filename;
 #if defined(_WIN32) || defined(__APPLE__)
   bool starts_with_home = fl_utf_strncasecmp(home.c_str(), filename.c_str(), home_chars)==0;
 #else
diff --git a/fluid/fluid_filename.h b/fluid/fluid_filename.h
index 2ac489ee670645f1fd7eba9a63dc13f282a5f639..7bcea51fb1fc01d4e945d943568f1da2309ef1e1 100644
--- a/fluid/fluid_filename.h
+++ b/fluid/fluid_filename.h
@@ -18,10 +18,10 @@
 
   \brief File names and URI utility functions for FLUID only.
 
-  This file declares all fl_filename* functions using Fl_String and also
+  This file declares all fl_filename* functions using std::string and also
   includes the main header file <FL/filename.H>.
 
-  \note This file contains some filename functions using Fl_String which
+  \note This file contains some filename functions using std::string which
         which are used in FLTK 1.4.x but will be removed in the next minor
         or major release after 1.4.x (i.e. 1.5 or maybe 4.0).
 
@@ -41,17 +41,17 @@
 
 #include "../src/Fl_String.H"
 
-Fl_String fl_filename_shortened(const Fl_String &filename, int maxchars);
-Fl_String fl_filename_name(const Fl_String &filename);
-Fl_String fl_filename_path(const Fl_String &filename);
-Fl_String fl_filename_ext(const Fl_String &filename);
-Fl_String fl_filename_setext(const Fl_String &filename, const Fl_String &new_extension);
-Fl_String fl_filename_expand(const Fl_String &from);
-Fl_String fl_filename_absolute(const Fl_String &from);
-Fl_String fl_filename_absolute(const Fl_String &from, const Fl_String &base);
-Fl_String fl_filename_relative(const Fl_String &from);
-Fl_String fl_filename_relative(const Fl_String &from, const Fl_String &base);
-Fl_String fl_getcwd();
+std::string fl_filename_shortened(const std::string &filename, int maxchars);
+std::string fl_filename_name(const std::string &filename);
+std::string fl_filename_path(const std::string &filename);
+std::string fl_filename_ext(const std::string &filename);
+std::string fl_filename_setext(const std::string &filename, const std::string &new_extension);
+std::string fl_filename_expand(const std::string &from);
+std::string fl_filename_absolute(const std::string &from);
+std::string fl_filename_absolute(const std::string &from, const std::string &base);
+std::string fl_filename_relative(const std::string &from);
+std::string fl_filename_relative(const std::string &from, const std::string &base);
+std::string fl_getcwd();
 
 #  endif
 
diff --git a/fluid/mergeback.cxx b/fluid/mergeback.cxx
index 35e611ecffa0220caf005ab1adfdf298341306a7..a0b87534cdc9a8ce82e45cca8ba1bf06c11aa909 100644
--- a/fluid/mergeback.cxx
+++ b/fluid/mergeback.cxx
@@ -101,7 +101,7 @@ extern void redraw_browser();
  \return -2 if no code file was found
  \return see above
  */
-int merge_back(const Fl_String &s, const Fl_String &p, int task) {
+int merge_back(const std::string &s, const std::string &p, int task) {
   if (g_project.write_mergeback_data) {
     Fd_Mergeback mergeback;
     return mergeback.merge_back(s, p, task);
@@ -154,7 +154,7 @@ void Fd_Mergeback::unindent(char *s) {
  \param[in] end end of text within the file
  \return a string holding the text that was found in the file
  */
-Fl_String Fd_Mergeback::read_and_unindent_block(long start, long end) {
+std::string Fd_Mergeback::read_and_unindent_block(long start, long end) {
   long bsize = end-start;
   long here = ::ftell(code);
   ::fseek(code, start, SEEK_SET);
@@ -165,7 +165,7 @@ Fl_String Fd_Mergeback::read_and_unindent_block(long start, long end) {
   else
     block[bsize] = 0;
   unindent(block);
-  Fl_String str = block;
+  std::string str = block;
   ::free(block);
   ::fseek(code, here, SEEK_SET);
   return str;
@@ -178,7 +178,7 @@ Fl_String Fd_Mergeback::read_and_unindent_block(long start, long end) {
  \return -1 if the user wants to cancel or an error occurred or an issue was presented
         (message or choice dialog was shown)
  */
-int Fd_Mergeback::ask_user_to_merge(const Fl_String &code_filename, const Fl_String &proj_filename) {
+int Fd_Mergeback::ask_user_to_merge(const std::string &code_filename, const std::string &proj_filename) {
   if (tag_error) {
     fl_message("Comparing\n  \"%s\"\nto\n  \"%s\"\n\n"
                "MergeBack found an error in line %d while reading tags\n"
@@ -198,7 +198,7 @@ int Fd_Mergeback::ask_user_to_merge(const Fl_String &code_filename, const Fl_Str
                code_filename.c_str(), proj_filename.c_str(), num_changed_structure);
     return -1;
   }
-  Fl_String msg = "Comparing\n  \"%1$s\"\nto\n  \"%2$s\"\n\n"
+  std::string msg = "Comparing\n  \"%1$s\"\nto\n  \"%2$s\"\n\n"
                   "MergeBack found %3$d modifications in the source code.";
   if (num_possible_override)
     msg += "\n\nWARNING: %6$d of these modified blocks appear to also have\n"
@@ -241,7 +241,7 @@ int Fd_Mergeback::ask_user_to_merge(const Fl_String &code_filename, const Fl_Str
 void Fd_Mergeback::analyse_callback(unsigned long code_crc, unsigned long tag_crc, int uid) {
   Fl_Type *tp = Fl_Type::find_by_uid(uid);
   if (tp && tp->is_true_widget()) {
-    Fl_String cb = tp->callback(); cb += "\n";
+    std::string cb = tp->callback(); cb += "\n";
     unsigned long project_crc = Fd_Code_Writer::block_crc(cb.c_str());
     // check if the code and project crc are the same, so this modification was already applied
     if (project_crc!=code_crc) {
@@ -263,7 +263,7 @@ void Fd_Mergeback::analyse_callback(unsigned long code_crc, unsigned long tag_cr
 void Fd_Mergeback::analyse_code(unsigned long code_crc, unsigned long tag_crc, int uid) {
   Fl_Type *tp = Fl_Type::find_by_uid(uid);
   if (tp && tp->is_a(ID_Code)) {
-    Fl_String code = tp->name(); code += "\n";
+    std::string code = tp->name(); code += "\n";
     unsigned long project_crc = Fd_Code_Writer::block_crc(code.c_str());
     // check if the code and project crc are the same, so this modification was already applied
     if (project_crc!=code_crc) {
@@ -356,7 +356,7 @@ int Fd_Mergeback::analyse() {
 int Fd_Mergeback::apply_callback(long block_end, long block_start, unsigned long code_crc, int uid) {
   Fl_Type *tp = Fl_Type::find_by_uid(uid);
   if (tp && tp->is_true_widget()) {
-    Fl_String cb = tp->callback(); cb += "\n";
+    std::string cb = tp->callback(); cb += "\n";
     unsigned long project_crc = Fd_Code_Writer::block_crc(cb.c_str());
     if (project_crc!=code_crc) {
       tp->callback(read_and_unindent_block(block_start, block_end).c_str());
@@ -372,7 +372,7 @@ int Fd_Mergeback::apply_callback(long block_end, long block_start, unsigned long
 int Fd_Mergeback::apply_code(long block_end, long block_start, unsigned long code_crc, int uid) {
   Fl_Type *tp = Fl_Type::find_by_uid(uid);
   if (tp && tp->is_a(ID_Code)) {
-    Fl_String cb = tp->name(); cb += "\n";
+    std::string cb = tp->name(); cb += "\n";
     unsigned long project_crc = Fd_Code_Writer::block_crc(cb.c_str());
     if (project_crc!=code_crc) {
       tp->name(read_and_unindent_block(block_start, block_end).c_str());
@@ -439,9 +439,9 @@ int Fd_Mergeback::apply() {
             FD_MERGEBACK_APPLY_IF_SAFE, or FD_MERGEBACK_APPLY
  \return -1 if an error was found in a tag
  \return -2 if no code file was found
- \return See more at ::merge_back(const Fl_String &s, int task).
+ \return See more at ::merge_back(const std::string &s, int task).
  */
-int Fd_Mergeback::merge_back(const Fl_String &s, const Fl_String &p, int task) {
+int Fd_Mergeback::merge_back(const std::string &s, const std::string &p, int task) {
   int ret = 0;
   code = fl_fopen(s.c_str(), "rb");
   if (!code) return -2;
diff --git a/fluid/mergeback.h b/fluid/mergeback.h
index 7be18c710f5eb444d28eb42d8ebc9d4bb92d5356..658e949289ddd80aa02aba40aedc4c2dd6823527 100644
--- a/fluid/mergeback.h
+++ b/fluid/mergeback.h
@@ -38,7 +38,7 @@ const int FD_MERGEBACK_APPLY = 2;
 const int FD_MERGEBACK_APPLY_IF_SAFE = 3;
 
 /** Class that implements the MergeBack functionality.
- \see merge_back(const Fl_String &s, int task)
+ \see merge_back(const std::string &s, int task)
  */
 class Fd_Mergeback
 {
@@ -59,7 +59,7 @@ protected:
   int num_possible_override;
 
   void unindent(char *s);
-  Fl_String read_and_unindent_block(long start, long end);
+  std::string read_and_unindent_block(long start, long end);
   void analyse_callback(unsigned long code_crc, unsigned long tag_crc, int uid);
   void analyse_code(unsigned long code_crc, unsigned long tag_crc, int uid);
   int apply_callback(long block_end, long block_start, unsigned long code_crc, int uid);
@@ -68,13 +68,13 @@ protected:
 public:
   Fd_Mergeback();
   ~Fd_Mergeback();
-  int merge_back(const Fl_String &s, const Fl_String &p, int task);
-  int ask_user_to_merge(const Fl_String &s, const Fl_String &p);
+  int merge_back(const std::string &s, const std::string &p, int task);
+  int ask_user_to_merge(const std::string &s, const std::string &p);
   int analyse();
   int apply();
 };
 
-extern int merge_back(const Fl_String &s, const Fl_String &p, int task);
+extern int merge_back(const std::string &s, const std::string &p, int task);
 
 
 #endif // _FLUID_MERGEBACK_H
diff --git a/fluid/settings_panel.cxx b/fluid/settings_panel.cxx
index bdaea50ca7b2cb1673249f01c7650734d6e9ae8a..291f5d24ad58ee3946171a0112b84e5b0b9e7fbe 100644
--- a/fluid/settings_panel.cxx
+++ b/fluid/settings_panel.cxx
@@ -512,7 +512,7 @@ static void cb_2(Fl_Button*, void* v) {
 
   if (v == LOAD) return;
 
-  Fl_String old_name = "Copy of ";
+  std::string old_name = "Copy of ";
   old_name.append(g_layout_list[g_layout_list.current_suite()].name_);
   const char *new_name = fl_input("Enter a name for the new layout:", old_name.c_str());
   if (new_name == NULL)
@@ -543,7 +543,7 @@ static void cb_w_layout_menu(Fl_Menu_Button*, void* v) {
 static void cb_w_layout_menu_rename(Fl_Menu_*, void*) {
   // Rename the current layout suite
 
-  Fl_String old_name = g_layout_list[g_layout_list.current_suite()].name_;
+  std::string old_name = g_layout_list[g_layout_list.current_suite()].name_;
   const char *new_name = fl_input("Enter a new name for the layout:", old_name.c_str());
   if (new_name == NULL)
     return;
@@ -598,7 +598,7 @@ static void cb_w_layout_menu_save(Fl_Menu_*, void*) {
     fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
     fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM | Fl_Native_File_Chooser::USE_FILTER_EXT);
     fnfc.filter("FLUID Layouts\t*.fll\n");
-    Fl_String filename = g_layout_list.filename_;
+    std::string filename = g_layout_list.filename_;
     fnfc.directory(fl_filename_path(filename).c_str());
     fnfc.preset_file(fl_filename_name(filename).c_str());
     if (fnfc.show() != 0) return;
diff --git a/fluid/settings_panel.fl b/fluid/settings_panel.fl
index 912f9bf68165b6375471012413eb86b7e1142b1b..540ca48df74f9b851bd28a82e9f2eb901e43beae 100644
--- a/fluid/settings_panel.fl
+++ b/fluid/settings_panel.fl
@@ -479,7 +479,7 @@ or just ".ext" to set extension.}
 
 if (v == LOAD) return;
 
-Fl_String old_name = "Copy of ";
+std::string old_name = "Copy of ";
 old_name.append(g_layout_list[g_layout_list.current_suite()].name_);
 const char *new_name = fl_input("Enter a name for the new layout:", old_name.c_str());
 if (new_name == NULL)
@@ -509,7 +509,7 @@ g_layout_list.update_dialogs();}
             label {Rename...}
             callback {// Rename the current layout suite
 
-Fl_String old_name = g_layout_list[g_layout_list.current_suite()].name_;
+std::string old_name = g_layout_list[g_layout_list.current_suite()].name_;
 const char *new_name = fl_input("Enter a new name for the layout:", old_name.c_str());
 if (new_name == NULL)
   return;
@@ -570,7 +570,7 @@ g_layout_list.update_dialogs();}
   fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
   fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM | Fl_Native_File_Chooser::USE_FILTER_EXT);
   fnfc.filter("FLUID Layouts\\t*.fll\\n");
-  Fl_String filename = g_layout_list.filename_;
+  std::string filename = g_layout_list.filename_;
   fnfc.directory(fl_filename_path(filename).c_str());
   fnfc.preset_file(fl_filename_name(filename).c_str());
   if (fnfc.show() != 0) return;
diff --git a/fluid/shell_command.cxx b/fluid/shell_command.cxx
index fc61294ea42809afaaa43383c5d69dd7f260111a..97c49f46224fb52fcbca06bd3bf7679b0cd33cf5 100644
--- a/fluid/shell_command.cxx
+++ b/fluid/shell_command.cxx
@@ -108,7 +108,7 @@
 
 #include <errno.h>
 
-static Fl_String fltk_config_cmd;
+static std::string fltk_config_cmd;
 static Fl_Process s_proc;
 
 /**
@@ -129,7 +129,7 @@ bool shell_command_running() {
  \param[in] defaultValue default value to be used if no preference was set
  \return 0 if the default value was used
  */
-char preferences_get(Fl_Preferences &prefs, const char *key, Fl_String &value, const Fl_String &defaultValue) {
+char preferences_get(Fl_Preferences &prefs, const char *key, std::string &value, const std::string &defaultValue) {
   char *v = NULL;
   char ret = prefs.get(key, v, defaultValue.c_str());
   value = v;
@@ -147,7 +147,7 @@ char preferences_get(Fl_Preferences &prefs, const char *key, Fl_String &value, c
  \param[in] value set this entry to value (stops at the first nul character).
  \return 0 if setting the value failed
  */
-char preferences_set(Fl_Preferences &prefs, const char *key, const Fl_String &value) {
+char preferences_set(Fl_Preferences &prefs, const char *key, const std::string &value) {
   return prefs.set(key, value.c_str());
 }
 
@@ -362,15 +362,15 @@ void shell_pipe_cb(FL_SOCKET, void*) {
 //
 //}
 
-static void expand_macro(Fl_String &cmd, const Fl_String &macro, const Fl_String &content) {
+static void expand_macro(std::string &cmd, const std::string &macro, const std::string &content) {
   for (int i=0;;) {
     i = cmd.find(macro, i);
-    if (i==Fl_String::npos) break;
+    if (i==std::string::npos) break;
     cmd.replace(i, macro.size(), content);
   }
 }
 
-static void expand_macros(Fl_String &cmd) {
+static void expand_macros(std::string &cmd) {
   expand_macro(cmd, "@BASENAME@",         g_project.basename());
   expand_macro(cmd, "@PROJECTFILE_PATH@", g_project.projectfile_path());
   expand_macro(cmd, "@PROJECTFILE_NAME@", g_project.projectfile_name());
@@ -381,11 +381,11 @@ static void expand_macros(Fl_String &cmd) {
   expand_macro(cmd, "@TEXTFILE_PATH@",    g_project.stringsfile_path());
   expand_macro(cmd, "@TEXTFILE_NAME@",    g_project.stringsfile_name());
 //  TODO: implement finding the script `fltk-config` for all platforms
-//  if (cmd.find("@FLTK_CONFIG@") != Fl_String::npos) {
+//  if (cmd.find("@FLTK_CONFIG@") != std::string::npos) {
 //    find_fltk_config();
 //    expand_macro(cmd, "@FLTK_CONFIG@",      fltk_config_cmd.c_str());
 //  }
-  if (cmd.find("@TMPDIR@") != Fl_String::npos)
+  if (cmd.find("@TMPDIR@") != std::string::npos)
     expand_macro(cmd, "@TMPDIR@",           get_tmpdir());
 }
 
@@ -411,7 +411,7 @@ void show_terminal_window() {
  \param[in] cmd the command that is sent to `/bin/sh -c ...` or `cmd.exe` on Windows machines
  \param[in] flags various flags in preparation of the command
  */
-void run_shell_command(const Fl_String &cmd, int flags) {
+void run_shell_command(const std::string &cmd, int flags) {
   if (cmd.empty()) {
     fl_alert("No shell command entered!");
     return;
@@ -419,7 +419,7 @@ void run_shell_command(const Fl_String &cmd, int flags) {
 
   if (!prepare_shell_command(flags)) return;
 
-  Fl_String expanded_cmd = cmd;
+  std::string expanded_cmd = cmd;
   expand_macros(expanded_cmd);
 
   if (   ((flags & Fd_Shell_Command::DONT_SHOW_TERMINAL) == 0)
@@ -487,7 +487,7 @@ Fd_Shell_Command::Fd_Shell_Command(const Fd_Shell_Command *rhs)
 
  \param[in] name is used as a stand-in for the command name and label
  */
-Fd_Shell_Command::Fd_Shell_Command(const Fl_String &in_name)
+Fd_Shell_Command::Fd_Shell_Command(const std::string &in_name)
 : name(in_name),
   label(in_name),
   shortcut(0),
@@ -511,13 +511,13 @@ Fd_Shell_Command::Fd_Shell_Command(const Fl_String &in_name)
  \param[in] in_command the shell command that we want to run
  \param[in] in_flags some flags to tell FLUID to save the project, code, or strings before running the command
  */
-Fd_Shell_Command::Fd_Shell_Command(const Fl_String &in_name,
-                 const Fl_String &in_label,
+Fd_Shell_Command::Fd_Shell_Command(const std::string &in_name,
+                 const std::string &in_label,
                  Fl_Shortcut in_shortcut,
                  Fd_Tool_Store in_storage,
                  int in_condition,
-                 const Fl_String &in_condition_data,
-                 const Fl_String &in_command,
+                 const std::string &in_condition_data,
+                 const std::string &in_command,
                  int in_flags)
 : name(in_name),
   label(in_label),
diff --git a/fluid/shell_command.h b/fluid/shell_command.h
index 660c398de70abbce452324418664e835ae6e1708..f167d3c33221aa80bb55a13c7e902bd6ee25f96e 100644
--- a/fluid/shell_command.h
+++ b/fluid/shell_command.h
@@ -39,11 +39,11 @@ struct Fl_Menu_Item;
 class Fl_Widget;
 class Fl_Preferences;
 
-char preferences_get(Fl_Preferences &prefs, const char *key, Fl_String &value, const Fl_String &defaultValue);
-char preferences_set(Fl_Preferences &prefs, const char *key, const Fl_String &value);
+char preferences_get(Fl_Preferences &prefs, const char *key, std::string &value, const std::string &defaultValue);
+char preferences_set(Fl_Preferences &prefs, const char *key, const std::string &value);
 
 void show_terminal_window();
-void run_shell_command(const Fl_String &cmd, int flags);
+void run_shell_command(const std::string &cmd, int flags);
 bool shell_command_running(void);
 
 class Fl_Process {
@@ -84,22 +84,22 @@ public:
     DONT_SHOW_TERMINAL = 8, CLEAR_TERMINAL = 16, CLEAR_HISTORY = 32 }; // flags
   Fd_Shell_Command();
   Fd_Shell_Command(const Fd_Shell_Command *rhs);
-  Fd_Shell_Command(const Fl_String &in_name);
-  Fd_Shell_Command(const Fl_String &in_name,
-                   const Fl_String &in_label,
+  Fd_Shell_Command(const std::string &in_name);
+  Fd_Shell_Command(const std::string &in_name,
+                   const std::string &in_label,
                    Fl_Shortcut in_shortcut,
                    Fd_Tool_Store in_storage,
                    int in_condition,
-                   const Fl_String &in_condition_data,
-                   const Fl_String &in_command,
+                   const std::string &in_condition_data,
+                   const std::string &in_command,
                    int in_flags);
-  Fl_String name;
-  Fl_String label;
+  std::string name;
+  std::string label;
   Fl_Shortcut shortcut;
   Fd_Tool_Store storage;
   int condition; // always, hide, windows only, linux only, mac only, user, machine
-  Fl_String condition_data; // user name, machine name
-  Fl_String command;
+  std::string condition_data; // user name, machine name
+  std::string command;
   int flags; // save_project, save_code, save_string, ...
   Fl_Menu_Item *shell_menu_item_;
   void run();
@@ -128,8 +128,8 @@ public:
   void clear(Fd_Tool_Store store);
 //  void move_up();
 //  void move_down();
-//  int load(const Fl_String &filename);
-//  int save(const Fl_String &filename);
+//  int load(const std::string &filename);
+//  int save(const std::string &filename);
   void read(Fl_Preferences &prefs, Fd_Tool_Store storage);
   void write(Fl_Preferences &prefs, Fd_Tool_Store storage);
   void read(class Fd_Project_Reader*);
diff --git a/src/drivers/Unix/Fl_Unix_System_Driver.cxx b/src/drivers/Unix/Fl_Unix_System_Driver.cxx
index 9601d0a02c4cbfa2019785217924bcb66071f25e..a5272be65f6ba5220dadc7307a99274f003263d3 100644
--- a/src/drivers/Unix/Fl_Unix_System_Driver.cxx
+++ b/src/drivers/Unix/Fl_Unix_System_Driver.cxx
@@ -551,7 +551,7 @@ char *Fl_Unix_System_Driver::preference_user_rootnode(
     prefs_path_14 = home_path + "/.config";
   } else {
     if (prefs_path_14[prefs_path_14.size()-1]!='/')
-      prefs_path_14.append('/');
+      prefs_path_14.append("/");
     if (prefs_path_14.find("~/")==0) // starts with "~"
       prefs_path_14.replace(0, 1, home_path);
     int h_env = prefs_path_14.find("${HOME}");
@@ -562,7 +562,7 @@ char *Fl_Unix_System_Driver::preference_user_rootnode(
       prefs_path_14.replace(h_env, 5, home_path);
   }
   if (prefs_path_14[prefs_path_14.size()-1]!='/')
-    prefs_path_14.append('/');
+    prefs_path_14.append("/");
   prefs_path_14.append(vendor);
 
   // 2: If this base path does not exist, try the 1.3 path
@@ -578,7 +578,7 @@ char *Fl_Unix_System_Driver::preference_user_rootnode(
   }
 
   // 3: neither path exists, return the 1.4 file path and name
-  prefs_path_14.append('/');
+  prefs_path_14.append("/");
   prefs_path_14.append(application);
   prefs_path_14.append(".prefs");
   strlcpy(buffer, prefs_path_14.c_str(), FL_PATH_MAX);