diff --git a/LibTest/html/HttpRequestUpload/onAbort_A01_t01.dart b/LibTest/html/HttpRequestUpload/onAbort_A01_t01.dart
index 5ef971d..eafdda9 100644
--- a/LibTest/html/HttpRequestUpload/onAbort_A01_t01.dart
+++ b/LibTest/html/HttpRequestUpload/onAbort_A01_t01.dart
@@ -6,18 +6,37 @@
 /// Stream of abort events handled by this HttpRequestEventTarget.
 /// @description Checks the state an event is fired when the request is aborted.
 /// @Issue https://github.com/dart-lang/co19/issues/932
-
 import "dart:html";
 import "../../../Utils/expect.dart";
 
+int get crossOriginPort {
+  var searchUrl = window.location.search!;
+  var crossOriginStr = 'crossOriginPort=';
+  var index = searchUrl.indexOf(crossOriginStr);
+  var nextArg = searchUrl.indexOf('&', index);
+  return int.parse(searchUrl.substring(index + crossOriginStr.length,
+      nextArg == -1 ? searchUrl.length : nextArg));
+}
+
+var port = crossOriginPort;
+var host = '${window.location.protocol}//${window.location.hostname}:$port';
+
 main() {
-  var request = new HttpRequest();
-  HttpRequestUpload upload = request.upload;
-  request.open('GET', "test.dart");
-  upload.onAbort.listen((event) {
+  FormData data = FormData();
+  List<String> file_contents = ["Lily was here"];
+  Blob blob = new Blob(file_contents, 'text/plain', 'native');
+  data.appendBlob("uploadData", blob);
+
+  var url = '$host/upload';
+  final r = new HttpRequest();
+  r.open("POST", url);
+  HttpRequestUpload upload = r.upload;
+  asyncStart();
+  upload.onAbort.listen((ProgressEvent event) {
+    Expect.isNotNull(event.loaded);
+    Expect.isTrue(event.loaded! == 0);
     asyncEnd();
   });
-  asyncStart();
-  request.send();
-  request.abort();
+  r.send(data);
+  r.abort();
 }
diff --git a/LibTest/html/HttpRequestUpload/onError_A01_t01.dart b/LibTest/html/HttpRequestUpload/onError_A01_t01.dart
new file mode 100644
index 0000000..f8825c1
--- /dev/null
+++ b/LibTest/html/HttpRequestUpload/onError_A01_t01.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// @assertion Stream<ProgressEvent> get onError
+/// Stream of error events handled by this HttpRequestEventTarget.
+/// @description Checks that an error events issued when attemt to FET unexistent
+/// resourse is made and error 404 returned.
+/// @Issue #16757
+/// @Issue https://github.com/dart-lang/co19/issues/932
+
+import "dart:html";
+import "../../../Utils/expect.dart";
+
+int get crossOriginPort {
+  var searchUrl = window.location.search!;
+  var crossOriginStr = 'crossOriginPort=';
+  var index = searchUrl.indexOf(crossOriginStr);
+  var nextArg = searchUrl.indexOf('&', index);
+  return int.parse(searchUrl.substring(index + crossOriginStr.length,
+      nextArg == -1 ? searchUrl.length : nextArg));
+}
+
+var port = crossOriginPort;
+var host = '${window.location.protocol}//${window.location.hostname}:$port';
+
+main() {
+  FormData data = FormData();
+  List<String> file_contents = ["Lily was here"];
+  Blob blob = new Blob(file_contents, 'text/plain', 'native');
+  data.appendBlob("uploadData", blob);
+
+  var url = '$host/IntentionallyMissingFile';
+  final r = new HttpRequest();
+  r.open("POST", url);
+  HttpRequestUpload upload = r.upload;
+  asyncStart();
+  upload.onError.listen((ProgressEvent event) {
+    Expect.isNotNull(event.loaded);
+    Expect.isTrue(event.loaded! == 0);
+    asyncEnd();
+  });
+  r.send(data);
+}
diff --git a/LibTest/html/HttpRequestUpload/onError_A01_t02.dart b/LibTest/html/HttpRequestUpload/onError_A01_t02.dart
deleted file mode 100644
index aa12a03..0000000
--- a/LibTest/html/HttpRequestUpload/onError_A01_t02.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// @assertion Stream<ProgressEvent> get onError
-/// Stream of error events handled by this HttpRequestEventTarget.
-/// @description Checks that an error events issued when attemt to FET unexistent
-/// resourse is made and error 404 returned.
-/// @Issue #16757
-/// @Issue https://github.com/dart-lang/co19/issues/932
-
-import "dart:html";
-import "../../../Utils/expect.dart";
-
-main() {
-  HttpRequest request = new HttpRequest();
-  HttpRequestUpload upload = request.upload;
-  request.open('GET', "IntentionallyMissingFile");
-  asyncStart();
-  upload.onError.listen((event) {
-    asyncEnd();
-  });
-  request.send();
-}
diff --git a/LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01.dart b/LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01.dart
index db926c4..190f171 100644
--- a/LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01.dart
+++ b/LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01.dart
@@ -5,21 +5,39 @@
 /// @assertion Stream<ProgressEvent> get onLoadEnd
 /// Stream of loadend events handled by this HttpRequestEventTarget.
 /// @description Checks that only single event is fired.
+/// @author sgrekhov@unipro.ru
 /// @Issue https://github.com/dart-lang/co19/issues/932
 
 import "dart:html";
 import "../../../Utils/expect.dart";
 
+int get crossOriginPort {
+  var searchUrl = window.location.search!;
+  var crossOriginStr = 'crossOriginPort=';
+  var index = searchUrl.indexOf(crossOriginStr);
+  var nextArg = searchUrl.indexOf('&', index);
+  return int.parse(searchUrl.substring(index + crossOriginStr.length,
+      nextArg == -1 ? searchUrl.length : nextArg));
+}
+
+var port = crossOriginPort;
+var host = '${window.location.protocol}//${window.location.hostname}:$port';
+
 main() {
-  HttpRequest request = new HttpRequest();
-  HttpRequestUpload upload = request.upload;
-  bool first = true;
-  request.open('GET', "test.dart");
+  FormData data = FormData();
+  List<String> file_contents = ["Lily was here"];
+  Blob blob = new Blob(file_contents, 'text/plain', 'native');
+  data.appendBlob("uploadData", blob);
+
+  var url = '$host/upload';
+  final r = new HttpRequest();
+  r.open("POST", url);
+  HttpRequestUpload upload = r.upload;
   asyncStart();
-  upload.onLoadEnd.listen((event) {
-    Expect.isTrue(first);
-    first = false;
+  upload.onLoadEnd.listen((ProgressEvent event) {
+    Expect.isNotNull(event.loaded);
+    Expect.isTrue(event.loaded! > 0);
     asyncEnd();
   });
-  request.send();
+  r.send(data);
 }
diff --git a/LibTest/html/HttpRequestUpload/onLoadStart_A01_t01.dart b/LibTest/html/HttpRequestUpload/onLoadStart_A01_t01.dart
index f0e6089..96e4449 100644
--- a/LibTest/html/HttpRequestUpload/onLoadStart_A01_t01.dart
+++ b/LibTest/html/HttpRequestUpload/onLoadStart_A01_t01.dart
@@ -5,21 +5,39 @@
 /// @assertion Stream<ProgressEvent> get onLoadStart
 /// Stream of loadstart events handled by this HttpRequestEventTarget.
 /// @description Checks that only single event is fired.
+/// @author sgrekhov@unipro.ru
 /// @Issue https://github.com/dart-lang/co19/issues/932
 
 import "dart:html";
 import "../../../Utils/expect.dart";
 
+int get crossOriginPort {
+  var searchUrl = window.location.search!;
+  var crossOriginStr = 'crossOriginPort=';
+  var index = searchUrl.indexOf(crossOriginStr);
+  var nextArg = searchUrl.indexOf('&', index);
+  return int.parse(searchUrl.substring(index + crossOriginStr.length,
+      nextArg == -1 ? searchUrl.length : nextArg));
+}
+
+var port = crossOriginPort;
+var host = '${window.location.protocol}//${window.location.hostname}:$port';
+
 main() {
-  HttpRequest request = new HttpRequest();
-  HttpRequestUpload upload = request.upload;
-  bool first = true;
-  request.open('GET', "test.dart");
+  FormData data = FormData();
+  List<String> file_contents = ["Lily was here"];
+  Blob blob = new Blob(file_contents, 'text/plain', 'native');
+  data.appendBlob("uploadData", blob);
+
+  var url = '$host/upload';
+  final r = new HttpRequest();
+  r.open("POST", url);
+  HttpRequestUpload upload = r.upload;
   asyncStart();
-  upload.onLoadStart.listen((event) {
-    Expect.isTrue(first);
-    first = false;
+  upload.onLoadStart.listen((ProgressEvent event) {
+    Expect.isNotNull(event.loaded);
+    Expect.isTrue(event.loaded! == 0);
     asyncEnd();
   });
-  request.send();
+  r.send(data);
 }
diff --git a/LibTest/html/HttpRequestUpload/onLoad_A01_t01.dart b/LibTest/html/HttpRequestUpload/onLoad_A01_t01.dart
index ec88c3b..61f1571 100644
--- a/LibTest/html/HttpRequestUpload/onLoad_A01_t01.dart
+++ b/LibTest/html/HttpRequestUpload/onLoad_A01_t01.dart
@@ -5,6 +5,7 @@
 /// @assertion final Stream<ProgressEvent> onLoad
 /// Stream of load events handled by this HttpRequestEventTarget.
 /// @description Checks the state of request at various moments of time.
+/// @author sgrekhov@unipro.ru
 /// @Issue https://github.com/dart-lang/co19/issues/932
 
 import "dart:html";
@@ -12,7 +13,6 @@
 
 int get crossOriginPort {
   var searchUrl = window.location.search!;
-  print("SearchURL=" + searchUrl);
   var crossOriginStr = 'crossOriginPort=';
   var index = searchUrl.indexOf(crossOriginStr);
   var nextArg = searchUrl.indexOf('&', index);
@@ -24,34 +24,20 @@
 var host = '${window.location.protocol}//${window.location.hostname}:$port';
 
 main() {
-  HttpRequest request = new HttpRequest();
-  var url = '$host/root_dart/tests/co19/src/LibTest/html/xhr_cross_origin_data.txt';
-  request.open('GET', url);
-  Expect.equals(HttpRequest.OPENED, request.readyState, "after open");
-  print("Log 1");
-  HttpRequestUpload upload = request.upload;
+  FormData data = FormData();
+  List<String> file_contents = ["Lily was here"];
+  Blob blob = new Blob(file_contents, 'text/plain', 'native');
+  data.appendBlob("uploadData", blob);
+
+  var url = '$host/upload';
+  final r = new HttpRequest();
+  r.open("POST", url);
+  HttpRequestUpload upload = r.upload;
   asyncStart();
-  print("Log 2");
-  upload.onLoad.listen((event) {
-    print("Log 5");
-    switch (request.readyState) {
-      case HttpRequest.DONE:
-        asyncEnd();
-        break;
-      case HttpRequest.HEADERS_RECEIVED:
-        break;
-      case HttpRequest.LOADING:
-        break;
-      default:
-        Expect.fail(
-            "request.onLoad.listen: unexpected readyState:${request.readyState}");
-    }
-  }, onError: (Object error) {
-    print("Log 6");
-    Expect.fail("request.onLoad.listen:onError($error)");
+  upload.onLoad.listen((ProgressEvent event) {
+    Expect.isNotNull(event.loaded);
+    Expect.isTrue(event.loaded! > 0);
+    asyncEnd();
   });
-  print("Log 3");
-  request.send();
-  print("Log 4");
-  Expect.equals(HttpRequest.OPENED, request.readyState, "after send");
+  r.send(data);
 }
