--- a/src/utils/execmd.cpp
+++ b/src/utils/execmd.cpp
@@ -623,6 +623,48 @@
     free(cd);
 }
 
+void ReExec::insertArgs(const vector<string>& args, int idx)
+{
+    vector<string>::iterator it, cit;
+    unsigned int cmpoffset = (unsigned int)-1;
+
+    if (idx == -1 || string::size_type(idx) >= m_argv.size()) {
+	it = m_argv.end();
+	if (m_argv.size() >= args.size()) {
+	    cmpoffset = m_argv.size() - args.size();
+	}
+    } else {
+	it = m_argv.begin() + idx;
+	if (idx + args.size() <= m_argv.size()) {
+	    cmpoffset = idx;
+	}
+    }
+
+    // Check that the option is not already there
+    if (cmpoffset != (unsigned int)-1) {
+	bool allsame = true;
+	for (unsigned int i = 0; i < args.size(); i++) {
+	    if (m_argv[cmpoffset + i] != args[i]) {
+		allsame = false;
+		break;
+	    }
+	}
+	if (allsame)
+	    return;
+    }
+
+    m_argv.insert(it, args.begin(), args.end());
+}
+
+void ReExec::removeArg(const string& arg)
+{
+    for (vector<string>::iterator it = m_argv.begin(); 
+	 it != m_argv.end(); it++) {
+	if (*it == arg)
+	    it = m_argv.erase(it);
+    }
+}
+
 // Reexecute myself, as close as possible to the initial exec
 void ReExec::reexec()
 {
@@ -758,6 +800,17 @@
 int main(int argc, char *argv[])
 {
     reexec.init(argc, argv);
+
+    if (0) {
+	vector<string> newargs;
+	newargs.push_back("newarg");
+	newargs.push_back("newarg1");
+	newargs.push_back("newarg2");
+	newargs.push_back("newarg3");
+	newargs.push_back("newarg4");
+	reexec.insertArgs(newargs, 2);
+    }
+
     thisprog = argv[0];
     argc--; argv++;