private StreetTraversalPermission getPermissionsForEntity(
        OSMWithTags entity, StreetTraversalPermission def) {
      Map<String, String> tags = entity.getTags();
      StreetTraversalPermission permission = null;

      String highway = tags.get("highway");
      String cycleway = tags.get("cycleway");
      String access = tags.get("access");
      String motorcar = tags.get("motorcar");
      String bicycle = tags.get("bicycle");
      String foot = tags.get("foot");

      /*
       * Only a few tags are examined here, because we only care about modes supported by OTP
       * (wheelchairs are not of concern here)
       *
       * Only a few values are checked for, all other values are presumed to be permissive (=>
       * This may not be perfect, but is closer to reality, since most people don't follow the
       * rules perfectly ;-)
       */
      if (access != null) {
        if ("no".equals(access) || "license".equals(access)) {
          // this can actually be overridden
          permission = StreetTraversalPermission.NONE;
          if (entity.doesTagAllowAccess("motorcar")) {
            permission = permission.add(StreetTraversalPermission.CAR);
          }
          if (entity.doesTagAllowAccess("bicycle")) {
            permission = permission.add(StreetTraversalPermission.BICYCLE);
          }
          if (entity.doesTagAllowAccess("foot")) {
            permission = permission.add(StreetTraversalPermission.PEDESTRIAN);
          }
        } else {
          permission = def;
        }
      } else if (motorcar != null || bicycle != null || foot != null) {
        permission = def;
      }

      if (motorcar != null) {
        if ("no".equals(motorcar) || "license".equals(motorcar)) {
          permission = permission.remove(StreetTraversalPermission.CAR);
        } else {
          permission = permission.add(StreetTraversalPermission.CAR);
        }
      }

      if (bicycle != null) {
        if ("no".equals(bicycle) || "license".equals(bicycle)) {
          permission = permission.remove(StreetTraversalPermission.BICYCLE);
        } else {
          permission = permission.add(StreetTraversalPermission.BICYCLE);
        }
      }

      if (foot != null) {
        if ("no".equals(foot) || "license".equals(foot)) {
          permission = permission.remove(StreetTraversalPermission.PEDESTRIAN);
        } else {
          permission = permission.add(StreetTraversalPermission.PEDESTRIAN);
        }
      }

      if (highway != null) {
        if ("construction".equals(highway)) {
          permission = StreetTraversalPermission.NONE;
        }
      } else {
        if ("construction".equals(cycleway)) {
          permission = StreetTraversalPermission.NONE;
        }
      }

      if (permission == null) return def;

      return permission;
    }