diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index f6b889804f6bca1cfaba4cbb461de77e6d668547..c64169c769251e212ad1086c9cb27876b085017a 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -1798,32 +1798,36 @@ ParameterError getparameter(char *flag,    /* f or -long-flag */
   return PARAM_OK;
 }
 
-ParameterError parse_args(struct OperationConfig *config, int argc,
+ParameterError parse_args(struct GlobalConfig *config, int argc,
                           argv_item_t argv[])
 {
   int i;
   bool stillflags;
   char *orig_opt;
   ParameterError result = PARAM_OK;
+  struct OperationConfig *operation = config->first;
 
   for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
     orig_opt = argv[i];
 
     if(curlx_strequal(":", argv[i]) &&
-       (config->url_list && config->url_list->url)) {
+       (operation->url_list && operation->url_list->url)) {
 
       /* Allocate the next config */
-      config->next = malloc(sizeof(struct OperationConfig));
-      if(config->next) {
+      operation->next = malloc(sizeof(struct OperationConfig));
+      if(operation->next) {
         /* Initialise the newly created config */
-        config_init(config->next);
+        config_init(operation->next);
 
         /* Copy the easy handle */
-        config->next->easy = config->easy;
+        operation->next->easy = config->easy;
+
+        /* Update the last operation pointer */
+        config->last = operation->next;
 
         /* Move onto the new config */
-        config->next->prev = config;
-        config = config->next;
+        operation->next->prev = operation;
+        operation = operation->next;
 
         /* Reset the flag indicator */
         stillflags = TRUE;
@@ -1843,7 +1847,7 @@ ParameterError parse_args(struct OperationConfig *config, int argc,
       else {
         nextarg = (i < (argc - 1)) ? argv[i + 1] : NULL;
 
-        result = getparameter(flag, nextarg, &passarg, config);
+        result = getparameter(flag, nextarg, &passarg, operation);
         if(!result && passarg)
           i++; /* we're supposed to skip this */
       }
@@ -1852,7 +1856,7 @@ ParameterError parse_args(struct OperationConfig *config, int argc,
       bool used;
 
       /* Just add the URL please */
-      result = getparameter((char *)"--url", argv[i], &used, config);
+      result = getparameter((char *)"--url", argv[i], &used, operation);
     }
   }
 
@@ -1863,9 +1867,9 @@ ParameterError parse_args(struct OperationConfig *config, int argc,
     const char *reason = param2text(result);
 
     if(!curlx_strequal(":", orig_opt))
-      helpf(config->errors, "option %s: %s\n", orig_opt, reason);
+      helpf(operation->errors, "option %s: %s\n", orig_opt, reason);
     else
-      helpf(config->errors, "%s\n", reason);
+      helpf(operation->errors, "%s\n", reason);
   }
 
   return result;
diff --git a/src/tool_getparam.h b/src/tool_getparam.h
index 1593190722b80dec51625e8aa05cea7f544bde1d..23628c00f155c14d03dd88cdcbdd6b6c503ca351 100644
--- a/src/tool_getparam.h
+++ b/src/tool_getparam.h
@@ -54,7 +54,7 @@ void parse_cert_parameter(const char *cert_parameter,
                           char **passphrase);
 #endif
 
-ParameterError parse_args(struct OperationConfig *config, int argc,
+ParameterError parse_args(struct GlobalConfig *config, int argc,
                           argv_item_t argv[]);
 
 #endif /* HEADER_CURL_TOOL_GETPARAM_H */
diff --git a/src/tool_main.c b/src/tool_main.c
index bceb65c7bbd6f94c77be090ab190d55bcd1949a7..0097904938570d04176a291be7f7f26220f49597 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -131,7 +131,7 @@ static CURLcode main_init(struct GlobalConfig *config)
 #endif
 
   /* Allocate the initial operate config */
-  config->first = malloc(sizeof(struct OperationConfig));
+  config->first = config->last = malloc(sizeof(struct OperationConfig));
   if(config->first) {
     /* Perform the libcurl initialization */
     result = curl_global_init(CURL_GLOBAL_DEFAULT);
@@ -140,8 +140,17 @@ static CURLcode main_init(struct GlobalConfig *config)
       result = get_libcurl_info();
 
       if(!result) {
-        /* Initialise the config */
-        config_init(config->first);
+        /* Get a curl handle to use for all forthcoming curl transfers */
+        config->easy = curl_easy_init();
+        if(config->easy) {
+          /* Initialise the config */
+          config_init(config->first);
+          config->first->easy = config->easy;
+        }
+        else {
+          helpf(stderr, "error initializing curl easy handle\n");
+          result = CURLE_FAILED_INIT;
+        }
       }
       else
         helpf(stderr, "error retrieving curl library information\n");
@@ -197,7 +206,7 @@ int main(int argc, char *argv[])
   result = main_init(&global);
   if(!result) {
     /* Start our curl operation */
-    result = operate(global.first, argc, argv);
+    result = operate(&global, argc, argv);
 
 #ifdef __SYMBIAN32__
     if(global.first->showerror)
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 783d86cce77485543f709a9021427124026c1cd5..4bbf29538659a777b7b4df7b122123429d651dd9 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -187,23 +187,6 @@ static curl_off_t VmsSpecialSize(const char * name,
 }
 #endif /* __VMS */
 
-static CURLcode operate_init(struct OperationConfig *config)
-{
-  /* Get a curl handle to use for all forthcoming curl transfers */
-  config->easy = curl_easy_init();
-  if(!config->easy) {
-    helpf(config->errors, "error initializing curl easy handle\n");
-    return CURLE_FAILED_INIT;
-  }
-
-  /* Setup proper locale from environment */
-#ifdef HAVE_SETLOCALE
-  setlocale(LC_ALL, "");
-#endif
-
-  return CURLE_OK;
-}
-
 static CURLcode operate_do(struct OperationConfig *config)
 {
   char errorbuffer[CURL_ERROR_SIZE];
@@ -1803,22 +1786,22 @@ static void operate_free(struct OperationConfig *config)
   clean_metalink(config);
 }
 
-CURLcode operate(struct OperationConfig *config, int argc, argv_item_t argv[])
+CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
 {
   CURLcode result = CURLE_OK;
 
-  /* Initialize the easy interface */
-  result = operate_init(config);
-  if(result)
-    return result;
+  /* Setup proper locale from environment */
+#ifdef HAVE_SETLOCALE
+  setlocale(LC_ALL, "");
+#endif
 
   /* Parse .curlrc if necessary */
   if((argc == 1) || (!curlx_strequal(argv[1], "-q"))) {
-    parseconfig(NULL, config); /* ignore possible failure */
+    parseconfig(NULL, config->first); /* ignore possible failure */
 
     /* If we had no arguments then make sure a url was specified in .curlrc */
-    if((argc < 2) && (!config->url_list)) {
-      helpf(config->errors, NULL);
+    if((argc < 2) && (!config->first->url_list)) {
+      helpf(config->first->errors, NULL);
       result = CURLE_FAILED_INIT;
     }
   }
@@ -1847,7 +1830,7 @@ CURLcode operate(struct OperationConfig *config, int argc, argv_item_t argv[])
     /* Perform the main operations */
     else {
       size_t count = 0;
-      struct OperationConfig *operation = config;
+      struct OperationConfig *operation = config->first;
 
       /* Get the required aguments for each operation */
       while(!result && operation) {
@@ -1857,7 +1840,7 @@ CURLcode operate(struct OperationConfig *config, int argc, argv_item_t argv[])
       }
 
       /* Reset the operation pointer */
-      operation = config;
+      operation = config->first;
 
       /* Perform each operation */
       while(!result && operation) {
@@ -1869,7 +1852,7 @@ CURLcode operate(struct OperationConfig *config, int argc, argv_item_t argv[])
   }
 
   /* Perform the cleanup */
-  operate_free(config);
+  operate_free(config->first);
 
   return result;
 }
diff --git a/src/tool_operate.h b/src/tool_operate.h
index 86283f7a4be5c7a805c693cfa57dfebfcde5a915..1d5c1a96f876a10ccc0f536d1822ea5be91564c4 100644
--- a/src/tool_operate.h
+++ b/src/tool_operate.h
@@ -23,7 +23,7 @@
  ***************************************************************************/
 #include "tool_setup.h"
 
-CURLcode operate(struct OperationConfig *config, int argc, argv_item_t argv[]);
+CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[]);
 
 #endif /* HEADER_CURL_TOOL_OPERATE_H */