private TimelimitTaskTableModel newTimelimitTaskTableModel() {
    final TimelimitTaskTableModel result = new TimelimitTaskTableModel();

    // add columns:
    final List<String> lstFieldNames =
        new LinkedList<String>(CollectableTimelimitTask.clcte.getFieldNames());

    // sort using the order stored in the preferences:
    List<String> lstFieldNameOrderTemp;
    try {
      lstFieldNameOrderTemp = PreferencesUtils.getStringList(this.prefs, PREFS_NODE_SELECTEDFIELDS);
    } catch (PreferencesException ex) {
      LOG.error(
          "Failed to retrieve list of selected fields from the preferences. They will be empty.");
      lstFieldNameOrderTemp = new ArrayList<String>();
    }
    final List<String> lstFieldNameOrder = lstFieldNameOrderTemp;

    Collections.sort(
        lstFieldNames,
        new Comparator<String>() {
          private int getOrder(Object o) {
            int result = lstFieldNameOrder.indexOf(o);
            if (result == -1) {
              // new fields are shown at the end:
              result = lstFieldNameOrder.size();
            }
            return result;
          }

          @Override
          public int compare(String o1, String o2) {
            int iDiff = getOrder(o1) - getOrder(o2);
            return (iDiff == 0) ? 0 : (iDiff / Math.abs(iDiff));
          }
        });

    int iColumn = 0;
    final List<String> lstNamesOfFieldsToDisplay =
        CollectableTimelimitTask.clcte.getNamesOfFieldsToDisplay();
    for (Iterator<String> iter = lstFieldNames.iterator(); iter.hasNext(); ) {
      final String sFieldName = iter.next();
      final CollectableEntityField clctef =
          CollectableTimelimitTask.clcte.getEntityField(sFieldName);
      if (lstNamesOfFieldsToDisplay.contains(sFieldName)) {
        result.addColumn(iColumn++, clctef);
      }
    }

    if (result.getColumnCount() > 0) {
      result.setSortKeys(Collections.singletonList(new SortKey(0, SortOrder.ASCENDING)), false);
    }

    return result;
  }