diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 211eaf06..32f79e5c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -154,4 +154,16 @@ ClientException with SocketException: Connection failed (OS Error: Operation not
 
 You can read more [here](https://docs.flutter.dev/platform-integration/macos/building#setting-up-entitlements)
 
+### Android (Work in Progress)
 
+Add the `multiDexEnabled true` line to the `defaultConfig` section at `android/app/build.gradle file`
+
+```
+android {
+    ...
+    defaultConfig {
+        ...
+        multiDexEnabled true
+    }
+}
+```
diff --git a/assets/completed.json b/assets/completed.json
new file mode 100644
index 00000000..5326bc25
--- /dev/null
+++ b/assets/completed.json
@@ -0,0 +1 @@
+{"v":"5.1.16","fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":500,"h":500,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-158,21],[-63,116],[162,-109]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.129411764706,0.8,0.223529411765,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":36,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":0,"s":[0],"e":[100]},{"t":20.0000008146167}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":-149.000006068894,"op":40.0000016292334,"st":-149.000006068894,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/assets/saving.json b/assets/saving.json
new file mode 100644
index 00000000..0c9ab2f1
--- /dev/null
+++ b/assets/saving.json
@@ -0,0 +1 @@
+{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":25,"ip":0,"op":31,"w":200,"h":200,"nm":"save","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 4","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[101.689,94.053,0],"ix":2},"a":{"a":0,"k":[101.689,94.053,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.25,0.25,0.25],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":13,"s":[100,0,100]},{"i":{"x":[0.67,0.67,0.67],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.67,0.67,0.67],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.75],"y":[0,0,0]},"t":60,"s":[100,100,100]},{"t":68,"s":[100,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0.5,0.985],[-0.5,0.985],[-0.5,-0.985],[0.5,-0.985]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20000000298,0.192156866193,0.196078434587,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[101.689,95.038],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 3","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.213,92.217,0],"ix":2},"a":{"a":0,"k":[100.213,92.217,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.25,0.25,0.25],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":7,"s":[0,0,100]},{"i":{"x":[0.67,0.67,0.67],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"i":{"x":[0.67,0.67,0.67],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.75],"y":[0,0,0]},"t":61,"s":[100,100,100]},{"t":70,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.276,0],[0,0],[0,0.276],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.276,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.276]],"v":[[3.623,3.021],[-3.623,3.021],[-4.123,2.521],[-4.123,-3.021],[-3.123,-3.021],[-3.123,2.021],[3.123,2.021],[3.123,-2.943],[4.123,-2.943],[4.123,2.521]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20000000298,0.192156866193,0.196078434587,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[100.213,95.238],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 2","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.213,109.234,0],"ix":2},"a":{"a":0,"k":[100.213,109.234,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.25,0.25,0.25],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":4,"s":[0,0,100]},{"i":{"x":[0.67,0.67,0.67],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.67,0.67,0.67],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.75],"y":[0,0,0]},"t":62,"s":[100,100,100]},{"t":72,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.37,0],[0,0],[0,-0.37],[0,0],[0,0],[0,0],[-0.921,0],[0,0],[0,-0.921]],"o":[[0,0],[0,0],[0,-0.37],[0,0],[-0.37,0],[0,0],[0,0],[0,0],[0,-0.921],[0,0],[0.921,0],[0,0]],"v":[[5.744,3.929],[4.744,3.929],[4.744,-2.259],[4.074,-2.929],[-4.074,-2.929],[-4.744,-2.259],[-4.744,3.929],[-5.744,3.929],[-5.744,-2.259],[-4.074,-3.929],[4.074,-3.929],[5.744,-2.259]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20000000298,0.192156866193,0.196078434587,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[100.213,105.305],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.739,174.33,0],"ix":2},"a":{"a":0,"k":[100.213,109.734,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.25,0.25,0.25],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.25,0.25,0.25],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":12,"s":[830,830,100]},{"i":{"x":[0.67,0.67,0.67],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[815,815,100]},{"i":{"x":[0.67,0.67,0.67],"y":[1,1,1]},"o":{"x":[0.75,0.75,0.75],"y":[0,0,0]},"t":63,"s":[815,815,100]},{"t":74,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.522,8.036],[8.522,8.036],[8.522,-4.465],[5.185,-7.882],[-8.522,-8.03]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.276,0],[0,0],[0,0.276],[0,0],[-0.095,0.094],[-0.117,0.009],[0,0],[-0.093,-0.095],[0,0],[0,-0.13],[0,0]],"o":[[0,0],[-0.276,0],[0,0],[0,-0.134],[0.095,-0.094],[0,0],[0.133,0.001],[0,0],[0.091,0.093],[0,0],[0,0.276]],"v":[[9.022,9.036],[-9.022,9.036],[-9.522,8.536],[-9.522,-8.536],[-9.374,-8.891],[-9.017,-9.036],[5.403,-8.879],[5.756,-8.729],[9.38,-5.018],[9.522,-4.668],[9.522,8.536]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20000000298,0.192156866193,0.196078434587,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[100.213,100.698],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/lib/consts.dart b/lib/consts.dart
index 25778b2f..53406a91 100644
--- a/lib/consts.dart
+++ b/lib/consts.dart
@@ -9,6 +9,11 @@ const kGitUrl = "https://github.com/foss42/apidash";
 const kIssueUrl = "$kGitUrl/issues";
 const kDefaultUri = "api.apidash.dev";
 
+const kAssetIntroMd = "assets/intro.md";
+const kAssetSendingLottie = "assets/sending.json";
+const kAssetSavingLottie = "assets/saving.json";
+const kAssetSavedLottie = "assets/completed.json";
+
 final kIsMacOS = !kIsWeb && Platform.isMacOS;
 final kIsWindows = !kIsWeb && Platform.isWindows;
 final kIsLinux = !kIsWeb && Platform.isLinux;
@@ -24,6 +29,7 @@ final kColorTransparentState =
     MaterialStateProperty.all<Color>(Colors.transparent);
 const kColorTransparent = Colors.transparent;
 const kColorWhite = Colors.white;
+const kColorBlack = Colors.black;
 const kColorRed = Colors.red;
 final kColorLightDanger = Colors.red.withOpacity(0.9);
 const kColorDarkDanger = Color(0xffcf6679);
@@ -46,6 +52,7 @@ final kCodeStyle = TextStyle(
 
 const kHintOpacity = 0.6;
 const kForegroundOpacity = 0.05;
+const kOverlayBackgroundOpacity = 0.5;
 
 const kTextStyleButton = TextStyle(fontWeight: FontWeight.bold);
 const kTextStyleButtonSmall = TextStyle(fontSize: 12);
@@ -80,6 +87,7 @@ const kPh20t40 = EdgeInsets.only(
   top: 40,
 );
 const kPh60 = EdgeInsets.symmetric(horizontal: 60);
+const kPh60v60 = EdgeInsets.symmetric(vertical: 60, horizontal: 60);
 const kP24CollectionPane = EdgeInsets.only(
   top: 24,
   left: 4.0,
@@ -515,3 +523,5 @@ const kLabelBusy = "Busy";
 const kLabelCopy = "Copy";
 const kLabelSave = "Save";
 const kLabelDownload = "Download";
+const kLabelSaving = "Saving";
+const kLabelSaved = "Saved";
diff --git a/lib/screens/home_page/collection_pane.dart b/lib/screens/home_page/collection_pane.dart
index c70db3ad..fd0b518a 100644
--- a/lib/screens/home_page/collection_pane.dart
+++ b/lib/screens/home_page/collection_pane.dart
@@ -12,7 +12,7 @@ class CollectionPane extends ConsumerWidget {
 
   @override
   Widget build(BuildContext context, WidgetRef ref) {
-    var sm = ScaffoldMessenger.of(context);
+    final overlayWidget = OverlayWidgetTemplate(context: context);
     final collection = ref.watch(collectionStateNotifierProvider);
     final savingData = ref.watch(saveDataStateProvider);
     if (collection == null) {
@@ -34,12 +34,18 @@ class CollectionPane extends ConsumerWidget {
                   onPressed: savingData
                       ? null
                       : () async {
+                          overlayWidget.show(
+                              widget:
+                                  const SavingOverlay(saveCompleted: false));
+
                           await ref
                               .read(collectionStateNotifierProvider.notifier)
                               .saveData();
-
-                          sm.hideCurrentSnackBar();
-                          sm.showSnackBar(getSnackBar("Saved"));
+                          overlayWidget.hide();
+                          overlayWidget.show(
+                              widget: const SavingOverlay(saveCompleted: true));
+                          await Future.delayed(const Duration(seconds: 1));
+                          overlayWidget.hide();
                         },
                   icon: const Icon(
                     Icons.save,
diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart
index a0018b73..59b17a6e 100644
--- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart
+++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_form_data.dart
@@ -17,19 +17,36 @@ class FormDataWidget extends ConsumerStatefulWidget {
 class _FormDataBodyState extends ConsumerState<FormDataWidget> {
   late int seed;
   final random = Random.secure();
-  late List<FormDataModel> rows;
+  late List<FormDataModel> formRows;
+
   @override
   void initState() {
     super.initState();
     seed = random.nextInt(kRandMax);
   }
 
+  void _onFieldChange(String selectedId) {
+    ref.read(collectionStateNotifierProvider.notifier).update(
+          selectedId,
+          requestFormDataList: formRows.sublist(0, formRows.length - 1),
+        );
+  }
+
   @override
   Widget build(BuildContext context) {
     final selectedId = ref.watch(selectedIdStateProvider);
-    var formRows = ref.read(selectedRequestModelProvider)?.requestFormDataList;
-    rows =
-        formRows == null || formRows.isEmpty ? [kFormDataEmptyModel] : formRows;
+    ref.watch(selectedRequestModelProvider
+        .select((value) => value?.requestFormDataList?.length));
+    var rF = ref.read(selectedRequestModelProvider)?.requestFormDataList;
+    bool isFormDataEmpty = rF == null || rF.isEmpty;
+    formRows = isFormDataEmpty
+        ? [
+            kFormDataEmptyModel,
+          ]
+        : rF +
+            [
+              kFormDataEmptyModel,
+            ];
 
     List<DataColumn> columns = const [
       DataColumn2(
@@ -55,18 +72,20 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
     ];
 
     List<DataRow> dataRows = List<DataRow>.generate(
-      rows.length,
+      formRows.length,
       (index) {
+        bool isLast = index + 1 == formRows.length;
         return DataRow(
           key: ValueKey("$selectedId-$index-form-row-$seed"),
           cells: <DataCell>[
             DataCell(
               CellField(
                 keyId: "$selectedId-$index-form-k-$seed",
-                initialValue: rows[index].name,
+                initialValue: formRows[index].name,
                 hintText: " Add Key",
                 onChanged: (value) {
-                  rows[index] = rows[index].copyWith(name: value);
+                  formRows[index] = formRows[index].copyWith(name: value);
+                  if (isLast) formRows.add(kFormDataEmptyModel);
                   _onFieldChange(selectedId!);
                 },
                 colorScheme: Theme.of(context).colorScheme,
@@ -80,19 +99,22 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
             ),
             DataCell(
               DropdownButtonFormData(
-                formDataType: rows[index].type,
+                formDataType: formRows[index].type,
                 onChanged: (value) {
-                  rows[index] = rows[index].copyWith(
+                  bool hasChanged = formRows[index].type != value;
+                  formRows[index] = formRows[index].copyWith(
                     type: value ?? FormDataType.text,
                   );
-                  rows[index] = rows[index].copyWith(value: "");
-                  setState(() {});
+                  formRows[index] = formRows[index].copyWith(value: "");
+                  if (isLast && hasChanged) {
+                    formRows.add(kFormDataEmptyModel);
+                  }
                   _onFieldChange(selectedId!);
                 },
               ),
             ),
             DataCell(
-              rows[index].type == FormDataType.file
+              formRows[index].type == FormDataType.file
                   ? ElevatedButton.icon(
                       icon: const Icon(
                         Icons.snippet_folder_rounded,
@@ -109,7 +131,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
                         if (pickedResult != null &&
                             pickedResult.files.isNotEmpty &&
                             pickedResult.files.first.path != null) {
-                          rows[index] = rows[index].copyWith(
+                          formRows[index] = formRows[index].copyWith(
                             value: pickedResult.files.first.path!,
                           );
                           setState(() {});
@@ -117,9 +139,9 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
                         }
                       },
                       label: Text(
-                        (rows[index].type == FormDataType.file &&
-                                rows[index].value.isNotEmpty)
-                            ? rows[index].value.toString()
+                        (formRows[index].type == FormDataType.file &&
+                                formRows[index].value.isNotEmpty)
+                            ? formRows[index].value.toString()
                             : "Select File",
                         overflow: TextOverflow.ellipsis,
                         style: kFormDataButtonLabelTextStyle,
@@ -127,10 +149,12 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
                     )
                   : CellField(
                       keyId: "$selectedId-$index-form-v-$seed",
-                      initialValue: rows[index].value,
+                      initialValue: formRows[index].value,
                       hintText: " Add Value",
                       onChanged: (value) {
-                        rows[index] = rows[index].copyWith(value: value);
+                        formRows[index] =
+                            formRows[index].copyWith(value: value);
+                        if (isLast) formRows.add(kFormDataEmptyModel);
                         _onFieldChange(selectedId!);
                       },
                       colorScheme: Theme.of(context).colorScheme,
@@ -138,21 +162,24 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
             ),
             DataCell(
               InkWell(
+                onTap: isLast
+                    ? null
+                    : () {
+                        seed = random.nextInt(kRandMax);
+                        if (formRows.length == 2) {
+                          setState(() {
+                            formRows = [
+                              kFormDataEmptyModel,
+                            ];
+                          });
+                        } else {
+                          formRows.removeAt(index);
+                        }
+                        _onFieldChange(selectedId!);
+                      },
                 child: Theme.of(context).brightness == Brightness.dark
                     ? kIconRemoveDark
                     : kIconRemoveLight,
-                onTap: () {
-                  seed = random.nextInt(kRandMax);
-                  if (rows.length == 1) {
-                    setState(() {
-                      rows = [kFormDataEmptyModel];
-                    });
-                  } else {
-                    rows.removeAt(index);
-                  }
-                  _onFieldChange(selectedId!);
-                  setState(() {});
-                },
               ),
             ),
           ],
@@ -196,9 +223,7 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
             padding: const EdgeInsets.only(bottom: 30),
             child: ElevatedButton.icon(
               onPressed: () {
-                setState(() {
-                  rows.add(kFormDataEmptyModel);
-                });
+                formRows.add(kFormDataEmptyModel);
                 _onFieldChange(selectedId!);
               },
               icon: const Icon(Icons.add),
@@ -212,11 +237,4 @@ class _FormDataBodyState extends ConsumerState<FormDataWidget> {
       ],
     );
   }
-
-  void _onFieldChange(String selectedId) {
-    ref.read(collectionStateNotifierProvider.notifier).update(
-          selectedId,
-          requestFormDataList: rows,
-        );
-  }
 }
diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart
index dde0020b..9ba4ae54 100644
--- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart
+++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart
@@ -15,10 +15,10 @@ class EditRequestHeaders extends ConsumerStatefulWidget {
 }
 
 class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
-  final random = Random.secure();
-  late List<NameValueModel> rows;
-  late List<bool> isRowEnabledList;
   late int seed;
+  final random = Random.secure();
+  late List<NameValueModel> headerRows;
+  late List<bool> isRowEnabledList;
 
   @override
   void initState() {
@@ -29,8 +29,9 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
   void _onFieldChange(String selectedId) {
     ref.read(collectionStateNotifierProvider.notifier).update(
           selectedId,
-          requestHeaders: rows,
-          isHeaderEnabledList: isRowEnabledList,
+          requestHeaders: headerRows.sublist(0, headerRows.length - 1),
+          isHeaderEnabledList:
+              isRowEnabledList.sublist(0, headerRows.length - 1),
         );
   }
 
@@ -40,14 +41,16 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
     ref.watch(selectedRequestModelProvider
         .select((value) => value?.requestHeaders?.length));
     var rH = ref.read(selectedRequestModelProvider)?.requestHeaders;
-    rows = (rH == null || rH.isEmpty)
+    bool isHeadersEmpty = rH == null || rH.isEmpty;
+    headerRows = isHeadersEmpty
         ? [
             kNameValueEmptyModel,
           ]
-        : rH;
+        : rH + [kNameValueEmptyModel];
     isRowEnabledList =
         ref.read(selectedRequestModelProvider)?.isHeaderEnabledList ??
-            List.filled(rows.length, true, growable: true);
+            List.filled(rH?.length ?? 0, true, growable: true);
+    isRowEnabledList.add(false);
 
     List<DataColumn> columns = const [
       DataColumn2(
@@ -71,8 +74,9 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
     ];
 
     List<DataRow> dataRows = List<DataRow>.generate(
-      rows.length,
+      headerRows.length,
       (index) {
+        bool isLast = index + 1 == headerRows.length;
         return DataRow(
           key: ValueKey("$selectedId-$index-headers-row-$seed"),
           cells: <DataCell>[
@@ -80,22 +84,29 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
               CheckBox(
                 keyId: "$selectedId-$index-headers-c-$seed",
                 value: isRowEnabledList[index],
-                onChanged: (value) {
-                  setState(() {
-                    isRowEnabledList[index] = value!;
-                  });
-                  _onFieldChange(selectedId!);
-                },
+                onChanged: isLast
+                    ? null
+                    : (value) {
+                        setState(() {
+                          isRowEnabledList[index] = value!;
+                        });
+                        _onFieldChange(selectedId!);
+                      },
                 colorScheme: Theme.of(context).colorScheme,
               ),
             ),
             DataCell(
               HeaderField(
                 keyId: "$selectedId-$index-headers-k-$seed",
-                initialValue: rows[index].name,
+                initialValue: headerRows[index].name,
                 hintText: "Add Header Name",
                 onChanged: (value) {
-                  rows[index] = rows[index].copyWith(name: value);
+                  headerRows[index] = headerRows[index].copyWith(name: value);
+                  if (isLast) {
+                    isRowEnabledList[index] = true;
+                    headerRows.add(kNameValueEmptyModel);
+                    isRowEnabledList.add(false);
+                  }
                   _onFieldChange(selectedId!);
                 },
                 colorScheme: Theme.of(context).colorScheme,
@@ -110,10 +121,15 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
             DataCell(
               CellField(
                 keyId: "$selectedId-$index-headers-v-$seed",
-                initialValue: rows[index].value,
+                initialValue: headerRows[index].value,
                 hintText: " Add Header Value",
                 onChanged: (value) {
-                  rows[index] = rows[index].copyWith(value: value);
+                  headerRows[index] = headerRows[index].copyWith(value: value);
+                  if (isLast) {
+                    isRowEnabledList[index] = true;
+                    headerRows.add(kNameValueEmptyModel);
+                    isRowEnabledList.add(false);
+                  }
                   _onFieldChange(selectedId!);
                 },
                 colorScheme: Theme.of(context).colorScheme,
@@ -121,24 +137,26 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
             ),
             DataCell(
               InkWell(
+                onTap: isLast
+                    ? null
+                    : () {
+                        seed = random.nextInt(kRandMax);
+                        if (headerRows.length == 2) {
+                          setState(() {
+                            headerRows = [
+                              kNameValueEmptyModel,
+                            ];
+                            isRowEnabledList = [false];
+                          });
+                        } else {
+                          headerRows.removeAt(index);
+                          isRowEnabledList.removeAt(index);
+                        }
+                        _onFieldChange(selectedId!);
+                      },
                 child: Theme.of(context).brightness == Brightness.dark
                     ? kIconRemoveDark
                     : kIconRemoveLight,
-                onTap: () {
-                  seed = random.nextInt(kRandMax);
-                  if (rows.length == 1) {
-                    setState(() {
-                      rows = [
-                        kNameValueEmptyModel,
-                      ];
-                      isRowEnabledList = [true];
-                    });
-                  } else {
-                    rows.removeAt(index);
-                    isRowEnabledList.removeAt(index);
-                  }
-                  _onFieldChange(selectedId!);
-                },
               ),
             ),
           ],
@@ -182,8 +200,8 @@ class EditRequestHeadersState extends ConsumerState<EditRequestHeaders> {
             padding: const EdgeInsets.only(bottom: 30),
             child: ElevatedButton.icon(
               onPressed: () {
-                rows.add(kNameValueEmptyModel);
-                isRowEnabledList.add(true);
+                headerRows.add(kNameValueEmptyModel);
+                isRowEnabledList.add(false);
                 _onFieldChange(selectedId!);
               },
               icon: const Icon(Icons.add),
diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart
index d0552e44..e6c78bf3 100644
--- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart
+++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart
@@ -16,10 +16,10 @@ class EditRequestURLParams extends ConsumerStatefulWidget {
 }
 
 class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
-  final random = Random.secure();
-  late List<NameValueModel> rows;
-  late List<bool> isRowEnabledList;
   late int seed;
+  final random = Random.secure();
+  late List<NameValueModel> paramRows;
+  late List<bool> isRowEnabledList;
 
   @override
   void initState() {
@@ -30,8 +30,8 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
   void _onFieldChange(String selectedId) {
     ref.read(collectionStateNotifierProvider.notifier).update(
           selectedId,
-          requestParams: rows,
-          isParamEnabledList: isRowEnabledList,
+          requestParams: paramRows.sublist(0, paramRows.length - 1),
+          isParamEnabledList: isRowEnabledList.sublist(0, paramRows.length - 1),
         );
   }
 
@@ -41,14 +41,16 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
     ref.watch(selectedRequestModelProvider
         .select((value) => value?.requestParams?.length));
     var rP = ref.read(selectedRequestModelProvider)?.requestParams;
-    rows = (rP == null || rP.isEmpty)
+    bool isParamsEmpty = rP == null || rP.isEmpty;
+    paramRows = isParamsEmpty
         ? [
             kNameValueEmptyModel,
           ]
-        : rP;
+        : rP + [kNameValueEmptyModel];
     isRowEnabledList =
         ref.read(selectedRequestModelProvider)?.isParamEnabledList ??
-            List.filled(rows.length, true, growable: true);
+            List.filled(rP?.length ?? 0, true, growable: true);
+    isRowEnabledList.add(false);
 
     List<DataColumn> columns = const [
       DataColumn2(
@@ -72,8 +74,9 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
     ];
 
     List<DataRow> dataRows = List<DataRow>.generate(
-      rows.length,
+      paramRows.length,
       (index) {
+        bool isLast = index + 1 == paramRows.length;
         return DataRow(
           key: ValueKey("$selectedId-$index-params-row-$seed"),
           cells: <DataCell>[
@@ -81,22 +84,29 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
               CheckBox(
                 keyId: "$selectedId-$index-params-c-$seed",
                 value: isRowEnabledList[index],
-                onChanged: (value) {
-                  setState(() {
-                    isRowEnabledList[index] = value!;
-                  });
-                  _onFieldChange(selectedId!);
-                },
+                onChanged: isLast
+                    ? null
+                    : (value) {
+                        setState(() {
+                          isRowEnabledList[index] = value!;
+                        });
+                        _onFieldChange(selectedId!);
+                      },
                 colorScheme: Theme.of(context).colorScheme,
               ),
             ),
             DataCell(
               CellField(
                 keyId: "$selectedId-$index-params-k-$seed",
-                initialValue: rows[index].name,
+                initialValue: paramRows[index].name,
                 hintText: "Add URL Parameter",
                 onChanged: (value) {
-                  rows[index] = rows[index].copyWith(name: value);
+                  paramRows[index] = paramRows[index].copyWith(name: value);
+                  if (isLast) {
+                    isRowEnabledList[index] = true;
+                    paramRows.add(kNameValueEmptyModel);
+                    isRowEnabledList.add(false);
+                  }
                   _onFieldChange(selectedId!);
                 },
                 colorScheme: Theme.of(context).colorScheme,
@@ -111,10 +121,15 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
             DataCell(
               CellField(
                 keyId: "$selectedId-$index-params-v-$seed",
-                initialValue: rows[index].value,
+                initialValue: paramRows[index].value,
                 hintText: "Add Value",
                 onChanged: (value) {
-                  rows[index] = rows[index].copyWith(value: value);
+                  paramRows[index] = paramRows[index].copyWith(value: value);
+                  if (isLast) {
+                    isRowEnabledList[index] = true;
+                    paramRows.add(kNameValueEmptyModel);
+                    isRowEnabledList.add(false);
+                  }
                   _onFieldChange(selectedId!);
                 },
                 colorScheme: Theme.of(context).colorScheme,
@@ -122,24 +137,26 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
             ),
             DataCell(
               InkWell(
+                onTap: isLast
+                    ? null
+                    : () {
+                        seed = random.nextInt(kRandMax);
+                        if (paramRows.length == 2) {
+                          setState(() {
+                            paramRows = [
+                              kNameValueEmptyModel,
+                            ];
+                            isRowEnabledList = [false];
+                          });
+                        } else {
+                          paramRows.removeAt(index);
+                          isRowEnabledList.removeAt(index);
+                        }
+                        _onFieldChange(selectedId!);
+                      },
                 child: Theme.of(context).brightness == Brightness.dark
                     ? kIconRemoveDark
                     : kIconRemoveLight,
-                onTap: () {
-                  seed = random.nextInt(kRandMax);
-                  if (rows.length == 1) {
-                    setState(() {
-                      rows = [
-                        kNameValueEmptyModel,
-                      ];
-                      isRowEnabledList = [true];
-                    });
-                  } else {
-                    rows.removeAt(index);
-                    isRowEnabledList.removeAt(index);
-                  }
-                  _onFieldChange(selectedId!);
-                },
               ),
             ),
           ],
@@ -184,8 +201,8 @@ class EditRequestURLParamsState extends ConsumerState<EditRequestURLParams> {
             padding: const EdgeInsets.only(bottom: 30),
             child: ElevatedButton.icon(
               onPressed: () {
-                rows.add(kNameValueEmptyModel);
-                isRowEnabledList.add(true);
+                paramRows.add(kNameValueEmptyModel);
+                isRowEnabledList.add(false);
                 _onFieldChange(selectedId!);
               },
               icon: const Icon(Icons.add),
diff --git a/lib/widgets/checkbox.dart b/lib/widgets/checkbox.dart
index 22c3869f..53adf496 100644
--- a/lib/widgets/checkbox.dart
+++ b/lib/widgets/checkbox.dart
@@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
 class CheckBox extends StatelessWidget {
   final String keyId;
   final bool value;
-  final ValueChanged<bool?> onChanged;
+  final ValueChanged<bool?>? onChanged;
   final ColorScheme? colorScheme;
   const CheckBox({
     super.key,
diff --git a/lib/widgets/intro_message.dart b/lib/widgets/intro_message.dart
index 7e7ff2e0..e4e4f49a 100644
--- a/lib/widgets/intro_message.dart
+++ b/lib/widgets/intro_message.dart
@@ -16,7 +16,7 @@ class IntroMessage extends StatelessWidget {
     late final String version;
 
     Future<void> introData() async {
-      text = await rootBundle.loadString('assets/intro.md');
+      text = await rootBundle.loadString(kAssetIntroMd);
       version = (await PackageInfo.fromPlatform()).version;
     }
 
diff --git a/lib/widgets/overlay_widget.dart b/lib/widgets/overlay_widget.dart
new file mode 100644
index 00000000..ed800521
--- /dev/null
+++ b/lib/widgets/overlay_widget.dart
@@ -0,0 +1,63 @@
+import 'package:flutter/material.dart';
+import 'package:lottie/lottie.dart';
+import '../consts.dart';
+
+class OverlayWidgetTemplate {
+  OverlayEntry? _overlay;
+  BuildContext context;
+  OverlayState? _overlayState;
+  OverlayWidgetTemplate({required this.context}) {
+    _overlayState = Overlay.of(context);
+  }
+
+  void show({required Widget widget}) {
+    if (_overlay == null) {
+      _overlay = OverlayEntry(
+        // replace with your own layout
+        builder: (context) => ColoredBox(
+            color: kColorBlack.withOpacity(kOverlayBackgroundOpacity),
+            child: widget),
+      );
+      _overlayState!.insert(_overlay!);
+    }
+  }
+
+  void hide() {
+    if (_overlay != null) {
+      _overlay?.remove();
+      _overlay = null;
+    }
+  }
+}
+
+class SavingOverlay extends StatelessWidget {
+  final bool saveCompleted;
+  const SavingOverlay({super.key, required this.saveCompleted});
+
+  @override
+  Widget build(BuildContext context) {
+    return Center(
+      child: Card(
+        child: Padding(
+          padding: kPh60v60,
+          child: Column(
+            mainAxisSize: MainAxisSize.min,
+            children: [
+              Lottie.asset(
+                  saveCompleted ? kAssetSavedLottie : kAssetSavingLottie,
+                  width: 100,
+                  height: 100),
+              kHSpacer20,
+              Text(
+                saveCompleted ? kLabelSaved : kLabelSaving,
+                style: const TextStyle(
+                  fontSize: kDefaultFontSize,
+                ),
+              )
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+}
diff --git a/lib/widgets/response_widgets.dart b/lib/widgets/response_widgets.dart
index adf74985..e641b03d 100644
--- a/lib/widgets/response_widgets.dart
+++ b/lib/widgets/response_widgets.dart
@@ -42,7 +42,7 @@ class SendingWidget extends StatelessWidget {
       child: Column(
         mainAxisAlignment: MainAxisAlignment.center,
         children: [
-          Lottie.asset("assets/sending.json"),
+          Lottie.asset(kAssetSendingLottie),
         ],
       ),
     );
diff --git a/lib/widgets/widgets.dart b/lib/widgets/widgets.dart
index 0a4c8eaa..4d249939 100644
--- a/lib/widgets/widgets.dart
+++ b/lib/widgets/widgets.dart
@@ -12,6 +12,7 @@ export 'intro_message.dart';
 export 'json_previewer.dart';
 export 'markdown.dart';
 export 'menus.dart';
+export 'overlay_widget.dart';
 export 'previewer.dart';
 export 'request_widgets.dart';
 export 'response_widgets.dart';
diff --git a/test/widgets/overlay_widget_test.dart b/test/widgets/overlay_widget_test.dart
new file mode 100644
index 00000000..288c4798
--- /dev/null
+++ b/test/widgets/overlay_widget_test.dart
@@ -0,0 +1,58 @@
+import 'package:apidash/consts.dart';
+import 'package:apidash/widgets/overlay_widget.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:lottie/lottie.dart';
+
+void main() {
+  testWidgets('OverlayWidgetTemplate Test', (WidgetTester tester) async {
+    late OverlayWidgetTemplate overlayWidget;
+
+    await tester.pumpWidget(
+      MaterialApp(
+        home: Builder(
+          builder: (BuildContext context) {
+            overlayWidget = OverlayWidgetTemplate(context: context);
+            return Container(); // Return any widget here, as OverlayWidgetTemplate doesn't return a widget
+          },
+        ),
+      ),
+    );
+
+    overlayWidget.show(widget: const Text('Test'));
+    await tester.pump();
+    expect(find.text('Test'), findsOneWidget);
+
+    overlayWidget.hide();
+    await tester.pump();
+    expect(find.text('Test'), findsNothing);
+  });
+
+  testWidgets('SavingOverlay Test', (WidgetTester tester) async {
+    await tester.pumpWidget(
+      const MaterialApp(
+        home: Scaffold(
+          body: SavingOverlay(
+            saveCompleted: false,
+          ),
+        ),
+      ),
+    );
+    expect(find.byType(Card), findsOneWidget);
+    expect(find.byType(Lottie), findsOneWidget);
+    expect(find.text(kLabelSaving), findsOneWidget);
+
+    await tester.pumpWidget(
+      const MaterialApp(
+        home: Scaffold(
+          body: SavingOverlay(
+            saveCompleted: true,
+          ),
+        ),
+      ),
+    );
+    expect(find.byType(Card), findsOneWidget);
+    expect(find.byType(Lottie), findsOneWidget);
+    expect(find.text(kLabelSaved), findsOneWidget);
+  });
+}