diff --git a/CHANGES.txt b/CHANGES.txt
index 6ec63b9..4963823 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,9 @@
+2.0.0-rc.3 (TBD)
+
+Changed:
+- Session class unit tests are marked to be run within an event loop and are
+  no longer skipped (#881).
+
 2.0.0-rc.2 (2023-03-15)
 
 Added:
diff --git a/planet/cli/data.py b/planet/cli/data.py
index cbca75e..46a9603 100644
--- a/planet/cli/data.py
+++ b/planet/cli/data.py
@@ -283,7 +283,8 @@ def filter(ctx,
                 callback=check_item_types)
 @click.option('--filter',
               type=types.JSON(),
-              help='Apply specified filter to search.')
+              help="""Apply specified filter to search. Can be a json string,
+              filename, or '-' for stdin.""")
 @limit
 @click.option('--name', type=str, help='Name of the saved search.')
 @click.option('--sort',
@@ -321,32 +322,35 @@ async def search(ctx, item_types, filter, limit, name, sort, pretty):
 @click.pass_context
 @translate_exceptions
 @coro
-@click.argument('name')
 @click.argument("item_types",
                 type=types.CommaSeparatedString(),
                 callback=check_item_types)
-@click.argument("filter", type=types.JSON())
+@click.option(
+    '--filter',
+    type=types.JSON(),
+    required=True,
+    help="""Filter to apply to search. Can be a json string, filename,
+         or '-' for stdin.""")
+@click.option('--name',
+              type=str,
+              required=True,
+              help='Name of the saved search.')
 @click.option('--daily-email',
               is_flag=True,
               help='Send a daily email when new results are added.')
 @pretty
-async def search_create(ctx, name, item_types, filter, daily_email, pretty):
+async def search_create(ctx, item_types, filter, name, daily_email, pretty):
     """Create a new saved structured item search.
 
     This function outputs a full JSON description of the created search,
     optionally pretty-printed.
 
-    NAME is the name to give the search.
-
     ITEM_TYPES is a comma-separated list of item-types to search.
-
-    FILTER must be JSON and can be specified a json string, filename, or '-'
-    for stdin.
     """
     async with data_client(ctx) as cl:
-        items = await cl.create_search(name=name,
-                                       item_types=item_types,
+        items = await cl.create_search(item_types=item_types,
                                        search_filter=filter,
+                                       name=name,
                                        enable_email=daily_email)
         echo_json(items, pretty)
 
diff --git a/planet/clients/data.py b/planet/clients/data.py
index 82c22c2..2e80dd0 100644
--- a/planet/clients/data.py
+++ b/planet/clients/data.py
@@ -167,9 +167,9 @@ class DataClient:
             yield i
 
     async def create_search(self,
-                            name: str,
                             item_types: List[str],
                             search_filter: dict,
+                            name: str,
                             enable_email: bool = False) -> dict:
         """Create a new saved structured item search.
 
@@ -190,9 +190,9 @@ class DataClient:
 
 
         Parameters:
-            name: The name of the saved search.
             item_types: The item types to include in the search.
             search_filter: Structured search criteria.
+            name: The name of the saved search.
             enable_email: Send a daily email when new results are added.
 
         Returns:
diff --git a/planet/subscription_request.py b/planet/subscription_request.py
index 26b761e..212bdc7 100644
--- a/planet/subscription_request.py
+++ b/planet/subscription_request.py
@@ -133,7 +133,7 @@ def catalog_source(
     parameters = {
         "item_types": item_types,
         "asset_types": asset_types,
-        "geometry": geometry,
+        "geometry": geojson.as_geom(geometry),
     }
 
     try:

diff --git a/tests/integration/test_data_api.py b/tests/integration/test_data_api.py
index 736d751..8a2c500 100644
--- a/tests/integration/test_data_api.py
+++ b/tests/integration/test_data_api.py
@@ -245,7 +245,9 @@ async def test_create_search_basic(search_filter, session):
     respx.post(TEST_SEARCHES_URL).return_value = mock_resp
 
     cl = DataClient(session, base_url=TEST_URL)
-    search = await cl.create_search('test', ['PSScene'], search_filter)
+    search = await cl.create_search(['PSScene'],
+                                    search_filter=search_filter,
+                                    name='test')
 
     # check that request is correct
     expected_request = {
@@ -281,8 +283,9 @@ async def test_create_search_email(search_filter, session):
     respx.post(TEST_SEARCHES_URL).return_value = mock_resp
 
     cl = DataClient(session, base_url=TEST_URL)
-    search = await cl.create_search('test', ['PSScene'],
-                                    search_filter,
+    search = await cl.create_search(['PSScene'],
+                                    search_filter=search_filter,
+                                    name='test',
                                     enable_email=True)
 
     # check that request is correct
diff --git a/tests/integration/test_data_cli.py b/tests/integration/test_data_cli.py
index 6150d25..47265bd 100644
--- a/tests/integration/test_data_cli.py
+++ b/tests/integration/test_data_cli.py
@@ -572,7 +572,13 @@ def test_data_search_create_filter_invalid_json(invoke, item_types, filter):
     name = "temp"
 
     runner = CliRunner()
-    result = invoke(["search-create", name, item_types, filter], runner=runner)
+    result = invoke([
+        "search-create",
+        item_types,
+        f'--name={name}',
+        f'--filter={json.dumps(filter)}'
+    ],
+                    runner=runner)
     assert result.exit_code == 2
 
 
@@ -599,7 +605,12 @@ def test_data_search_create_filter_success(invoke, item_types):
     respx.post(TEST_SEARCHES_URL).return_value = mock_resp
 
     runner = CliRunner()
-    result = invoke(["search-create", name, item_types, json.dumps(filter)],
+    result = invoke([
+        "search-create",
+        item_types,
+        f'--filter={json.dumps(filter)}',
+        f'--name={name}'
+    ],
                     runner=runner)
 
     assert result.exit_code == 0
@@ -621,9 +632,9 @@ def test_data_search_create_daily_email(invoke, search_result):
 
     result = invoke([
         'search-create',
-        'temp',
         'SkySatScene',
-        json.dumps(filter),
+        '--name=temp',
+        f'--filter={json.dumps(filter)}',
         '--daily-email'
     ])
 
diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py
index 5520dfd..ed631bd 100644
--- a/tests/unit/test_session.py
+++ b/tests/unit/test_session.py
@@ -6,6 +6,7 @@ from planet import DataClient, OrdersClient, SubscriptionsClient, Session
 from planet.exceptions import ClientError
 
 
+@pytest.mark.asyncio
 @pytest.mark.parametrize("client_name,client_class",
                          [('data', DataClient), ('orders', OrdersClient),
                           ('subscriptions', SubscriptionsClient)])
@@ -16,6 +17,7 @@ async def test_session_get_client(client_name, client_class):
         assert isinstance(client, client_class)
 
 
+@pytest.mark.asyncio
 async def test_session_get_client_error():
     """Get an exception when no such client exists."""
     async with Session() as session:
diff --git a/tests/unit/test_subscription_request.py b/tests/unit/test_subscription_request.py
index 51e7590..7c0bca2 100644
--- a/tests/unit/test_subscription_request.py
+++ b/tests/unit/test_subscription_request.py
@@ -90,6 +90,30 @@ def test_catalog_source_success(geom_geojson):
     assert res == expected
 
 
+def test_catalog_source_featurecollection(featurecollection_geojson,
+                                          geom_geojson):
+    '''geojson specified as featurecollection is simplified down to just
+    the geometry'''
+    res = subscription_request.catalog_source(
+        item_types=["PSScene"],
+        asset_types=["ortho_analytic_4b"],
+        geometry=featurecollection_geojson,
+        start_time=datetime(2021, 3, 1),
+    )
+
+    expected = {
+        "type": "catalog",
+        "parameters": {
+            "geometry": geom_geojson,
+            "start_time": "2021-03-01T00:00:00Z",
+            "item_types": ["PSScene"],
+            "asset_types": ["ortho_analytic_4b"]
+        }
+    }
+
+    assert res == expected
+
+
 def test_catalog_source_invalid_start_time(geom_geojson):
     with pytest.raises(exceptions.ClientError):
         subscription_request.catalog_source(

Update `search-create` CLI and python API commands to match `search`
**Expected behavior**
UI of `planet data search-create` and `planet data search` should be similar.

**Actual behavior (describe the problem)**
`planet data search` has filter and name as options, `planet data search-create` has name and filter as arguments.

**Proposed Solution**

Update `search-create` CLI and python API commands to match `search`.
tests/integration/test_data_api.py::test_create_search_basic tests/integration/test_data_api.py::test_create_search_email tests/integration/test_data_cli.py::test_data_search_create_filter_success[PSScene] tests/integration/test_data_cli.py::test_data_search_create_filter_success[SkySatScene] tests/integration/test_data_cli.py::test_data_search_create_filter_success[PSScene, tests/integration/test_data_cli.py::test_data_search_create_daily_email tests/unit/test_subscription_request.py::test_catalog_source_featurecollection
tests/integration/test_data_api.py::test_search_basic tests/integration/test_data_api.py::test_search_name tests/integration/test_data_api.py::test_search_filter tests/integration/test_data_api.py::test_search_sort tests/integration/test_data_api.py::test_search_limit tests/integration/test_data_api.py::test_get_search_success tests/integration/test_data_api.py::test_get_search_id_doesnt_exist tests/integration/test_data_api.py::test_update_search_basic tests/integration/test_data_api.py::test_list_searches_success[None-4] tests/integration/test_data_api.py::test_list_searches_success[3-3] tests/integration/test_data_api.py::test_list_searches_sort[created tests/integration/test_data_api.py::test_list_searches_searchtype[any-] tests/integration/test_data_api.py::test_list_searches_searchtype[saved-?search_type=saved] tests/integration/test_data_api.py::test_list_searches_args_do_not_match[DOESNOTEXIST-ANY-expectation0] tests/integration/test_data_api.py::test_list_searches_args_do_not_match[CREATED tests/integration/test_data_api.py::test_delete_search[204-expectation0] tests/integration/test_data_api.py::test_delete_search[404-expectation1] tests/integration/test_data_api.py::test_run_search_basic[None-3-286469f0b27c476e96c3c4e561f59664-True] tests/integration/test_data_api.py::test_run_search_basic[None-3-invalid-False] tests/integration/test_data_api.py::test_run_search_basic[2-2-286469f0b27c476e96c3c4e561f59664-True] tests/integration/test_data_api.py::test_run_search_basic[2-2-invalid-False] tests/integration/test_data_api.py::test_run_search_sort[published tests/integration/test_data_api.py::test_run_search_sort[acquired tests/integration/test_data_api.py::test_run_search_sort[invalid--False] tests/integration/test_data_api.py::test_run_search_doesnotexist tests/integration/test_data_api.py::test_get_stats_success tests/integration/test_data_api.py::test_get_stats_invalid_interval tests/integration/test_data_api.py::test_list_item_assets_success tests/integration/test_data_api.py::test_list_item_assets_missing tests/integration/test_data_api.py::test_get_asset[basic_udm2-expectation0] tests/integration/test_data_api.py::test_get_asset[invalid-expectation1] tests/integration/test_data_api.py::test_activate_asset_success[inactive-True] tests/integration/test_data_api.py::test_activate_asset_success[active-False] tests/integration/test_data_api.py::test_activate_asset_invalid_asset tests/integration/test_data_api.py::test_wait_asset_success tests/integration/test_data_api.py::test_wait_asset_max_attempts tests/integration/test_data_api.py::test_download_asset[False-False] tests/integration/test_data_api.py::test_download_asset[True-False] tests/integration/test_data_api.py::test_download_asset[True-True] tests/integration/test_data_api.py::test_download_asset[False-True] tests/integration/test_data_api.py::test_validate_checksum[True-True-expectation0] tests/integration/test_data_api.py::test_validate_checksum[False-True-expectation1] tests/integration/test_data_api.py::test_validate_checksum[True-False-expectation2] tests/integration/test_data_cli.py::test_data_command_registered tests/integration/test_data_cli.py::test_data_search_command_registered tests/integration/test_data_cli.py::test_data_filter_defaults tests/integration/test_data_cli.py::test_data_filter_permission tests/integration/test_data_cli.py::test_data_filter_std_quality tests/integration/test_data_cli.py::test_data_filter_asset[ortho_analytic_8b_sr-expected0] tests/integration/test_data_cli.py::test_data_filter_asset[ortho_analytic_8b_sr,ortho_analytic_4b_sr-expected1] tests/integration/test_data_cli.py::test_data_filter_asset[ortho_analytic_8b_sr tests/integration/test_data_cli.py::test_data_filter_date_range_success tests/integration/test_data_cli.py::test_data_filter_date_range_invalid tests/integration/test_data_cli.py::test_data_filter_geom[geom_geojson] tests/integration/test_data_cli.py::test_data_filter_geom[feature_geojson] tests/integration/test_data_cli.py::test_data_filter_geom[featurecollection_geojson] tests/integration/test_data_cli.py::test_data_filter_number_in_success tests/integration/test_data_cli.py::test_data_filter_number_in_badparam tests/integration/test_data_cli.py::test_data_filter_range tests/integration/test_data_cli.py::test_data_filter_string_in tests/integration/test_data_cli.py::test_data_filter_update tests/integration/test_data_cli.py::test_data_search_cmd_item_types[PSScene-True] tests/integration/test_data_cli.py::test_data_search_cmd_item_types[SkySatScene-True] tests/integration/test_data_cli.py::test_data_search_cmd_item_types[PSScene, tests/integration/test_data_cli.py::test_data_search_cmd_item_types[INVALID-False] tests/integration/test_data_cli.py::test_data_search_cmd_filter_invalid_json[{1:1}] tests/integration/test_data_cli.py::test_data_search_cmd_filter_invalid_json[{"foo"}] tests/integration/test_data_cli.py::test_data_search_cmd_filter_success tests/integration/test_data_cli.py::test_data_search_cmd_sort_success tests/integration/test_data_cli.py::test_data_search_cmd_sort_invalid tests/integration/test_data_cli.py::test_data_search_cmd_limit[None-100] tests/integration/test_data_cli.py::test_data_search_cmd_limit[0-102] tests/integration/test_data_cli.py::test_data_search_cmd_limit[1-1] tests/integration/test_data_cli.py::test_data_search_create_filter_invalid_json[PSScene-{1:1}] tests/integration/test_data_cli.py::test_data_search_create_filter_invalid_json[PSScene-{"foo"}] tests/integration/test_data_cli.py::test_data_search_create_filter_invalid_json[SkySatScene-{1:1}] tests/integration/test_data_cli.py::test_data_search_create_filter_invalid_json[SkySatScene-{"foo"}] tests/integration/test_data_cli.py::test_data_search_create_filter_invalid_json[PSScene, tests/integration/test_data_cli.py::test_data_search_list_basic[0-4] tests/integration/test_data_cli.py::test_data_search_list_basic[3-3] tests/integration/test_data_cli.py::test_data_search_list_sort[created tests/integration/test_data_cli.py::test_data_search_list_sort[notvalid--False] tests/integration/test_data_cli.py::test_data_search_list_searchtype[any--True] tests/integration/test_data_cli.py::test_data_search_list_searchtype[saved-?search_type=saved-True] tests/integration/test_data_cli.py::test_data_search_list_searchtype[notvalid--False] tests/integration/test_data_cli.py::test_data_search_run_basic[0-3-286469f0b27c476e96c3c4e561f59664-True] tests/integration/test_data_cli.py::test_data_search_run_basic[0-3-invalid-False] tests/integration/test_data_cli.py::test_data_search_run_basic[2-2-286469f0b27c476e96c3c4e561f59664-True] tests/integration/test_data_cli.py::test_data_search_run_basic[2-2-invalid-False] tests/integration/test_data_cli.py::test_data_search_run_sort[published tests/integration/test_data_cli.py::test_data_search_run_sort[acquired tests/integration/test_data_cli.py::test_data_search_run_sort[invalid--False] tests/integration/test_data_cli.py::test_data_stats_invalid_filter[{1:1}] tests/integration/test_data_cli.py::test_data_stats_invalid_filter[{"foo"}] tests/integration/test_data_cli.py::test_data_stats_invalid_interval[None-1-PSScene] tests/integration/test_data_cli.py::test_data_stats_invalid_interval[None-1-SkySatScene] tests/integration/test_data_cli.py::test_data_stats_invalid_interval[None-1-PSScene, tests/integration/test_data_cli.py::test_data_stats_invalid_interval[hou-2-PSScene] tests/integration/test_data_cli.py::test_data_stats_invalid_interval[hou-2-SkySatScene] tests/integration/test_data_cli.py::test_data_stats_invalid_interval[hou-2-PSScene, tests/integration/test_data_cli.py::test_data_stats_invalid_interval[hour-0-PSScene] tests/integration/test_data_cli.py::test_data_stats_invalid_interval[hour-0-SkySatScene] tests/integration/test_data_cli.py::test_data_stats_invalid_interval[hour-0-PSScene, tests/integration/test_data_cli.py::test_data_stats_success[hour-PSScene] tests/integration/test_data_cli.py::test_data_stats_success[hour-SkySatScene] tests/integration/test_data_cli.py::test_data_stats_success[hour-PSScene, tests/integration/test_data_cli.py::test_data_stats_success[day-PSScene] tests/integration/test_data_cli.py::test_data_stats_success[day-SkySatScene] tests/integration/test_data_cli.py::test_data_stats_success[day-PSScene, tests/integration/test_data_cli.py::test_data_stats_success[week-PSScene] tests/integration/test_data_cli.py::test_data_stats_success[week-SkySatScene] tests/integration/test_data_cli.py::test_data_stats_success[week-PSScene, tests/integration/test_data_cli.py::test_data_stats_success[month-PSScene] tests/integration/test_data_cli.py::test_data_stats_success[month-SkySatScene] tests/integration/test_data_cli.py::test_data_stats_success[month-PSScene, tests/integration/test_data_cli.py::test_data_stats_success[year-PSScene] tests/integration/test_data_cli.py::test_data_stats_success[year-SkySatScene] tests/integration/test_data_cli.py::test_data_stats_success[year-PSScene, tests/integration/test_data_cli.py::test_search_get tests/integration/test_data_cli.py::test_search_get_id_not_found tests/integration/test_data_cli.py::test_search_delete_success tests/integration/test_data_cli.py::test_search_delete_nonexistant_search_id tests/integration/test_data_cli.py::test_search_update_success[PSScene] tests/integration/test_data_cli.py::test_search_update_success[SkySatScene] tests/integration/test_data_cli.py::test_search_update_success[PSScene, tests/integration/test_data_cli.py::test_search_update_fail tests/integration/test_data_cli.py::test_asset_download_default[False-False] tests/integration/test_data_cli.py::test_asset_download_default[True-False] tests/integration/test_data_cli.py::test_asset_download_default[True-True] tests/integration/test_data_cli.py::test_asset_download_default[False-True] tests/integration/test_data_cli.py::test_asset_activate tests/integration/test_data_cli.py::test_asset_wait tests/unit/test_session.py::test_session_get_client[data-DataClient] tests/unit/test_session.py::test_session_get_client[orders-OrdersClient] tests/unit/test_session.py::test_session_get_client[subscriptions-SubscriptionsClient] tests/unit/test_session.py::test_session_get_client_error tests/unit/test_subscription_request.py::test_build_request_success tests/unit/test_subscription_request.py::test_catalog_source_success tests/unit/test_subscription_request.py::test_catalog_source_invalid_start_time tests/unit/test_subscription_request.py::test_amazon_s3_success tests/unit/test_subscription_request.py::test_azure_blob_storage_success tests/unit/test_subscription_request.py::test_google_cloud_storage_success tests/unit/test_subscription_request.py::test_oracle_cloud_storage_success tests/unit/test_subscription_request.py::test_notifications_success tests/unit/test_subscription_request.py::test_notifications_invalid_topics tests/unit/test_subscription_request.py::test_band_math_tool_success tests/unit/test_subscription_request.py::test_band_math_tool_invalid_pixel_type tests/unit/test_subscription_request.py::test_clip_tool_success tests/unit/test_subscription_request.py::test_clip_tool_invalid_type tests/unit/test_subscription_request.py::test_file_format_tool_success tests/unit/test_subscription_request.py::test_file_format_tool_invalid_format tests/unit/test_subscription_request.py::test_harmonize_tool_success tests/unit/test_subscription_request.py::test_harmonize_tool_invalid_target_sensor tests/unit/test_subscription_request.py::test_reproject_tool_success tests/unit/test_subscription_request.py::test_reproject_tool_invalid_kernel tests/unit/test_subscription_request.py::test_toar_tool_success