    def start_cleaning(self, mode=2, navigation_mode=1, category=None, boundary_id=None):
        # mode & navigation_mode used if applicable to service version
        # mode: 1 eco, 2 turbo
        # navigation_mode: 1 normal, 2 extra care, 3 deep
        # category: 2 non-persistent map, 4 persistent map
        # boundary_id: the id of the zone to clean

        # Default to using the persistent map if we support basic-3 or basic-4.
        if category is None:
            category = 4 if self.service_version in ['basic-3', 'basic-4'] and self.has_persistent_maps else 2

        if self.service_version == 'basic-1':
            json = {'reqId': "1",
                    'cmd': "startCleaning",
                    'params': {
                        'category': category,
                        'mode': mode,
                        'modifier': 1}
                    }
        elif self.service_version == 'basic-3' or 'basic-4':
            json = {'reqId': "1",
                    'cmd': "startCleaning",
                    'params': {
                        'category': category,
                        'mode': mode,
                        'modifier': 1,
                        "navigationMode": navigation_mode}
                    }
            if boundary_id:
                json['params']['boundaryId'] = boundary_id
        elif self.service_version == 'minimal-2':
            json = {'reqId': "1",
                    'cmd': "startCleaning",
                    'params': {
                        'category': category,
                        "navigationMode": navigation_mode}
                    }
        else:   # self.service_version == 'basic-2'
            json = {'reqId': "1",
                    'cmd': "startCleaning",
                    'params': {
                        'category': category,
                        'mode': mode,
                        'modifier': 1,
                        "navigationMode": navigation_mode}
                    }

        response = self._message(json)
        response_dict = response.json()

        # Fall back to category 2 if we tried and failed with category 4
        if category == 4 and 'alert' in response_dict and response_dict['alert'] == 'nav_floorplan_load_fail':
            json['params']['category'] = 2
            return self._message(json)

        return response