private JSONObject saveModelNodes(List<Model> nodesToSave) throws JSONException {
    JSONArray errorNodes = new JSONArray();

    JSONObject respObj = new JSONObject();

    // loop over nodes and order them ascending
    TreeMap<Integer, Model> treeMap = new TreeMap<Integer, Model>();
    for (int i = 0; i < nodesToSave.size(); i++) {

      Model model = (Model) nodesToSave.get(i);
      // loads all nodes guiid with type error

      respObj.put(model.getGuiId(), "OK");
      respObj.put("label", model.getLabel());

      if (model.getParentId() != null) {
        // look up for its id: if null --> newly created node
        Integer id = model.getId();
        if (id == null) {
          treeMap.put(Integer.valueOf("-" + i + 1), model);
        } else {
          // else to modify node
          treeMap.put(model.getId(), model);
        }

      } else {
        // root node --> save first
        try {
          if (model.getId() != null) {
            modelDao.modifyModel(model);
            respObj.put(model.getGuiId(), model.getId());
            respObj.put(model.getId() + "", model.getLabel());
          } else {
            Integer index = modelDao.insertModel(model);
            respObj.put(model.getGuiId(), index);
            respObj.put(index + "", model.getLabel());
          }
        } catch (Exception e) {
          // send error!!!
          respObj.put(model.getGuiId(), "KO");
        }
      }
    }

    Set set = treeMap.entrySet();
    // Get an iterator
    Iterator it = set.iterator();
    // loop again over treemap
    while (it.hasNext()) {
      Map.Entry orderedEntry = (Map.Entry) it.next();
      // check that parent exists
      Model orderedNode = (Model) orderedEntry.getValue();

      // GET JSON OBJECT VALUE
      Integer parentId = orderedNode.getParentId();
      try {
        Model parent = modelDao.loadModelWithoutChildrenById(parentId);
        if (parent != null) {
          // if parent exists--> save
          // if node id is negative --> insert
          if (orderedNode.getId() == null) {
            Integer newId = modelDao.insertModel(orderedNode);
            if (newId != null) {
              orderedNode.setId(newId);
              respObj.put(orderedNode.getGuiId(), newId);
              respObj.put(newId + "", orderedNode.getLabel());
            } else {
              respObj.put(orderedNode.getGuiId(), "KO");
            }
          } else {
            // else update
            modelDao.modifyModel(orderedNode);
            respObj.put(orderedNode.getGuiId(), orderedNode.getId());
            respObj.put(orderedNode.getId() + "", orderedNode.getLabel());
          }
        }
      } catch (Exception e) {
        // if parentId != null but no parent node stored on db --> exception
        respObj.put(orderedNode.getGuiId(), "KO");
      }
    }
    return respObj;
  }