diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ComponentsReplacer.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ComponentsReplacer.java
new file mode 100644
index 000000000..7c0a924a8
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/ComponentsReplacer.java
@@ -0,0 +1,73 @@
+/*
+ * This file is part of ###PROJECT_NAME###
+ *
+ * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
+ * Desenvolvemento Tecnolóxico de Galicia
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+package org.navalplanner.web.common;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.zkoss.zk.ui.Component;
+import org.zkoss.zk.ui.Executions;
+
+public class ComponentsReplacer {
+
+ private static class ChildrenSnapshot implements IChildrenSnapshot {
+ private final List children;
+ private final Component parent;
+
+ public ChildrenSnapshot(Component parent,
+ List currentChildren) {
+ this.parent = parent;
+ this.children = currentChildren;
+ }
+
+ @Override
+ public IChildrenSnapshot restore() {
+ List removedChildren = removeChildren(parent);
+ parent.getChildren().addAll(children);
+ return new ChildrenSnapshot(parent, removedChildren);
+ }
+ }
+
+ /**
+ * @param parent
+ * @param script
+ * @param arguments
+ * @return
+ */
+ public static IChildrenSnapshot replaceAllChildren(Component parent,
+ String script,
+ Map arguments) {
+ List currentChildren = removeChildren(parent);
+ ChildrenSnapshot result = new ChildrenSnapshot(parent, currentChildren);
+ Executions.createComponents(script, parent, arguments);
+ return result;
+ }
+
+ private static List removeChildren(Component parent) {
+ List currentChildren = new ArrayList(parent
+ .getChildren());
+ for (Component c : currentChildren) {
+ c.detach();
+ }
+ return currentChildren;
+ }
+
+}
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/IChildrenSnapshot.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/IChildrenSnapshot.java
new file mode 100644
index 000000000..511354d3c
--- /dev/null
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/IChildrenSnapshot.java
@@ -0,0 +1,28 @@
+/*
+ * This file is part of ###PROJECT_NAME###
+ *
+ * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e
+ * Desenvolvemento Tecnolóxico de Galicia
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+package org.navalplanner.web.common;
+
+public interface IChildrenSnapshot {
+ /**
+ * Restores the children that were current in a point in time
+ * @return a snapshot of the children that will be replaced
+ */
+ public IChildrenSnapshot restore();
+}
\ No newline at end of file