diff --git a/examples/CC3200/Makefile.build b/examples/CC3200/Makefile.build
index 3f10337900cdb537a6423ce124fa18c019d16f39..fce74d8100e2895f3eb3de230258ec5c04567424 100644
--- a/examples/CC3200/Makefile.build
+++ b/examples/CC3200/Makefile.build
@@ -31,7 +31,6 @@ SDK_FLAGS = -DUSE_FREERTOS -DSL_PLATFORM_MULTI_THREADED
 
 CFLAGS += -Os -Wall -Werror \
           $(SDK_FLAGS) -DCS_PLATFORM=4 -DCC3200_FS_SLFS \
-          -DFS_SLFS_MAX_FILE_SIZE=262144 \
           $(MONGOOSE_FEATURES) $(CFLAGS_EXTRA)
 
 FW_ELF = $(FW_DIR)/$(PROG).axf
diff --git a/examples/CC3200/ccs/MG_hello/main.c b/examples/CC3200/ccs/MG_hello/main.c
index 9d3df6fe32c2362a6037abc6f161d8b7920584a0..0124b416f83c6d04d44e0cadd326dd80318efb88 100644
--- a/examples/CC3200/ccs/MG_hello/main.c
+++ b/examples/CC3200/ccs/MG_hello/main.c
@@ -42,6 +42,8 @@
 
 #include "wifi.h"
 
+void fs_slfs_set_new_file_size(const char *name, size_t size);
+
 static const char *upload_form =
     "\
 <h1>Upload file</h1> \
@@ -53,10 +55,18 @@ static const char *upload_form =
 static struct mg_str upload_fname(struct mg_connection *nc,
                                   struct mg_str fname) {
   struct mg_str lfn;
-  lfn.len = fname.len + 3;
-  lfn.p = malloc(lfn.len);
-  memcpy((char *) lfn.p, "SL:", 3);
-  memcpy((char *) lfn.p + 3, fname.p, fname.len);
+  char *fn = malloc(fname.len + 4);
+  memcpy(fn, "SL:", 3);
+  memcpy(fn + 3, fname.p, fname.len);
+  fn[3 + fname.len] = '\0';
+  if (nc->user_data != NULL) {
+    intptr_t cl = (intptr_t) nc->user_data;
+    if (cl >= 0) {
+      fs_slfs_set_new_file_size(fn + 3, cl);
+    }
+  }
+  lfn.len = fname.len + 4;
+  lfn.p = fn;
   return lfn;
 }
 
@@ -96,6 +106,23 @@ void mg_ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
       LOG(LL_INFO, ("Connection %p closed", nc));
       break;
     }
+    /* SimpleLink FS requires pre-declaring max file size. We use Content-Length
+     * for that purpose - it will not exactly match file size, but is guaranteed
+     * to exceed it and should be close enough. */
+    case MG_EV_HTTP_MULTIPART_REQUEST: {
+      struct http_message *hm = (struct http_message *) ev_data;
+      struct mg_str *cl_header = mg_get_http_header(hm, "Content-Length");
+      intptr_t cl = -1;
+      if (cl_header != NULL && cl_header->len < 20) {
+        char buf[20];
+        memcpy(buf, cl_header->p, cl_header->len);
+        buf[cl_header->len] = '\0';
+        cl = atoi(buf);
+        if (cl < 0) cl = -1;
+      }
+      nc->user_data = (void *) cl;
+      break;
+    }
     case MG_EV_HTTP_PART_BEGIN:
     case MG_EV_HTTP_PART_DATA:
     case MG_EV_HTTP_PART_END: {
@@ -115,6 +142,7 @@ static void mg_init(struct mg_mgr *mgr) {
   LOG(LL_INFO, ("MG task running"));
 
   stop_nwp(); /* See function description in wifi.c */
+  LOG(LL_INFO, ("Starting NWP..."));
   int role = sl_Start(0, 0, 0);
   if (role < 0) {
     LOG(LL_ERROR, ("Failed to start NWP"));
diff --git a/examples/CC3200/ccs/Mongoose/.cproject b/examples/CC3200/ccs/Mongoose/.cproject
index 50a986da2c0441742a43553adc2ab2d1f0291eed..814c770f3114cf95f62958f79148948676676879 100644
--- a/examples/CC3200/ccs/Mongoose/.cproject
+++ b/examples/CC3200/ccs/Mongoose/.cproject
@@ -29,7 +29,6 @@
 								<option id="com.ti.ccstudio.buildDefinitions.TMS470_5.2.compilerID.DEFINE.2068422510" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.2.compilerID.DEFINE" valueType="definedSymbols">
 									<listOptionValue builtIn="false" value="MG_ENABLE_HTTP_STREAMING_MULTIPART=1"/>
 									<listOptionValue builtIn="false" value="SL_PLATFORM_MULTI_THREADED=1"/>
-									<listOptionValue builtIn="false" value="FS_SLFS_MAX_FILE_SIZE=262144"/>
 									<listOptionValue builtIn="false" value="MG_FS_SLFS=1"/>
 									<listOptionValue builtIn="false" value="cc3200"/>
 								</option>
@@ -95,7 +94,6 @@
 								<option id="com.ti.ccstudio.buildDefinitions.TMS470_5.2.compilerID.DEFINE.1633469996" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_5.2.compilerID.DEFINE" valueType="definedSymbols">
 									<listOptionValue builtIn="false" value="MG_ENABLE_HTTP_STREAMING_MULTIPART=1"/>
 									<listOptionValue builtIn="false" value="SL_PLATFORM_MULTI_THREADED=1"/>
-									<listOptionValue builtIn="false" value="FS_SLFS_MAX_FILE_SIZE=262144"/>
 									<listOptionValue builtIn="false" value="MG_FS_SLFS=1"/>
 									<listOptionValue builtIn="false" value="cc3200"/>
 								</option>
diff --git a/examples/CC3200/main.c b/examples/CC3200/main.c
index e071029c624abe47bc82f6d70fadfbff6a1fbdf0..49c758ab247387c9695833e33a62a3c160b0decb 100644
--- a/examples/CC3200/main.c
+++ b/examples/CC3200/main.c
@@ -50,6 +50,8 @@
 #define BM222_ADDR 0x18
 #define TMP006_ADDR 0x41
 
+void fs_slfs_set_new_file_size(const char *name, size_t size);
+
 static const char *upload_form =
     "\
 <h1>Upload file</h1> \
@@ -61,10 +63,18 @@ static const char *upload_form =
 static struct mg_str upload_fname(struct mg_connection *nc,
                                   struct mg_str fname) {
   struct mg_str lfn;
-  lfn.len = fname.len + 3;
-  lfn.p = malloc(lfn.len);
-  memcpy((char *) lfn.p, "SL:", 3);
-  memcpy((char *) lfn.p + 3, fname.p, fname.len);
+  char *fn = malloc(fname.len + 4);
+  memcpy(fn, "SL:", 3);
+  memcpy(fn + 3, fname.p, fname.len);
+  fn[3 + fname.len] = '\0';
+  if (nc->user_data != NULL) {
+    intptr_t cl = (intptr_t) nc->user_data;
+    if (cl >= 0) {
+      fs_slfs_set_new_file_size(fn + 3, cl);
+    }
+  }
+  lfn.len = fname.len + 4;
+  lfn.p = fn;
   return lfn;
 }
 
@@ -113,6 +123,24 @@ static void mg_ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
     case MG_EV_TIMER: {
       data_collect();
       nc->ev_timer_time = mg_time() + (DATA_COLLECTION_INTERVAL_MS * 0.001);
+      break;
+    }
+    /* SimpleLink FS requires pre-declaring max file size. We use Content-Length
+     * for that purpose - it will not exactly match file size, but is guaranteed
+     * to exceed it and should be close enough. */
+    case MG_EV_HTTP_MULTIPART_REQUEST: {
+      struct http_message *hm = (struct http_message *) ev_data;
+      struct mg_str *cl_header = mg_get_http_header(hm, "Content-Length");
+      intptr_t cl = -1;
+      if (cl_header != NULL && cl_header->len < 20) {
+        char buf[20];
+        memcpy(buf, cl_header->p, cl_header->len);
+        buf[cl_header->len] = '\0';
+        cl = atoi(buf);
+        if (cl < 0) cl = -1;
+      }
+      nc->user_data = (void *) cl;
+      break;
     }
     case MG_EV_HTTP_PART_BEGIN:
     case MG_EV_HTTP_PART_DATA:
@@ -133,6 +161,7 @@ static void mg_init(struct mg_mgr *mgr) {
   LOG(LL_INFO, ("MG task running"));
 
   stop_nwp(); /* See function description in wifi.c */
+  LOG(LL_INFO, ("Starting NWP..."));
   int role = sl_Start(0, 0, 0);
   if (role < 0) {
     LOG(LL_ERROR, ("Failed to start NWP"));
diff --git a/mongoose.c b/mongoose.c
index 8f95fbca9f71fd7205d4da9afa4aa7e3976890b7..804c8805ea2ccb10727faed374d0c75a2d4b99bf 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -10216,6 +10216,8 @@ off_t fs_slfs_lseek(int fd, off_t offset, int whence);
 int fs_slfs_unlink(const char *filename);
 int fs_slfs_rename(const char *from, const char *to);
 
+void fs_slfs_set_new_file_size(const char *name, size_t size);
+
 #endif /* defined(MG_FS_SLFS) */
 
 #endif /* CS_COMMON_PLATFORMS_SIMPLELINK_SL_FS_SLFS_H_ */
@@ -10253,6 +10255,11 @@ extern int set_errno(int e); /* From sl_fs.c */
 #define FS_SLFS_MAX_FILE_SIZE (64 * 1024)
 #endif
 
+struct sl_file_size_hint {
+  char *name;
+  size_t size;
+};
+
 struct sl_fd_info {
   _i32 fh;
   _off_t pos;
@@ -10260,6 +10267,7 @@ struct sl_fd_info {
 };
 
 static struct sl_fd_info s_sl_fds[MAX_OPEN_SLFS_FILES];
+static struct sl_file_size_hint s_sl_file_size_hints[MAX_OPEN_SLFS_FILES];
 
 static int sl_fs_to_errno(_i32 r) {
   DBG(("SL error: %d", (int) r));
@@ -10309,7 +10317,18 @@ int fs_slfs_open(const char *pathname, int flags, mode_t mode) {
       return set_errno(ENOTSUP);
     }
     if (flags & O_CREAT) {
-      am = FS_MODE_OPEN_CREATE(FS_SLFS_MAX_FILE_SIZE, 0);
+      size_t i, size = FS_SLFS_MAX_FILE_SIZE;
+      for (i = 0; i < MAX_OPEN_SLFS_FILES; i++) {
+        if (s_sl_file_size_hints[i].name != NULL &&
+            strcmp(s_sl_file_size_hints[i].name, pathname) == 0) {
+          size = s_sl_file_size_hints[i].size;
+          free(s_sl_file_size_hints[i].name);
+          s_sl_file_size_hints[i].name = NULL;
+          break;
+        }
+      }
+      DBG(("creating %s with max size %d", pathname, (int) size));
+      am = FS_MODE_OPEN_CREATE(size, 0);
     } else {
       am = FS_MODE_OPEN_WRITE;
     }
@@ -10410,6 +10429,18 @@ int fs_slfs_rename(const char *from, const char *to) {
   return set_errno(ENOTSUP);
 }
 
+void fs_slfs_set_new_file_size(const char *name, size_t size) {
+  int i;
+  for (i = 0; i < MAX_OPEN_SLFS_FILES; i++) {
+    if (s_sl_file_size_hints[i].name == NULL) {
+      DBG(("File size hint: %s %d", name, (int) size));
+      s_sl_file_size_hints[i].name = strdup(name);
+      s_sl_file_size_hints[i].size = size;
+      break;
+    }
+  }
+}
+
 #endif /* defined(MG_FS_SLFS) || defined(CC3200_FS_SLFS) */
 #ifdef MG_MODULE_LINES
 #line 1 "./src/../../common/platforms/simplelink/sl_fs.c"