diff --git a/Fltk/fieldWindow.cpp b/Fltk/fieldWindow.cpp
index 334797f579c6baa357da1f093ffd8be9d61214bc..25196d77093ff85568b0495507a683356803b01e 100644
--- a/Fltk/fieldWindow.cpp
+++ b/Fltk/fieldWindow.cpp
@@ -286,7 +286,7 @@ void fieldWindow::saveFieldOptions()
     } break;
     }
     if((*input)->changed()) {
-      scriptAddFieldOption(f->id, it->first, sstream.str(),
+      scriptAddFieldOption(f->id, it->first, sstream.str(), option->getType(),
                            GModel::current()->getFileName());
       (*input)->clear_changed();
     }
diff --git a/Geo/scriptStringInterface.cpp b/Geo/scriptStringInterface.cpp
index 0de6244ebdf987c9226c34920523892e132b8f9a..aa1b4319ea666b20bfa4cfe26d77d23f16ffe204 100644
--- a/Geo/scriptStringInterface.cpp
+++ b/Geo/scriptStringInterface.cpp
@@ -5,6 +5,7 @@
 
 #include <string.h>
 #include <sstream>
+#include "Field.h"
 #include "GmshConfig.h"
 #include "GmshMessage.h"
 #include "GModel.h"
@@ -451,7 +452,7 @@ void scriptAddPoint(const std::string &fileName, const std::string &x,
 }
 
 void scriptAddFieldOption(int field_id, const std::string &option_name,
-                          const std::string &option_value,
+                          const std::string &option_value, int option_type,
                           const std::string &fileName)
 {
   for(auto &lang : CTX::instance()->scriptLang) {
@@ -461,7 +462,30 @@ void scriptAddFieldOption(int field_id, const std::string &option_name,
               << option_value << ";";
     }
     else {
-      // TODO
+      std::ostringstream args;
+      switch(option_type) {
+      case FIELD_OPTION_DOUBLE:
+      case FIELD_OPTION_INT:
+      case FIELD_OPTION_BOOL:
+        args << field_id << ", \"" << option_name << "\", " << option_value;
+        sstream << api("gmsh/model/mesh/field/setNumber", args.str(), lang);
+        break;
+      case FIELD_OPTION_STRING:
+      case FIELD_OPTION_PATH:
+        args << field_id << ", \"" << option_name << "\", " << option_value;
+        sstream << api("gmsh/model/mesh/field/setString", args.str(), lang);
+        break;
+      case FIELD_OPTION_LIST:
+      case FIELD_OPTION_LIST_DOUBLE:
+        std::string list_val = option_value;
+        if(lang == "py" || lang == "jl") {
+          ReplaceSubStringInPlace("{", "[", list_val);
+          ReplaceSubStringInPlace("}", "]", list_val);
+        }
+        args << field_id << ", \"" << option_name << "\", " << list_val;
+        sstream << api("gmsh/model/mesh/field/setNumbers", args.str(), lang);
+        break;
+      }
     }
     scriptAddCommand(sstream.str(), fileName, lang);
   }
@@ -476,7 +500,9 @@ void scriptAddField(int field_id, const std::string &type_name,
       sstream << "Field[" << field_id << "] = " << type_name << ";";
     }
     else {
-      // TODO
+      std::ostringstream args;
+      args << "\"" << type_name << "\"" << ", " << field_id;
+      sstream << api("gmsh/model/mesh/field/add", args.str(), lang);
     }
     scriptAddCommand(sstream.str(), fileName, lang);
   }
@@ -488,7 +514,8 @@ void scriptDeleteField(int field_id, const std::string &fileName)
     std::ostringstream sstream;
     if(lang == "geo") { sstream << "Delete Field [" << field_id << "];"; }
     else {
-      // TODO
+      sstream << api("gmsh/model/mesh/field/remove",
+                     std::to_string(field_id), lang);
     }
     scriptAddCommand(sstream.str(), fileName, lang);
   }
@@ -500,7 +527,8 @@ void scriptSetBackgroundField(int field_id, const std::string &fileName)
     std::ostringstream sstream;
     if(lang == "geo") { sstream << "Background Field = " << field_id << ";"; }
     else {
-      // TODO
+      sstream << api("gmsh/model/mesh/field/setAsBackgroundMesh",
+                     std::to_string(field_id), lang);
     }
     scriptAddCommand(sstream.str(), fileName, lang);
   }
diff --git a/Geo/scriptStringInterface.h b/Geo/scriptStringInterface.h
index 3dee516b9cba142b88642718a74da71a22ed8675..93b8a7ff743976459ab59a51c85fb5627e8519d3 100644
--- a/Geo/scriptStringInterface.h
+++ b/Geo/scriptStringInterface.h
@@ -40,7 +40,7 @@ void scriptAddCircleArc(int p1, int p2, int p3, const std::string &fileName);
 void scriptAddEllipseArc(int p1, int p2, int p3, int p4,
                          const std::string &fileName);
 void scriptAddFieldOption(int field_id, const std::string &option_name,
-                          const std::string &option_value,
+                          const std::string &option_value, int option_type,
                           const std::string &fileName);
 void scriptAddField(int field_id, const std::string &type_name,
                     const std::string &fileName);