diff --git a/api/bcd_request.py b/api/bcd_request.py
index 462a7795ddc5d572f67b9cf139c1538da497fb38..961b55fb90724909bda8f690da3ba9b037017ada 100644
--- a/api/bcd_request.py
+++ b/api/bcd_request.py
@@ -1,10 +1,11 @@
 from fastapi import APIRouter, Depends, HTTPException
 from starlette import status
 
-from api import get_conn
+from api import db, get_conn
 from model.bcd_request import BCDRequestModel, BCDProtectionRequirements, BCDSystemType, IPAddressVersion
 from model.wapi.cntl import APIToken, Mgr
 from util.auth import check_auth
+from util.wapi_util import execute_wapi_function
 
 router = APIRouter(
     prefix="/api/bcd_request",
@@ -13,19 +14,69 @@ router = APIRouter(
 js_mods = ['bcdrequest']
 
 
-# TODO: implement methods...
 @router.post('')
 async def handle_request(bcd_request: BCDRequestModel, token: APIToken = Depends(check_auth), conn=Depends(get_conn)):
     user = Mgr.check_token(conn, token)
 
-    if user:
-        return "Success"
+    ou_request = execute_wapi_function(conn, [
+        {"idx": "own_mgr2ou_list", "name": "cntl.mgr2ou.list", "old": {"is_own": True}},
+        {"idx": "unit_list", "name": "org.unit.list", "inner_join_ref": {"own_mgr2ou_list": "default"},
+         "old": {"sorting_params_list": ["sub_position"]}},
+        {"idx": "unit_list_superset", "name": "org.unit.list",
+         "inner_join_ref": {"unit_list": "api_func_org_unit_hierarchy_gfk_list_is_superset"}},
+        {"name": "cntl.mgr2ou.list", "inner_join_ref": {"unit_list_superset": "default"}, "idx": "mgr2ou_list"},
+        {"name": "cntl.mgr.list", "inner_join_ref": {"mgr2ou_list": "default"}, "idx": "mgr_list"},
+        {"name": "dns.fqdn2ou.list", "inner_join_ref": {"unit_list_superset": "default"}, "idx": "fqdn2ou_list"},
+        {"name": "nd.bcd2ou.list", "inner_join_ref": {"unit_list_superset": "default"}, "idx": "bcd2ou_list"},
+        {"name": "nd.bcd.list", "inner_join_ref": {"bcd2ou_list": "default"}, "idx": "bcd_list"},
+        {"name": "org.unit_type.list", "inner_join_ref": {"unit_list": "default"}, "idx": "unit_type_list"}])
+
+    ous = [item["short_name"] for item in ou_request["unit_list"]]
+
+    if bcd_request.oe not in ous:
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST,
+            detail='User is not member of the specified organizational unit.'
+        )
+
+    group_request = execute_wapi_function(conn, [
+        {"idx": "current_ou", "name": "org.unit.list", "old": {"short_name": bcd_request.oe}},
+        {"idx": "child_ous", "name": "org.unit.list",
+         "inner_join_ref": {"current_ou": "api_func_org_unit_hierarchy_gfk_list_is_superset"}},
+        {"idx": "parent_ous", "name": "org.unit.list", "old": {"sorting_params_list": ["tree_level DESC"]},
+         "inner_join_ref": {"current_ou": "api_func_org_unit_hierarchy_gfk_list_is_subset"}},
+        {"name": "cntl.mgr2ou.list", "inner_join_ref": {"current_ou": "default"}, "idx": "mgr2ou_list"},
+        {"name": "cntl.mgr.list", "inner_join_ref": {"mgr2ou_list": "default"}, "idx": "mgr_list"},
+        {"name": "dns.fqdn2ou.list", "inner_join_ref": {"current_ou": "default"}, "idx": "fqdn2ou_list"},
+        {"name": "nd.bcd2ou.list", "inner_join_ref": {"current_ou": "default"}, "idx": "bcd2ou_list"},
+        {"name": "nd.bcd.list", "inner_join_ref": {"bcd2ou_list": "default"}, "idx": "bcd_list"},
+        {"name": "cntl.group.list", "inner_join_ref": {"child_ous": "default"},
+         "old": {"sorting_params_list": ["name"]}, "idx": "group_list"},
+        {"idx": "recursive_fqdn2ou_list", "name": "dns.fqdn2ou.list", "inner_join_ref": {"parent_ous": "default"},
+         "old": {"is_recursive": True}},
+        {"idx": "recursive_bcd2ou_list", "name": "nd.bcd2ou.list", "inner_join_ref": {"parent_ous": "default"},
+         "old": {"is_recursive": True}},
+        {"idx": "recursive_mgr2ou_list", "name": "cntl.mgr2ou.list", "inner_join_ref": {"parent_ous": "default"}},
+        {"idx": "recursive_mgr_list", "name": "cntl.mgr.list", "inner_join_ref": {"recursive_mgr2ou_list": "default"}},
+        {"idx": "recursive_bcd_list", "name": "nd.bcd.list", "inner_join_ref": {"recursive_bcd2ou_list": "default"}},
+        {"name": "org.unit_type.list", "inner_join_ref": {"current_ou": "default"}, "idx": "unit_type_list"}])
+
+    groups = [item["name"] for item in group_request["group_list"]]
+
+    if bcd_request.group not in groups:
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST,
+            detail='Unknown group specified.'
+        )
+
+    if validate_bcd_request(bcd_request):
+        # TODO: Send e-mail
+        return {'result': 'success'}
 
     raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
 
 
 def validate_bcd_request(bcd_request: BCDRequestModel) -> bool:
-    # TODO: Check if provided user is part of the specified group
 
     if (bcd_request.protection_requirement == BCDProtectionRequirements.SPECIAL and
             bcd_request.protection_requirement_note is None):
@@ -133,7 +184,7 @@ def validate_bcd_request(bcd_request: BCDRequestModel) -> bool:
             detail='DHCP pools smaller than 2 devices are not offered.'
         )
     elif (bcd_request.dhcp and bcd_request.dhcp_pool and
-          bcd_request.dhcp_pool_size > 2**(32 - bcd_request.ipv4_subnet_size) - 5):
+          bcd_request.dhcp_pool_size > 2 ** (32 - bcd_request.ipv4_subnet_size) - 5):
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail='This subnet does not support this size of a DHCP pool.'