@Override
    protected Boolean doInBackground(String... params) {
      OAuth OAuth = new OAuth(context);
      Utils Utils = new Utils();

      Map<String, String> postParams = new HashMap<String, String>(1);
      postParams.put("access_token", Utils.getToken(context));
      JSONObject result = OAuth.call("synchronize", "", postParams);

      if (Config.DEBUG) Log.d("Sync", result.toString());

      try {
        // Save sync data
        JSONObject data = result.getJSONObject("data");

        JSONObject currentData;
        ActiveAndroid.beginTransaction();
        try {

          // Save user data
          new Delete().from(User.class).execute();
          JSONObject userData = data.getJSONObject("user");
          Log.d("User", "User data > " + userData);
          User user = new User();
          user.username = userData.getString("username");
          user.name = userData.getString("name");
          if (userData.isNull("name")) {
            user.name = "";
          }
          String email = "";
          if (!userData.isNull("email")) {
            email = userData.getString("email");
          }
          user.email = email;

          String twitter = "";
          if (!userData.isNull("twittername")) {
            twitter = userData.getString("twittername");
          }
          user.twittername = twitter;

          String aboutme = "";
          if (!userData.isNull("aboutme")) {
            aboutme = userData.getString("aboutme");
          }
          user.aboutme = aboutme;
          user.cityId = userData.getLong("city_id");
          user.save();

          // Save countries
          new Delete().from(Country.class).execute();
          JSONArray countries = data.getJSONObject("country").getJSONArray("data");

          for (int i = 0; i < countries.length(); i++) {
            currentData = countries.getJSONObject(i);
            Country country = new Country();
            country.name = currentData.getString("name");
            country.countryId = currentData.getLong("id");
            country.save();
          }

          // Save cities
          new Delete().from(City.class).execute();
          JSONArray cities = data.getJSONObject("city").getJSONArray("data");

          for (int i = 0; i < cities.length(); i++) {
            currentData = cities.getJSONObject(i);
            City city = new City();
            city.name = currentData.getString("name");
            city.cityId = currentData.getLong("id");
            city.country_id = currentData.getLong("country_id");
            city.save();
          }

          // Save Lines
          new Delete().from(Line.class).execute();
          JSONArray lines = data.getJSONObject("line").getJSONArray("data");
          for (int i = 0; i < lines.length(); i++) {
            currentData = lines.getJSONObject(i);
            Line line = new Line();
            line.name = currentData.getString("name");
            // line.cityId = currentData.getLong("city_id");
            line.lineId = currentData.getLong("id");
            line.transport_id = currentData.getInt("transport_id");
            line.save();
          }

          // Save Transports
          new Delete().from(Transport.class).execute();
          JSONArray transports = data.getJSONObject("transport").getJSONArray("data");
          for (int i = 0; i < transports.length(); i++) {
            currentData = transports.getJSONObject(i);
            Transport transport = new Transport();
            transport.transportId = currentData.getLong("id");
            transport.name = currentData.getString("name");
            transport.icon = currentData.getString("icon");
            transport.save();
          }

          // Save station
          new Delete().from(Station.class).execute();
          JSONArray stations = data.getJSONObject("station").getJSONArray("data");
          for (int i = 0; i < stations.length(); i++) {
            currentData = stations.getJSONObject(i);
            Station station = new Station();
            station.name = currentData.getString("name");
            station.longitude = currentData.getDouble("longitude");
            station.stationId = currentData.getLong("id");
            station.latitude = currentData.getDouble("latitude");
            // station.lineId = currentData.getLong("line_id");
            station.save();
          }

          // Save CitiesTransports
          new Delete().from(CitiesTransport.class).execute();
          JSONArray citiesTransports = data.getJSONObject("citiestransport").getJSONArray("data");
          for (int i = 0; i < citiesTransports.length(); i++) {
            currentData = citiesTransports.getJSONObject(i);
            CitiesTransport citiesTransport = new CitiesTransport();
            citiesTransport.transportId = currentData.getLong("transport_id");
            citiesTransport.cityId = currentData.getLong("city_id");
            citiesTransport.save();
          }

          // Save LineStations
          new Delete().from(LinesStation.class).execute();
          JSONArray lineStations = data.getJSONObject("linesstations").getJSONArray("data");
          for (int i = 0; i < lineStations.length(); i++) {
            currentData = lineStations.getJSONObject(i);
            LinesStation linesStation = new LinesStation();
            linesStation.lineId = currentData.getLong("line_id");
            linesStation.stationId = currentData.getLong("station_id");
            linesStation.save();
          }

          ActiveAndroid.setTransactionSuccessful();
        } finally {
          ActiveAndroid.endTransaction();
        }
        return true;
      } catch (Exception e) {
        if (Config.DEBUG) Log.d("Sync", "Sync failed. Cause: " + e.toString());
        e.printStackTrace();
        return false;
      }
    }