diff --git a/csst_dfs_proto/cpic/__init__.py b/csst_dfs_proto/cpic/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/csst_dfs_proto/facility/calmerge/__init__.py b/csst_dfs_proto/facility/calmerge/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/csst_dfs_proto/facility/detector/__init__.py b/csst_dfs_proto/facility/detector/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/csst_dfs_proto/facility/detector_pb2.py b/csst_dfs_proto/facility/detector/detector_pb2.py
similarity index 66%
rename from csst_dfs_proto/facility/detector_pb2.py
rename to csst_dfs_proto/facility/detector/detector_pb2.py
index 1dacea803b997e56030a801f483ccac399b5184e..47e4f64af647a11df4a9a1a4b1f619998c145fc7 100644
--- a/csst_dfs_proto/facility/detector_pb2.py
+++ b/csst_dfs_proto/facility/detector/detector_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: facility/detector.proto
+# source: facility/detector/detector.proto
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
@@ -13,15 +13,15 @@ from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
 
 
-from ..common import error_pb2 as common_dot_error__pb2
+from ...common import error_pb2 as common_dot_error__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
-  name='facility/detector.proto',
-  package='facility',
+  name='facility/detector/detector.proto',
+  package='detector',
   syntax='proto3',
   serialized_options=_b('Z\035cnlab.net/csst/proto/facility'),
-  serialized_pb=_b('\n\x17\x66\x61\x63ility/detector.proto\x12\x08\x66\x61\x63ility\x1a\x12\x63ommon/error.proto\"}\n\x08\x44\x65tector\x12\n\n\x02no\x18\x01 \x01(\t\x12\x15\n\rdetector_name\x18\x02 \x01(\t\x12\x11\n\tmodule_id\x18\x03 \x01(\t\x12\x11\n\tfilter_id\x18\x04 \x01(\t\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\x03\x12\x13\n\x0bupdate_time\x18\x06 \x01(\x03\"k\n\x0e\x44\x65tectorStatus\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x13\n\x0b\x64\x65tector_no\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x13\n\x0bstatus_time\x18\x04 \x01(\x03\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\x03\"1\n\x0f\x46indDetectorReq\x12\x11\n\tmodule_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\"{\n\x10\x46indDetectorResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\ntotalCount\x18\x02 \x01(\x05\x12\x1c\n\x05\x65rror\x18\x03 \x01(\x0b\x32\r.common.Error\x12$\n\x08\x44\x65tector\x18\x04 \x03(\x0b\x32\x12.facility.Detector\"\x1c\n\x0eGetDetectorReq\x12\n\n\x02no\x18\x01 \x01(\t\"7\n\x0fGetDetectorResp\x12$\n\x08\x44\x65tector\x18\x01 \x01(\x0b\x32\x12.facility.Detector\"[\n\x10WriteDetectorReq\x12\n\n\x02no\x18\x01 \x01(\t\x12\x15\n\rdetector_name\x18\x02 \x01(\t\x12\x11\n\tmodule_id\x18\x03 \x01(\t\x12\x11\n\tfilter_id\x18\x04 \x01(\t\"h\n\x11WriteDetectorResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\x12$\n\x08\x44\x65tector\x18\x03 \x01(\x0b\x32\x12.facility.Detector\"\\\n\x11UpdateDetectorReq\x12\n\n\x02no\x18\x01 \x01(\t\x12\x15\n\rdetector_name\x18\x02 \x01(\t\x12\x11\n\tmodule_id\x18\x03 \x01(\t\x12\x11\n\tfilter_id\x18\x04 \x01(\t\"C\n\x12UpdateDetectorResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\"g\n\rFindStatusReq\x12\x13\n\x0b\x64\x65tector_no\x18\x01 \x01(\t\x12\x19\n\x11status_begin_time\x18\x02 \x01(\x03\x12\x17\n\x0fstatus_end_time\x18\x03 \x01(\x03\x12\r\n\x05limit\x18\x04 \x01(\x05\"~\n\x0e\x46indStatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\ntotalCount\x18\x02 \x01(\x05\x12\x1c\n\x05\x65rror\x18\x03 \x01(\x0b\x32\r.common.Error\x12)\n\x07records\x18\x04 \x03(\x0b\x32\x18.facility.DetectorStatus\"!\n\x0cGetStatusReq\x12\x11\n\tstatus_id\x18\x01 \x01(\x03\"9\n\rGetStatusResp\x12(\n\x06record\x18\x01 \x01(\x0b\x32\x18.facility.DetectorStatus\"J\n\x0eWriteStatusReq\x12\x13\n\x0b\x64\x65tector_no\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x13\n\x0bstatus_time\x18\x03 \x01(\x03\"j\n\x0fWriteStatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\x12(\n\x06record\x18\x03 \x01(\x0b\x32\x18.facility.DetectorStatus2\xe0\x03\n\x0b\x44\x65tectorSrv\x12?\n\x04\x46ind\x12\x19.facility.FindDetectorReq\x1a\x1a.facility.FindDetectorResp\"\x00\x12<\n\x03Get\x12\x18.facility.GetDetectorReq\x1a\x19.facility.GetDetectorResp\"\x00\x12\x42\n\x05Write\x12\x1a.facility.WriteDetectorReq\x1a\x1b.facility.WriteDetectorResp\"\x00\x12\x45\n\x06Update\x12\x1b.facility.UpdateDetectorReq\x1a\x1c.facility.UpdateDetectorResp\"\x00\x12\x41\n\nFindStatus\x12\x17.facility.FindStatusReq\x1a\x18.facility.FindStatusResp\"\x00\x12>\n\tGetStatus\x12\x16.facility.GetStatusReq\x1a\x17.facility.GetStatusResp\"\x00\x12\x44\n\x0bWriteStatus\x12\x18.facility.WriteStatusReq\x1a\x19.facility.WriteStatusResp\"\x00\x42\x1fZ\x1d\x63nlab.net/csst/proto/facilityb\x06proto3')
+  serialized_pb=_b('\n facility/detector/detector.proto\x12\x08\x64\x65tector\x1a\x12\x63ommon/error.proto\"}\n\x08\x44\x65tector\x12\n\n\x02no\x18\x01 \x01(\t\x12\x15\n\rdetector_name\x18\x02 \x01(\t\x12\x11\n\tmodule_id\x18\x03 \x01(\t\x12\x11\n\tfilter_id\x18\x04 \x01(\t\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\x03\x12\x13\n\x0bupdate_time\x18\x06 \x01(\t\"k\n\x0e\x44\x65tectorStatus\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x13\n\x0b\x64\x65tector_no\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x13\n\x0bstatus_time\x18\x04 \x01(\t\x12\x13\n\x0b\x63reate_time\x18\x05 \x01(\t\"1\n\x0f\x46indDetectorReq\x12\x11\n\tmodule_id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\"z\n\x10\x46indDetectorResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\ntotalCount\x18\x02 \x01(\x05\x12\x1c\n\x05\x65rror\x18\x03 \x01(\x0b\x32\r.common.Error\x12#\n\x07records\x18\x04 \x03(\x0b\x32\x12.detector.Detector\"\x1c\n\x0eGetDetectorReq\x12\n\n\x02no\x18\x01 \x01(\t\"7\n\x0fGetDetectorResp\x12$\n\x08\x44\x65tector\x18\x01 \x01(\x0b\x32\x12.detector.Detector\"[\n\x10WriteDetectorReq\x12\n\n\x02no\x18\x01 \x01(\t\x12\x15\n\rdetector_name\x18\x02 \x01(\t\x12\x11\n\tmodule_id\x18\x03 \x01(\t\x12\x11\n\tfilter_id\x18\x04 \x01(\t\"h\n\x11WriteDetectorResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\x12$\n\x08\x44\x65tector\x18\x03 \x01(\x0b\x32\x12.detector.Detector\"\\\n\x11UpdateDetectorReq\x12\n\n\x02no\x18\x01 \x01(\t\x12\x15\n\rdetector_name\x18\x02 \x01(\t\x12\x11\n\tmodule_id\x18\x03 \x01(\t\x12\x11\n\tfilter_id\x18\x04 \x01(\t\"C\n\x12UpdateDetectorResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\"\x1f\n\x11\x44\x65leteDetectorReq\x12\n\n\x02no\x18\x01 \x01(\t\"C\n\x12\x44\x65leteDetectorResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\"g\n\rFindStatusReq\x12\x13\n\x0b\x64\x65tector_no\x18\x01 \x01(\t\x12\x19\n\x11status_begin_time\x18\x02 \x01(\x03\x12\x17\n\x0fstatus_end_time\x18\x03 \x01(\x03\x12\r\n\x05limit\x18\x04 \x01(\x05\"~\n\x0e\x46indStatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\ntotalCount\x18\x02 \x01(\x05\x12\x1c\n\x05\x65rror\x18\x03 \x01(\x0b\x32\r.common.Error\x12)\n\x07records\x18\x04 \x03(\x0b\x32\x18.detector.DetectorStatus\"!\n\x0cGetStatusReq\x12\x11\n\tstatus_id\x18\x01 \x01(\x03\"9\n\rGetStatusResp\x12(\n\x06record\x18\x01 \x01(\x0b\x32\x18.detector.DetectorStatus\"J\n\x0eWriteStatusReq\x12\x13\n\x0b\x64\x65tector_no\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x13\n\x0bstatus_time\x18\x03 \x01(\x03\"j\n\x0fWriteStatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\x12(\n\x06record\x18\x03 \x01(\x0b\x32\x18.detector.DetectorStatus2\xa7\x04\n\x0b\x44\x65tectorSrv\x12?\n\x04\x46ind\x12\x19.detector.FindDetectorReq\x1a\x1a.detector.FindDetectorResp\"\x00\x12<\n\x03Get\x12\x18.detector.GetDetectorReq\x1a\x19.detector.GetDetectorResp\"\x00\x12\x42\n\x05Write\x12\x1a.detector.WriteDetectorReq\x1a\x1b.detector.WriteDetectorResp\"\x00\x12\x45\n\x06Update\x12\x1b.detector.UpdateDetectorReq\x1a\x1c.detector.UpdateDetectorResp\"\x00\x12\x45\n\x06\x44\x65lete\x12\x1b.detector.DeleteDetectorReq\x1a\x1c.detector.DeleteDetectorResp\"\x00\x12\x41\n\nFindStatus\x12\x17.detector.FindStatusReq\x1a\x18.detector.FindStatusResp\"\x00\x12>\n\tGetStatus\x12\x16.detector.GetStatusReq\x1a\x17.detector.GetStatusResp\"\x00\x12\x44\n\x0bWriteStatus\x12\x18.detector.WriteStatusReq\x1a\x19.detector.WriteStatusResp\"\x00\x42\x1fZ\x1d\x63nlab.net/csst/proto/facilityb\x06proto3')
   ,
   dependencies=[common_dot_error__pb2.DESCRIPTOR,])
 
@@ -30,50 +30,50 @@ DESCRIPTOR = _descriptor.FileDescriptor(
 
 _DETECTOR = _descriptor.Descriptor(
   name='Detector',
-  full_name='facility.Detector',
+  full_name='detector.Detector',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='no', full_name='facility.Detector.no', index=0,
+      name='no', full_name='detector.Detector.no', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='detector_name', full_name='facility.Detector.detector_name', index=1,
+      name='detector_name', full_name='detector.Detector.detector_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='module_id', full_name='facility.Detector.module_id', index=2,
+      name='module_id', full_name='detector.Detector.module_id', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='filter_id', full_name='facility.Detector.filter_id', index=3,
+      name='filter_id', full_name='detector.Detector.filter_id', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='create_time', full_name='facility.Detector.create_time', index=4,
+      name='create_time', full_name='detector.Detector.create_time', index=4,
       number=5, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='update_time', full_name='facility.Detector.update_time', index=5,
-      number=6, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
+      name='update_time', full_name='detector.Detector.update_time', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
@@ -89,50 +89,50 @@ _DETECTOR = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=57,
-  serialized_end=182,
+  serialized_start=66,
+  serialized_end=191,
 )
 
 
 _DETECTORSTATUS = _descriptor.Descriptor(
   name='DetectorStatus',
-  full_name='facility.DetectorStatus',
+  full_name='detector.DetectorStatus',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='id', full_name='facility.DetectorStatus.id', index=0,
+      name='id', full_name='detector.DetectorStatus.id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='detector_no', full_name='facility.DetectorStatus.detector_no', index=1,
+      name='detector_no', full_name='detector.DetectorStatus.detector_no', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='status', full_name='facility.DetectorStatus.status', index=2,
+      name='status', full_name='detector.DetectorStatus.status', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='status_time', full_name='facility.DetectorStatus.status_time', index=3,
-      number=4, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
+      name='status_time', full_name='detector.DetectorStatus.status_time', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='create_time', full_name='facility.DetectorStatus.create_time', index=4,
-      number=5, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
+      name='create_time', full_name='detector.DetectorStatus.create_time', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
@@ -148,27 +148,27 @@ _DETECTORSTATUS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=184,
-  serialized_end=291,
+  serialized_start=193,
+  serialized_end=300,
 )
 
 
 _FINDDETECTORREQ = _descriptor.Descriptor(
   name='FindDetectorReq',
-  full_name='facility.FindDetectorReq',
+  full_name='detector.FindDetectorReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='module_id', full_name='facility.FindDetectorReq.module_id', index=0,
+      name='module_id', full_name='detector.FindDetectorReq.module_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='key', full_name='facility.FindDetectorReq.key', index=1,
+      name='key', full_name='detector.FindDetectorReq.key', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -186,41 +186,41 @@ _FINDDETECTORREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=293,
-  serialized_end=342,
+  serialized_start=302,
+  serialized_end=351,
 )
 
 
 _FINDDETECTORRESP = _descriptor.Descriptor(
   name='FindDetectorResp',
-  full_name='facility.FindDetectorResp',
+  full_name='detector.FindDetectorResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.FindDetectorResp.success', index=0,
+      name='success', full_name='detector.FindDetectorResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='totalCount', full_name='facility.FindDetectorResp.totalCount', index=1,
+      name='totalCount', full_name='detector.FindDetectorResp.totalCount', index=1,
       number=2, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.FindDetectorResp.error', index=2,
+      name='error', full_name='detector.FindDetectorResp.error', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='Detector', full_name='facility.FindDetectorResp.Detector', index=3,
+      name='records', full_name='detector.FindDetectorResp.records', index=3,
       number=4, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -238,20 +238,20 @@ _FINDDETECTORRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=344,
-  serialized_end=467,
+  serialized_start=353,
+  serialized_end=475,
 )
 
 
 _GETDETECTORREQ = _descriptor.Descriptor(
   name='GetDetectorReq',
-  full_name='facility.GetDetectorReq',
+  full_name='detector.GetDetectorReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='no', full_name='facility.GetDetectorReq.no', index=0,
+      name='no', full_name='detector.GetDetectorReq.no', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -269,20 +269,20 @@ _GETDETECTORREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=469,
-  serialized_end=497,
+  serialized_start=477,
+  serialized_end=505,
 )
 
 
 _GETDETECTORRESP = _descriptor.Descriptor(
   name='GetDetectorResp',
-  full_name='facility.GetDetectorResp',
+  full_name='detector.GetDetectorResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='Detector', full_name='facility.GetDetectorResp.Detector', index=0,
+      name='Detector', full_name='detector.GetDetectorResp.Detector', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -300,41 +300,41 @@ _GETDETECTORRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=499,
-  serialized_end=554,
+  serialized_start=507,
+  serialized_end=562,
 )
 
 
 _WRITEDETECTORREQ = _descriptor.Descriptor(
   name='WriteDetectorReq',
-  full_name='facility.WriteDetectorReq',
+  full_name='detector.WriteDetectorReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='no', full_name='facility.WriteDetectorReq.no', index=0,
+      name='no', full_name='detector.WriteDetectorReq.no', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='detector_name', full_name='facility.WriteDetectorReq.detector_name', index=1,
+      name='detector_name', full_name='detector.WriteDetectorReq.detector_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='module_id', full_name='facility.WriteDetectorReq.module_id', index=2,
+      name='module_id', full_name='detector.WriteDetectorReq.module_id', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='filter_id', full_name='facility.WriteDetectorReq.filter_id', index=3,
+      name='filter_id', full_name='detector.WriteDetectorReq.filter_id', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -352,34 +352,34 @@ _WRITEDETECTORREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=556,
-  serialized_end=647,
+  serialized_start=564,
+  serialized_end=655,
 )
 
 
 _WRITEDETECTORRESP = _descriptor.Descriptor(
   name='WriteDetectorResp',
-  full_name='facility.WriteDetectorResp',
+  full_name='detector.WriteDetectorResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.WriteDetectorResp.success', index=0,
+      name='success', full_name='detector.WriteDetectorResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.WriteDetectorResp.error', index=1,
+      name='error', full_name='detector.WriteDetectorResp.error', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='Detector', full_name='facility.WriteDetectorResp.Detector', index=2,
+      name='Detector', full_name='detector.WriteDetectorResp.Detector', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -397,41 +397,41 @@ _WRITEDETECTORRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=649,
-  serialized_end=753,
+  serialized_start=657,
+  serialized_end=761,
 )
 
 
 _UPDATEDETECTORREQ = _descriptor.Descriptor(
   name='UpdateDetectorReq',
-  full_name='facility.UpdateDetectorReq',
+  full_name='detector.UpdateDetectorReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='no', full_name='facility.UpdateDetectorReq.no', index=0,
+      name='no', full_name='detector.UpdateDetectorReq.no', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='detector_name', full_name='facility.UpdateDetectorReq.detector_name', index=1,
+      name='detector_name', full_name='detector.UpdateDetectorReq.detector_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='module_id', full_name='facility.UpdateDetectorReq.module_id', index=2,
+      name='module_id', full_name='detector.UpdateDetectorReq.module_id', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='filter_id', full_name='facility.UpdateDetectorReq.filter_id', index=3,
+      name='filter_id', full_name='detector.UpdateDetectorReq.filter_id', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -449,27 +449,96 @@ _UPDATEDETECTORREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=755,
-  serialized_end=847,
+  serialized_start=763,
+  serialized_end=855,
 )
 
 
 _UPDATEDETECTORRESP = _descriptor.Descriptor(
   name='UpdateDetectorResp',
-  full_name='facility.UpdateDetectorResp',
+  full_name='detector.UpdateDetectorResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='success', full_name='detector.UpdateDetectorResp.success', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='detector.UpdateDetectorResp.error', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=857,
+  serialized_end=924,
+)
+
+
+_DELETEDETECTORREQ = _descriptor.Descriptor(
+  name='DeleteDetectorReq',
+  full_name='detector.DeleteDetectorReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.UpdateDetectorResp.success', index=0,
+      name='no', full_name='detector.DeleteDetectorReq.no', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=926,
+  serialized_end=957,
+)
+
+
+_DELETEDETECTORRESP = _descriptor.Descriptor(
+  name='DeleteDetectorResp',
+  full_name='detector.DeleteDetectorResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='success', full_name='detector.DeleteDetectorResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.UpdateDetectorResp.error', index=1,
+      name='error', full_name='detector.DeleteDetectorResp.error', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -487,41 +556,41 @@ _UPDATEDETECTORRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=849,
-  serialized_end=916,
+  serialized_start=959,
+  serialized_end=1026,
 )
 
 
 _FINDSTATUSREQ = _descriptor.Descriptor(
   name='FindStatusReq',
-  full_name='facility.FindStatusReq',
+  full_name='detector.FindStatusReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='detector_no', full_name='facility.FindStatusReq.detector_no', index=0,
+      name='detector_no', full_name='detector.FindStatusReq.detector_no', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='status_begin_time', full_name='facility.FindStatusReq.status_begin_time', index=1,
+      name='status_begin_time', full_name='detector.FindStatusReq.status_begin_time', index=1,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='status_end_time', full_name='facility.FindStatusReq.status_end_time', index=2,
+      name='status_end_time', full_name='detector.FindStatusReq.status_end_time', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='limit', full_name='facility.FindStatusReq.limit', index=3,
+      name='limit', full_name='detector.FindStatusReq.limit', index=3,
       number=4, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -539,41 +608,41 @@ _FINDSTATUSREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=918,
-  serialized_end=1021,
+  serialized_start=1028,
+  serialized_end=1131,
 )
 
 
 _FINDSTATUSRESP = _descriptor.Descriptor(
   name='FindStatusResp',
-  full_name='facility.FindStatusResp',
+  full_name='detector.FindStatusResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.FindStatusResp.success', index=0,
+      name='success', full_name='detector.FindStatusResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='totalCount', full_name='facility.FindStatusResp.totalCount', index=1,
+      name='totalCount', full_name='detector.FindStatusResp.totalCount', index=1,
       number=2, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.FindStatusResp.error', index=2,
+      name='error', full_name='detector.FindStatusResp.error', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='records', full_name='facility.FindStatusResp.records', index=3,
+      name='records', full_name='detector.FindStatusResp.records', index=3,
       number=4, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -591,20 +660,20 @@ _FINDSTATUSRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1023,
-  serialized_end=1149,
+  serialized_start=1133,
+  serialized_end=1259,
 )
 
 
 _GETSTATUSREQ = _descriptor.Descriptor(
   name='GetStatusReq',
-  full_name='facility.GetStatusReq',
+  full_name='detector.GetStatusReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='status_id', full_name='facility.GetStatusReq.status_id', index=0,
+      name='status_id', full_name='detector.GetStatusReq.status_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -622,20 +691,20 @@ _GETSTATUSREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1151,
-  serialized_end=1184,
+  serialized_start=1261,
+  serialized_end=1294,
 )
 
 
 _GETSTATUSRESP = _descriptor.Descriptor(
   name='GetStatusResp',
-  full_name='facility.GetStatusResp',
+  full_name='detector.GetStatusResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='record', full_name='facility.GetStatusResp.record', index=0,
+      name='record', full_name='detector.GetStatusResp.record', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -653,34 +722,34 @@ _GETSTATUSRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1186,
-  serialized_end=1243,
+  serialized_start=1296,
+  serialized_end=1353,
 )
 
 
 _WRITESTATUSREQ = _descriptor.Descriptor(
   name='WriteStatusReq',
-  full_name='facility.WriteStatusReq',
+  full_name='detector.WriteStatusReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='detector_no', full_name='facility.WriteStatusReq.detector_no', index=0,
+      name='detector_no', full_name='detector.WriteStatusReq.detector_no', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='status', full_name='facility.WriteStatusReq.status', index=1,
+      name='status', full_name='detector.WriteStatusReq.status', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='status_time', full_name='facility.WriteStatusReq.status_time', index=2,
+      name='status_time', full_name='detector.WriteStatusReq.status_time', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -698,34 +767,34 @@ _WRITESTATUSREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1245,
-  serialized_end=1319,
+  serialized_start=1355,
+  serialized_end=1429,
 )
 
 
 _WRITESTATUSRESP = _descriptor.Descriptor(
   name='WriteStatusResp',
-  full_name='facility.WriteStatusResp',
+  full_name='detector.WriteStatusResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.WriteStatusResp.success', index=0,
+      name='success', full_name='detector.WriteStatusResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.WriteStatusResp.error', index=1,
+      name='error', full_name='detector.WriteStatusResp.error', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='record', full_name='facility.WriteStatusResp.record', index=2,
+      name='record', full_name='detector.WriteStatusResp.record', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -743,16 +812,17 @@ _WRITESTATUSRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1321,
-  serialized_end=1427,
+  serialized_start=1431,
+  serialized_end=1537,
 )
 
 _FINDDETECTORRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
-_FINDDETECTORRESP.fields_by_name['Detector'].message_type = _DETECTOR
+_FINDDETECTORRESP.fields_by_name['records'].message_type = _DETECTOR
 _GETDETECTORRESP.fields_by_name['Detector'].message_type = _DETECTOR
 _WRITEDETECTORRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
 _WRITEDETECTORRESP.fields_by_name['Detector'].message_type = _DETECTOR
 _UPDATEDETECTORRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+_DELETEDETECTORRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
 _FINDSTATUSRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
 _FINDSTATUSRESP.fields_by_name['records'].message_type = _DETECTORSTATUS
 _GETSTATUSRESP.fields_by_name['record'].message_type = _DETECTORSTATUS
@@ -768,6 +838,8 @@ DESCRIPTOR.message_types_by_name['WriteDetectorReq'] = _WRITEDETECTORREQ
 DESCRIPTOR.message_types_by_name['WriteDetectorResp'] = _WRITEDETECTORRESP
 DESCRIPTOR.message_types_by_name['UpdateDetectorReq'] = _UPDATEDETECTORREQ
 DESCRIPTOR.message_types_by_name['UpdateDetectorResp'] = _UPDATEDETECTORRESP
+DESCRIPTOR.message_types_by_name['DeleteDetectorReq'] = _DELETEDETECTORREQ
+DESCRIPTOR.message_types_by_name['DeleteDetectorResp'] = _DELETEDETECTORRESP
 DESCRIPTOR.message_types_by_name['FindStatusReq'] = _FINDSTATUSREQ
 DESCRIPTOR.message_types_by_name['FindStatusResp'] = _FINDSTATUSRESP
 DESCRIPTOR.message_types_by_name['GetStatusReq'] = _GETSTATUSREQ
@@ -778,113 +850,127 @@ _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 Detector = _reflection.GeneratedProtocolMessageType('Detector', (_message.Message,), {
   'DESCRIPTOR' : _DETECTOR,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.Detector)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.Detector)
   })
 _sym_db.RegisterMessage(Detector)
 
 DetectorStatus = _reflection.GeneratedProtocolMessageType('DetectorStatus', (_message.Message,), {
   'DESCRIPTOR' : _DETECTORSTATUS,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.DetectorStatus)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.DetectorStatus)
   })
 _sym_db.RegisterMessage(DetectorStatus)
 
 FindDetectorReq = _reflection.GeneratedProtocolMessageType('FindDetectorReq', (_message.Message,), {
   'DESCRIPTOR' : _FINDDETECTORREQ,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.FindDetectorReq)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.FindDetectorReq)
   })
 _sym_db.RegisterMessage(FindDetectorReq)
 
 FindDetectorResp = _reflection.GeneratedProtocolMessageType('FindDetectorResp', (_message.Message,), {
   'DESCRIPTOR' : _FINDDETECTORRESP,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.FindDetectorResp)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.FindDetectorResp)
   })
 _sym_db.RegisterMessage(FindDetectorResp)
 
 GetDetectorReq = _reflection.GeneratedProtocolMessageType('GetDetectorReq', (_message.Message,), {
   'DESCRIPTOR' : _GETDETECTORREQ,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.GetDetectorReq)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.GetDetectorReq)
   })
 _sym_db.RegisterMessage(GetDetectorReq)
 
 GetDetectorResp = _reflection.GeneratedProtocolMessageType('GetDetectorResp', (_message.Message,), {
   'DESCRIPTOR' : _GETDETECTORRESP,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.GetDetectorResp)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.GetDetectorResp)
   })
 _sym_db.RegisterMessage(GetDetectorResp)
 
 WriteDetectorReq = _reflection.GeneratedProtocolMessageType('WriteDetectorReq', (_message.Message,), {
   'DESCRIPTOR' : _WRITEDETECTORREQ,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.WriteDetectorReq)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.WriteDetectorReq)
   })
 _sym_db.RegisterMessage(WriteDetectorReq)
 
 WriteDetectorResp = _reflection.GeneratedProtocolMessageType('WriteDetectorResp', (_message.Message,), {
   'DESCRIPTOR' : _WRITEDETECTORRESP,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.WriteDetectorResp)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.WriteDetectorResp)
   })
 _sym_db.RegisterMessage(WriteDetectorResp)
 
 UpdateDetectorReq = _reflection.GeneratedProtocolMessageType('UpdateDetectorReq', (_message.Message,), {
   'DESCRIPTOR' : _UPDATEDETECTORREQ,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.UpdateDetectorReq)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.UpdateDetectorReq)
   })
 _sym_db.RegisterMessage(UpdateDetectorReq)
 
 UpdateDetectorResp = _reflection.GeneratedProtocolMessageType('UpdateDetectorResp', (_message.Message,), {
   'DESCRIPTOR' : _UPDATEDETECTORRESP,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.UpdateDetectorResp)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.UpdateDetectorResp)
   })
 _sym_db.RegisterMessage(UpdateDetectorResp)
 
+DeleteDetectorReq = _reflection.GeneratedProtocolMessageType('DeleteDetectorReq', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEDETECTORREQ,
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.DeleteDetectorReq)
+  })
+_sym_db.RegisterMessage(DeleteDetectorReq)
+
+DeleteDetectorResp = _reflection.GeneratedProtocolMessageType('DeleteDetectorResp', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEDETECTORRESP,
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.DeleteDetectorResp)
+  })
+_sym_db.RegisterMessage(DeleteDetectorResp)
+
 FindStatusReq = _reflection.GeneratedProtocolMessageType('FindStatusReq', (_message.Message,), {
   'DESCRIPTOR' : _FINDSTATUSREQ,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.FindStatusReq)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.FindStatusReq)
   })
 _sym_db.RegisterMessage(FindStatusReq)
 
 FindStatusResp = _reflection.GeneratedProtocolMessageType('FindStatusResp', (_message.Message,), {
   'DESCRIPTOR' : _FINDSTATUSRESP,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.FindStatusResp)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.FindStatusResp)
   })
 _sym_db.RegisterMessage(FindStatusResp)
 
 GetStatusReq = _reflection.GeneratedProtocolMessageType('GetStatusReq', (_message.Message,), {
   'DESCRIPTOR' : _GETSTATUSREQ,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.GetStatusReq)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.GetStatusReq)
   })
 _sym_db.RegisterMessage(GetStatusReq)
 
 GetStatusResp = _reflection.GeneratedProtocolMessageType('GetStatusResp', (_message.Message,), {
   'DESCRIPTOR' : _GETSTATUSRESP,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.GetStatusResp)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.GetStatusResp)
   })
 _sym_db.RegisterMessage(GetStatusResp)
 
 WriteStatusReq = _reflection.GeneratedProtocolMessageType('WriteStatusReq', (_message.Message,), {
   'DESCRIPTOR' : _WRITESTATUSREQ,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.WriteStatusReq)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.WriteStatusReq)
   })
 _sym_db.RegisterMessage(WriteStatusReq)
 
 WriteStatusResp = _reflection.GeneratedProtocolMessageType('WriteStatusResp', (_message.Message,), {
   'DESCRIPTOR' : _WRITESTATUSRESP,
-  '__module__' : 'facility.detector_pb2'
-  # @@protoc_insertion_point(class_scope:facility.WriteStatusResp)
+  '__module__' : 'facility.detector.detector_pb2'
+  # @@protoc_insertion_point(class_scope:detector.WriteStatusResp)
   })
 _sym_db.RegisterMessage(WriteStatusResp)
 
@@ -893,16 +979,16 @@ DESCRIPTOR._options = None
 
 _DETECTORSRV = _descriptor.ServiceDescriptor(
   name='DetectorSrv',
-  full_name='facility.DetectorSrv',
+  full_name='detector.DetectorSrv',
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=1430,
-  serialized_end=1910,
+  serialized_start=1540,
+  serialized_end=2091,
   methods=[
   _descriptor.MethodDescriptor(
     name='Find',
-    full_name='facility.DetectorSrv.Find',
+    full_name='detector.DetectorSrv.Find',
     index=0,
     containing_service=None,
     input_type=_FINDDETECTORREQ,
@@ -911,7 +997,7 @@ _DETECTORSRV = _descriptor.ServiceDescriptor(
   ),
   _descriptor.MethodDescriptor(
     name='Get',
-    full_name='facility.DetectorSrv.Get',
+    full_name='detector.DetectorSrv.Get',
     index=1,
     containing_service=None,
     input_type=_GETDETECTORREQ,
@@ -920,7 +1006,7 @@ _DETECTORSRV = _descriptor.ServiceDescriptor(
   ),
   _descriptor.MethodDescriptor(
     name='Write',
-    full_name='facility.DetectorSrv.Write',
+    full_name='detector.DetectorSrv.Write',
     index=2,
     containing_service=None,
     input_type=_WRITEDETECTORREQ,
@@ -929,7 +1015,7 @@ _DETECTORSRV = _descriptor.ServiceDescriptor(
   ),
   _descriptor.MethodDescriptor(
     name='Update',
-    full_name='facility.DetectorSrv.Update',
+    full_name='detector.DetectorSrv.Update',
     index=3,
     containing_service=None,
     input_type=_UPDATEDETECTORREQ,
@@ -937,18 +1023,27 @@ _DETECTORSRV = _descriptor.ServiceDescriptor(
     serialized_options=None,
   ),
   _descriptor.MethodDescriptor(
-    name='FindStatus',
-    full_name='facility.DetectorSrv.FindStatus',
+    name='Delete',
+    full_name='detector.DetectorSrv.Delete',
     index=4,
     containing_service=None,
+    input_type=_DELETEDETECTORREQ,
+    output_type=_DELETEDETECTORRESP,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindStatus',
+    full_name='detector.DetectorSrv.FindStatus',
+    index=5,
+    containing_service=None,
     input_type=_FINDSTATUSREQ,
     output_type=_FINDSTATUSRESP,
     serialized_options=None,
   ),
   _descriptor.MethodDescriptor(
     name='GetStatus',
-    full_name='facility.DetectorSrv.GetStatus',
-    index=5,
+    full_name='detector.DetectorSrv.GetStatus',
+    index=6,
     containing_service=None,
     input_type=_GETSTATUSREQ,
     output_type=_GETSTATUSRESP,
@@ -956,8 +1051,8 @@ _DETECTORSRV = _descriptor.ServiceDescriptor(
   ),
   _descriptor.MethodDescriptor(
     name='WriteStatus',
-    full_name='facility.DetectorSrv.WriteStatus',
-    index=6,
+    full_name='detector.DetectorSrv.WriteStatus',
+    index=7,
     containing_service=None,
     input_type=_WRITESTATUSREQ,
     output_type=_WRITESTATUSRESP,
diff --git a/csst_dfs_proto/facility/detector/detector_pb2_grpc.py b/csst_dfs_proto/facility/detector/detector_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..b22d0740c292937c1b7d79a716e84c7394ff824d
--- /dev/null
+++ b/csst_dfs_proto/facility/detector/detector_pb2_grpc.py
@@ -0,0 +1,165 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+
+from . import detector_pb2 as facility_dot_detector_dot_detector__pb2
+
+
+class DetectorSrvStub(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.Find = channel.unary_unary(
+        '/detector.DetectorSrv/Find',
+        request_serializer=facility_dot_detector_dot_detector__pb2.FindDetectorReq.SerializeToString,
+        response_deserializer=facility_dot_detector_dot_detector__pb2.FindDetectorResp.FromString,
+        )
+    self.Get = channel.unary_unary(
+        '/detector.DetectorSrv/Get',
+        request_serializer=facility_dot_detector_dot_detector__pb2.GetDetectorReq.SerializeToString,
+        response_deserializer=facility_dot_detector_dot_detector__pb2.GetDetectorResp.FromString,
+        )
+    self.Write = channel.unary_unary(
+        '/detector.DetectorSrv/Write',
+        request_serializer=facility_dot_detector_dot_detector__pb2.WriteDetectorReq.SerializeToString,
+        response_deserializer=facility_dot_detector_dot_detector__pb2.WriteDetectorResp.FromString,
+        )
+    self.Update = channel.unary_unary(
+        '/detector.DetectorSrv/Update',
+        request_serializer=facility_dot_detector_dot_detector__pb2.UpdateDetectorReq.SerializeToString,
+        response_deserializer=facility_dot_detector_dot_detector__pb2.UpdateDetectorResp.FromString,
+        )
+    self.Delete = channel.unary_unary(
+        '/detector.DetectorSrv/Delete',
+        request_serializer=facility_dot_detector_dot_detector__pb2.DeleteDetectorReq.SerializeToString,
+        response_deserializer=facility_dot_detector_dot_detector__pb2.DeleteDetectorResp.FromString,
+        )
+    self.FindStatus = channel.unary_unary(
+        '/detector.DetectorSrv/FindStatus',
+        request_serializer=facility_dot_detector_dot_detector__pb2.FindStatusReq.SerializeToString,
+        response_deserializer=facility_dot_detector_dot_detector__pb2.FindStatusResp.FromString,
+        )
+    self.GetStatus = channel.unary_unary(
+        '/detector.DetectorSrv/GetStatus',
+        request_serializer=facility_dot_detector_dot_detector__pb2.GetStatusReq.SerializeToString,
+        response_deserializer=facility_dot_detector_dot_detector__pb2.GetStatusResp.FromString,
+        )
+    self.WriteStatus = channel.unary_unary(
+        '/detector.DetectorSrv/WriteStatus',
+        request_serializer=facility_dot_detector_dot_detector__pb2.WriteStatusReq.SerializeToString,
+        response_deserializer=facility_dot_detector_dot_detector__pb2.WriteStatusResp.FromString,
+        )
+
+
+class DetectorSrvServicer(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def Find(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Get(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Write(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Update(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Delete(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def FindStatus(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def GetStatus(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def WriteStatus(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_DetectorSrvServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'Find': grpc.unary_unary_rpc_method_handler(
+          servicer.Find,
+          request_deserializer=facility_dot_detector_dot_detector__pb2.FindDetectorReq.FromString,
+          response_serializer=facility_dot_detector_dot_detector__pb2.FindDetectorResp.SerializeToString,
+      ),
+      'Get': grpc.unary_unary_rpc_method_handler(
+          servicer.Get,
+          request_deserializer=facility_dot_detector_dot_detector__pb2.GetDetectorReq.FromString,
+          response_serializer=facility_dot_detector_dot_detector__pb2.GetDetectorResp.SerializeToString,
+      ),
+      'Write': grpc.unary_unary_rpc_method_handler(
+          servicer.Write,
+          request_deserializer=facility_dot_detector_dot_detector__pb2.WriteDetectorReq.FromString,
+          response_serializer=facility_dot_detector_dot_detector__pb2.WriteDetectorResp.SerializeToString,
+      ),
+      'Update': grpc.unary_unary_rpc_method_handler(
+          servicer.Update,
+          request_deserializer=facility_dot_detector_dot_detector__pb2.UpdateDetectorReq.FromString,
+          response_serializer=facility_dot_detector_dot_detector__pb2.UpdateDetectorResp.SerializeToString,
+      ),
+      'Delete': grpc.unary_unary_rpc_method_handler(
+          servicer.Delete,
+          request_deserializer=facility_dot_detector_dot_detector__pb2.DeleteDetectorReq.FromString,
+          response_serializer=facility_dot_detector_dot_detector__pb2.DeleteDetectorResp.SerializeToString,
+      ),
+      'FindStatus': grpc.unary_unary_rpc_method_handler(
+          servicer.FindStatus,
+          request_deserializer=facility_dot_detector_dot_detector__pb2.FindStatusReq.FromString,
+          response_serializer=facility_dot_detector_dot_detector__pb2.FindStatusResp.SerializeToString,
+      ),
+      'GetStatus': grpc.unary_unary_rpc_method_handler(
+          servicer.GetStatus,
+          request_deserializer=facility_dot_detector_dot_detector__pb2.GetStatusReq.FromString,
+          response_serializer=facility_dot_detector_dot_detector__pb2.GetStatusResp.SerializeToString,
+      ),
+      'WriteStatus': grpc.unary_unary_rpc_method_handler(
+          servicer.WriteStatus,
+          request_deserializer=facility_dot_detector_dot_detector__pb2.WriteStatusReq.FromString,
+          response_serializer=facility_dot_detector_dot_detector__pb2.WriteStatusResp.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'detector.DetectorSrv', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/csst_dfs_proto/facility/detector_pb2_grpc.py b/csst_dfs_proto/facility/detector_pb2_grpc.py
deleted file mode 100644
index 28ea9b511d20444a6d41a177ce0ac92f660ed728..0000000000000000000000000000000000000000
--- a/csst_dfs_proto/facility/detector_pb2_grpc.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from . import detector_pb2 as facility_dot_detector__pb2
-
-
-class DetectorSrvStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.Find = channel.unary_unary(
-        '/facility.DetectorSrv/Find',
-        request_serializer=facility_dot_detector__pb2.FindDetectorReq.SerializeToString,
-        response_deserializer=facility_dot_detector__pb2.FindDetectorResp.FromString,
-        )
-    self.Get = channel.unary_unary(
-        '/facility.DetectorSrv/Get',
-        request_serializer=facility_dot_detector__pb2.GetDetectorReq.SerializeToString,
-        response_deserializer=facility_dot_detector__pb2.GetDetectorResp.FromString,
-        )
-    self.Write = channel.unary_unary(
-        '/facility.DetectorSrv/Write',
-        request_serializer=facility_dot_detector__pb2.WriteDetectorReq.SerializeToString,
-        response_deserializer=facility_dot_detector__pb2.WriteDetectorResp.FromString,
-        )
-    self.Update = channel.unary_unary(
-        '/facility.DetectorSrv/Update',
-        request_serializer=facility_dot_detector__pb2.UpdateDetectorReq.SerializeToString,
-        response_deserializer=facility_dot_detector__pb2.UpdateDetectorResp.FromString,
-        )
-    self.FindStatus = channel.unary_unary(
-        '/facility.DetectorSrv/FindStatus',
-        request_serializer=facility_dot_detector__pb2.FindStatusReq.SerializeToString,
-        response_deserializer=facility_dot_detector__pb2.FindStatusResp.FromString,
-        )
-    self.GetStatus = channel.unary_unary(
-        '/facility.DetectorSrv/GetStatus',
-        request_serializer=facility_dot_detector__pb2.GetStatusReq.SerializeToString,
-        response_deserializer=facility_dot_detector__pb2.GetStatusResp.FromString,
-        )
-    self.WriteStatus = channel.unary_unary(
-        '/facility.DetectorSrv/WriteStatus',
-        request_serializer=facility_dot_detector__pb2.WriteStatusReq.SerializeToString,
-        response_deserializer=facility_dot_detector__pb2.WriteStatusResp.FromString,
-        )
-
-
-class DetectorSrvServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def Find(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Get(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Write(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Update(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def FindStatus(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def GetStatus(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def WriteStatus(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_DetectorSrvServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Find': grpc.unary_unary_rpc_method_handler(
-          servicer.Find,
-          request_deserializer=facility_dot_detector__pb2.FindDetectorReq.FromString,
-          response_serializer=facility_dot_detector__pb2.FindDetectorResp.SerializeToString,
-      ),
-      'Get': grpc.unary_unary_rpc_method_handler(
-          servicer.Get,
-          request_deserializer=facility_dot_detector__pb2.GetDetectorReq.FromString,
-          response_serializer=facility_dot_detector__pb2.GetDetectorResp.SerializeToString,
-      ),
-      'Write': grpc.unary_unary_rpc_method_handler(
-          servicer.Write,
-          request_deserializer=facility_dot_detector__pb2.WriteDetectorReq.FromString,
-          response_serializer=facility_dot_detector__pb2.WriteDetectorResp.SerializeToString,
-      ),
-      'Update': grpc.unary_unary_rpc_method_handler(
-          servicer.Update,
-          request_deserializer=facility_dot_detector__pb2.UpdateDetectorReq.FromString,
-          response_serializer=facility_dot_detector__pb2.UpdateDetectorResp.SerializeToString,
-      ),
-      'FindStatus': grpc.unary_unary_rpc_method_handler(
-          servicer.FindStatus,
-          request_deserializer=facility_dot_detector__pb2.FindStatusReq.FromString,
-          response_serializer=facility_dot_detector__pb2.FindStatusResp.SerializeToString,
-      ),
-      'GetStatus': grpc.unary_unary_rpc_method_handler(
-          servicer.GetStatus,
-          request_deserializer=facility_dot_detector__pb2.GetStatusReq.FromString,
-          response_serializer=facility_dot_detector__pb2.GetStatusResp.SerializeToString,
-      ),
-      'WriteStatus': grpc.unary_unary_rpc_method_handler(
-          servicer.WriteStatus,
-          request_deserializer=facility_dot_detector__pb2.WriteStatusReq.FromString,
-          response_serializer=facility_dot_detector__pb2.WriteStatusResp.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'facility.DetectorSrv', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/csst_dfs_proto/facility/exposure_pb2_grpc.py b/csst_dfs_proto/facility/exposure_pb2_grpc.py
deleted file mode 100644
index 6a1efdf3869fb36213e46e4507403efca550ab53..0000000000000000000000000000000000000000
--- a/csst_dfs_proto/facility/exposure_pb2_grpc.py
+++ /dev/null
@@ -1,114 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from . import exposure_pb2 as facility_dot_exposure__pb2
-
-
-class ExposureSrvStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.Find = channel.unary_unary(
-        '/facility.ExposureSrv/Find',
-        request_serializer=facility_dot_exposure__pb2.FindExposureReq.SerializeToString,
-        response_deserializer=facility_dot_exposure__pb2.FindExposureResp.FromString,
-        )
-    self.Get = channel.unary_unary(
-        '/facility.ExposureSrv/Get',
-        request_serializer=facility_dot_exposure__pb2.GetExposureReq.SerializeToString,
-        response_deserializer=facility_dot_exposure__pb2.GetExposureResp.FromString,
-        )
-    self.Write = channel.stream_unary(
-        '/facility.ExposureSrv/Write',
-        request_serializer=facility_dot_exposure__pb2.WriteExposureReq.SerializeToString,
-        response_deserializer=facility_dot_exposure__pb2.WriteExposureResp.FromString,
-        )
-    self.UpdateQc0Status = channel.unary_unary(
-        '/facility.ExposureSrv/UpdateQc0Status',
-        request_serializer=facility_dot_exposure__pb2.UpdateQc0StatusReq.SerializeToString,
-        response_deserializer=facility_dot_exposure__pb2.UpdateQc0StatusResp.FromString,
-        )
-    self.UpdateProcStatus = channel.unary_unary(
-        '/facility.ExposureSrv/UpdateProcStatus',
-        request_serializer=facility_dot_exposure__pb2.UpdateProcStatusReq.SerializeToString,
-        response_deserializer=facility_dot_exposure__pb2.UpdateProcStatusResp.FromString,
-        )
-
-
-class ExposureSrvServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def Find(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Get(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Write(self, request_iterator, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def UpdateQc0Status(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def UpdateProcStatus(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_ExposureSrvServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Find': grpc.unary_unary_rpc_method_handler(
-          servicer.Find,
-          request_deserializer=facility_dot_exposure__pb2.FindExposureReq.FromString,
-          response_serializer=facility_dot_exposure__pb2.FindExposureResp.SerializeToString,
-      ),
-      'Get': grpc.unary_unary_rpc_method_handler(
-          servicer.Get,
-          request_deserializer=facility_dot_exposure__pb2.GetExposureReq.FromString,
-          response_serializer=facility_dot_exposure__pb2.GetExposureResp.SerializeToString,
-      ),
-      'Write': grpc.stream_unary_rpc_method_handler(
-          servicer.Write,
-          request_deserializer=facility_dot_exposure__pb2.WriteExposureReq.FromString,
-          response_serializer=facility_dot_exposure__pb2.WriteExposureResp.SerializeToString,
-      ),
-      'UpdateQc0Status': grpc.unary_unary_rpc_method_handler(
-          servicer.UpdateQc0Status,
-          request_deserializer=facility_dot_exposure__pb2.UpdateQc0StatusReq.FromString,
-          response_serializer=facility_dot_exposure__pb2.UpdateQc0StatusResp.SerializeToString,
-      ),
-      'UpdateProcStatus': grpc.unary_unary_rpc_method_handler(
-          servicer.UpdateProcStatus,
-          request_deserializer=facility_dot_exposure__pb2.UpdateProcStatusReq.FromString,
-          response_serializer=facility_dot_exposure__pb2.UpdateProcStatusResp.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'facility.ExposureSrv', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/csst_dfs_proto/facility/level0/__init__.py b/csst_dfs_proto/facility/level0/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/csst_dfs_proto/facility/level0/level0_pb2.py b/csst_dfs_proto/facility/level0/level0_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd4ef85b6b49187402acbf541d78d309603df76c
--- /dev/null
+++ b/csst_dfs_proto/facility/level0/level0_pb2.py
@@ -0,0 +1,692 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: facility/level0/level0.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from ...common import error_pb2 as common_dot_error__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='facility/level0/level0.proto',
+  package='level0',
+  syntax='proto3',
+  serialized_options=_b('Z$cnlab.net/csst/proto/facility/level0'),
+  serialized_pb=_b('\n\x1c\x66\x61\x63ility/level0/level0.proto\x12\x06level0\x1a\x12\x63ommon/error.proto\"\x97\x02\n\x0cLevel0Record\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0e\n\x06obs_id\x18\x02 \x01(\x03\x12\x13\n\x0b\x64\x65tector_no\x18\x03 \x01(\t\x12\x10\n\x08obs_type\x18\x04 \x01(\t\x12\x10\n\x08obs_time\x18\x05 \x01(\t\x12\x10\n\x08\x65xp_time\x18\x06 \x01(\x02\x12\x1a\n\x12\x64\x65tector_status_id\x18\x07 \x01(\x03\x12\x10\n\x08\x66ilename\x18\x08 \x01(\t\x12\x11\n\tfile_path\x18\t \x01(\t\x12\x12\n\nqc0_status\x18\n \x01(\r\x12\x10\n\x08qc0_time\x18\x0b \x01(\t\x12\x12\n\nprc_status\x18\x0c \x01(\r\x12\x10\n\x08prc_time\x18\r \x01(\t\x12\x13\n\x0b\x63reate_time\x18\x0e \x01(\t\"\xc4\x02\n\x11\x46indLevel0DataReq\x12\x0e\n\x06obs_id\x18\x01 \x01(\x03\x12\x13\n\x0b\x64\x65tector_no\x18\x02 \x01(\t\x12\x10\n\x08obs_type\x18\x03 \x01(\t\x12\x16\n\x0e\x65xp_time_start\x18\x04 \x01(\t\x12\x14\n\x0c\x65xp_time_end\x18\x05 \x01(\t\x12\x12\n\nqc0_status\x18\x06 \x01(\r\x12\x12\n\nprc_status\x18\x07 \x01(\r\x12\x11\n\tfile_name\x18\x08 \x01(\t\x12\r\n\x05limit\x18\t \x01(\r\x12H\n\x10other_conditions\x18\n \x03(\x0b\x32..level0.FindLevel0DataReq.OtherConditionsEntry\x1a\x36\n\x14OtherConditionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"~\n\x12\x46indLevel0DataResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\ntotalCount\x18\x02 \x01(\x05\x12\x1c\n\x05\x65rror\x18\x03 \x01(\x0b\x32\r.common.Error\x12%\n\x07records\x18\x04 \x03(\x0b\x32\x14.level0.Level0Record\"\x1e\n\x10GetLevel0DataReq\x12\n\n\x02id\x18\x01 \x01(\x03\"9\n\x11GetLevel0DataResp\x12$\n\x06record\x18\x01 \x01(\x0b\x32\x14.level0.Level0Record\"0\n\x12UpdateQc0StatusReq\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0e\n\x06status\x18\x02 \x01(\r\"D\n\x13UpdateQc0StatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\"1\n\x13UpdateProcStatusReq\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0e\n\x06status\x18\x02 \x01(\r\"E\n\x14UpdateProcStatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error2\xa9\x02\n\tLevel0Srv\x12?\n\x04\x46ind\x12\x19.level0.FindLevel0DataReq\x1a\x1a.level0.FindLevel0DataResp\"\x00\x12<\n\x03Get\x12\x18.level0.GetLevel0DataReq\x1a\x19.level0.GetLevel0DataResp\"\x00\x12L\n\x0fUpdateQc0Status\x12\x1a.level0.UpdateQc0StatusReq\x1a\x1b.level0.UpdateQc0StatusResp\"\x00\x12O\n\x10UpdateProcStatus\x12\x1b.level0.UpdateProcStatusReq\x1a\x1c.level0.UpdateProcStatusResp\"\x00\x42&Z$cnlab.net/csst/proto/facility/level0b\x06proto3')
+  ,
+  dependencies=[common_dot_error__pb2.DESCRIPTOR,])
+
+
+
+
+_LEVEL0RECORD = _descriptor.Descriptor(
+  name='Level0Record',
+  full_name='level0.Level0Record',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='level0.Level0Record.id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='obs_id', full_name='level0.Level0Record.obs_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='detector_no', full_name='level0.Level0Record.detector_no', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='obs_type', full_name='level0.Level0Record.obs_type', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='obs_time', full_name='level0.Level0Record.obs_time', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='exp_time', full_name='level0.Level0Record.exp_time', index=5,
+      number=6, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='detector_status_id', full_name='level0.Level0Record.detector_status_id', index=6,
+      number=7, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='filename', full_name='level0.Level0Record.filename', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='file_path', full_name='level0.Level0Record.file_path', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='qc0_status', full_name='level0.Level0Record.qc0_status', index=9,
+      number=10, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='qc0_time', full_name='level0.Level0Record.qc0_time', index=10,
+      number=11, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prc_status', full_name='level0.Level0Record.prc_status', index=11,
+      number=12, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prc_time', full_name='level0.Level0Record.prc_time', index=12,
+      number=13, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='create_time', full_name='level0.Level0Record.create_time', index=13,
+      number=14, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=61,
+  serialized_end=340,
+)
+
+
+_FINDLEVEL0DATAREQ_OTHERCONDITIONSENTRY = _descriptor.Descriptor(
+  name='OtherConditionsEntry',
+  full_name='level0.FindLevel0DataReq.OtherConditionsEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='level0.FindLevel0DataReq.OtherConditionsEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='level0.FindLevel0DataReq.OtherConditionsEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=_b('8\001'),
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=613,
+  serialized_end=667,
+)
+
+_FINDLEVEL0DATAREQ = _descriptor.Descriptor(
+  name='FindLevel0DataReq',
+  full_name='level0.FindLevel0DataReq',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='obs_id', full_name='level0.FindLevel0DataReq.obs_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='detector_no', full_name='level0.FindLevel0DataReq.detector_no', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='obs_type', full_name='level0.FindLevel0DataReq.obs_type', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='exp_time_start', full_name='level0.FindLevel0DataReq.exp_time_start', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='exp_time_end', full_name='level0.FindLevel0DataReq.exp_time_end', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='qc0_status', full_name='level0.FindLevel0DataReq.qc0_status', index=5,
+      number=6, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prc_status', full_name='level0.FindLevel0DataReq.prc_status', index=6,
+      number=7, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='file_name', full_name='level0.FindLevel0DataReq.file_name', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='level0.FindLevel0DataReq.limit', index=8,
+      number=9, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='other_conditions', full_name='level0.FindLevel0DataReq.other_conditions', index=9,
+      number=10, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[_FINDLEVEL0DATAREQ_OTHERCONDITIONSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=343,
+  serialized_end=667,
+)
+
+
+_FINDLEVEL0DATARESP = _descriptor.Descriptor(
+  name='FindLevel0DataResp',
+  full_name='level0.FindLevel0DataResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='success', full_name='level0.FindLevel0DataResp.success', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='totalCount', full_name='level0.FindLevel0DataResp.totalCount', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='level0.FindLevel0DataResp.error', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='records', full_name='level0.FindLevel0DataResp.records', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=669,
+  serialized_end=795,
+)
+
+
+_GETLEVEL0DATAREQ = _descriptor.Descriptor(
+  name='GetLevel0DataReq',
+  full_name='level0.GetLevel0DataReq',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='level0.GetLevel0DataReq.id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=797,
+  serialized_end=827,
+)
+
+
+_GETLEVEL0DATARESP = _descriptor.Descriptor(
+  name='GetLevel0DataResp',
+  full_name='level0.GetLevel0DataResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='record', full_name='level0.GetLevel0DataResp.record', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=829,
+  serialized_end=886,
+)
+
+
+_UPDATEQC0STATUSREQ = _descriptor.Descriptor(
+  name='UpdateQc0StatusReq',
+  full_name='level0.UpdateQc0StatusReq',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='level0.UpdateQc0StatusReq.id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='level0.UpdateQc0StatusReq.status', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=888,
+  serialized_end=936,
+)
+
+
+_UPDATEQC0STATUSRESP = _descriptor.Descriptor(
+  name='UpdateQc0StatusResp',
+  full_name='level0.UpdateQc0StatusResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='success', full_name='level0.UpdateQc0StatusResp.success', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='level0.UpdateQc0StatusResp.error', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=938,
+  serialized_end=1006,
+)
+
+
+_UPDATEPROCSTATUSREQ = _descriptor.Descriptor(
+  name='UpdateProcStatusReq',
+  full_name='level0.UpdateProcStatusReq',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='level0.UpdateProcStatusReq.id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='level0.UpdateProcStatusReq.status', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1008,
+  serialized_end=1057,
+)
+
+
+_UPDATEPROCSTATUSRESP = _descriptor.Descriptor(
+  name='UpdateProcStatusResp',
+  full_name='level0.UpdateProcStatusResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='success', full_name='level0.UpdateProcStatusResp.success', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='level0.UpdateProcStatusResp.error', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1059,
+  serialized_end=1128,
+)
+
+_FINDLEVEL0DATAREQ_OTHERCONDITIONSENTRY.containing_type = _FINDLEVEL0DATAREQ
+_FINDLEVEL0DATAREQ.fields_by_name['other_conditions'].message_type = _FINDLEVEL0DATAREQ_OTHERCONDITIONSENTRY
+_FINDLEVEL0DATARESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+_FINDLEVEL0DATARESP.fields_by_name['records'].message_type = _LEVEL0RECORD
+_GETLEVEL0DATARESP.fields_by_name['record'].message_type = _LEVEL0RECORD
+_UPDATEQC0STATUSRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+_UPDATEPROCSTATUSRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+DESCRIPTOR.message_types_by_name['Level0Record'] = _LEVEL0RECORD
+DESCRIPTOR.message_types_by_name['FindLevel0DataReq'] = _FINDLEVEL0DATAREQ
+DESCRIPTOR.message_types_by_name['FindLevel0DataResp'] = _FINDLEVEL0DATARESP
+DESCRIPTOR.message_types_by_name['GetLevel0DataReq'] = _GETLEVEL0DATAREQ
+DESCRIPTOR.message_types_by_name['GetLevel0DataResp'] = _GETLEVEL0DATARESP
+DESCRIPTOR.message_types_by_name['UpdateQc0StatusReq'] = _UPDATEQC0STATUSREQ
+DESCRIPTOR.message_types_by_name['UpdateQc0StatusResp'] = _UPDATEQC0STATUSRESP
+DESCRIPTOR.message_types_by_name['UpdateProcStatusReq'] = _UPDATEPROCSTATUSREQ
+DESCRIPTOR.message_types_by_name['UpdateProcStatusResp'] = _UPDATEPROCSTATUSRESP
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Level0Record = _reflection.GeneratedProtocolMessageType('Level0Record', (_message.Message,), {
+  'DESCRIPTOR' : _LEVEL0RECORD,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.Level0Record)
+  })
+_sym_db.RegisterMessage(Level0Record)
+
+FindLevel0DataReq = _reflection.GeneratedProtocolMessageType('FindLevel0DataReq', (_message.Message,), {
+
+  'OtherConditionsEntry' : _reflection.GeneratedProtocolMessageType('OtherConditionsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _FINDLEVEL0DATAREQ_OTHERCONDITIONSENTRY,
+    '__module__' : 'facility.level0.level0_pb2'
+    # @@protoc_insertion_point(class_scope:level0.FindLevel0DataReq.OtherConditionsEntry)
+    })
+  ,
+  'DESCRIPTOR' : _FINDLEVEL0DATAREQ,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.FindLevel0DataReq)
+  })
+_sym_db.RegisterMessage(FindLevel0DataReq)
+_sym_db.RegisterMessage(FindLevel0DataReq.OtherConditionsEntry)
+
+FindLevel0DataResp = _reflection.GeneratedProtocolMessageType('FindLevel0DataResp', (_message.Message,), {
+  'DESCRIPTOR' : _FINDLEVEL0DATARESP,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.FindLevel0DataResp)
+  })
+_sym_db.RegisterMessage(FindLevel0DataResp)
+
+GetLevel0DataReq = _reflection.GeneratedProtocolMessageType('GetLevel0DataReq', (_message.Message,), {
+  'DESCRIPTOR' : _GETLEVEL0DATAREQ,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.GetLevel0DataReq)
+  })
+_sym_db.RegisterMessage(GetLevel0DataReq)
+
+GetLevel0DataResp = _reflection.GeneratedProtocolMessageType('GetLevel0DataResp', (_message.Message,), {
+  'DESCRIPTOR' : _GETLEVEL0DATARESP,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.GetLevel0DataResp)
+  })
+_sym_db.RegisterMessage(GetLevel0DataResp)
+
+UpdateQc0StatusReq = _reflection.GeneratedProtocolMessageType('UpdateQc0StatusReq', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEQC0STATUSREQ,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.UpdateQc0StatusReq)
+  })
+_sym_db.RegisterMessage(UpdateQc0StatusReq)
+
+UpdateQc0StatusResp = _reflection.GeneratedProtocolMessageType('UpdateQc0StatusResp', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEQC0STATUSRESP,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.UpdateQc0StatusResp)
+  })
+_sym_db.RegisterMessage(UpdateQc0StatusResp)
+
+UpdateProcStatusReq = _reflection.GeneratedProtocolMessageType('UpdateProcStatusReq', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEPROCSTATUSREQ,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.UpdateProcStatusReq)
+  })
+_sym_db.RegisterMessage(UpdateProcStatusReq)
+
+UpdateProcStatusResp = _reflection.GeneratedProtocolMessageType('UpdateProcStatusResp', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEPROCSTATUSRESP,
+  '__module__' : 'facility.level0.level0_pb2'
+  # @@protoc_insertion_point(class_scope:level0.UpdateProcStatusResp)
+  })
+_sym_db.RegisterMessage(UpdateProcStatusResp)
+
+
+DESCRIPTOR._options = None
+_FINDLEVEL0DATAREQ_OTHERCONDITIONSENTRY._options = None
+
+_LEVEL0SRV = _descriptor.ServiceDescriptor(
+  name='Level0Srv',
+  full_name='level0.Level0Srv',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=1131,
+  serialized_end=1428,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Find',
+    full_name='level0.Level0Srv.Find',
+    index=0,
+    containing_service=None,
+    input_type=_FINDLEVEL0DATAREQ,
+    output_type=_FINDLEVEL0DATARESP,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='level0.Level0Srv.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETLEVEL0DATAREQ,
+    output_type=_GETLEVEL0DATARESP,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateQc0Status',
+    full_name='level0.Level0Srv.UpdateQc0Status',
+    index=2,
+    containing_service=None,
+    input_type=_UPDATEQC0STATUSREQ,
+    output_type=_UPDATEQC0STATUSRESP,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateProcStatus',
+    full_name='level0.Level0Srv.UpdateProcStatus',
+    index=3,
+    containing_service=None,
+    input_type=_UPDATEPROCSTATUSREQ,
+    output_type=_UPDATEPROCSTATUSRESP,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_LEVEL0SRV)
+
+DESCRIPTOR.services_by_name['Level0Srv'] = _LEVEL0SRV
+
+# @@protoc_insertion_point(module_scope)
diff --git a/csst_dfs_proto/facility/level0/level0_pb2_grpc.py b/csst_dfs_proto/facility/level0/level0_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..61941c7c33114c93a337ae8e9a95101c97d31ac9
--- /dev/null
+++ b/csst_dfs_proto/facility/level0/level0_pb2_grpc.py
@@ -0,0 +1,97 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+
+from . import level0_pb2 as facility_dot_level0_dot_level0__pb2
+
+
+class Level0SrvStub(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.Find = channel.unary_unary(
+        '/level0.Level0Srv/Find',
+        request_serializer=facility_dot_level0_dot_level0__pb2.FindLevel0DataReq.SerializeToString,
+        response_deserializer=facility_dot_level0_dot_level0__pb2.FindLevel0DataResp.FromString,
+        )
+    self.Get = channel.unary_unary(
+        '/level0.Level0Srv/Get',
+        request_serializer=facility_dot_level0_dot_level0__pb2.GetLevel0DataReq.SerializeToString,
+        response_deserializer=facility_dot_level0_dot_level0__pb2.GetLevel0DataResp.FromString,
+        )
+    self.UpdateQc0Status = channel.unary_unary(
+        '/level0.Level0Srv/UpdateQc0Status',
+        request_serializer=facility_dot_level0_dot_level0__pb2.UpdateQc0StatusReq.SerializeToString,
+        response_deserializer=facility_dot_level0_dot_level0__pb2.UpdateQc0StatusResp.FromString,
+        )
+    self.UpdateProcStatus = channel.unary_unary(
+        '/level0.Level0Srv/UpdateProcStatus',
+        request_serializer=facility_dot_level0_dot_level0__pb2.UpdateProcStatusReq.SerializeToString,
+        response_deserializer=facility_dot_level0_dot_level0__pb2.UpdateProcStatusResp.FromString,
+        )
+
+
+class Level0SrvServicer(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def Find(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Get(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def UpdateQc0Status(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def UpdateProcStatus(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_Level0SrvServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'Find': grpc.unary_unary_rpc_method_handler(
+          servicer.Find,
+          request_deserializer=facility_dot_level0_dot_level0__pb2.FindLevel0DataReq.FromString,
+          response_serializer=facility_dot_level0_dot_level0__pb2.FindLevel0DataResp.SerializeToString,
+      ),
+      'Get': grpc.unary_unary_rpc_method_handler(
+          servicer.Get,
+          request_deserializer=facility_dot_level0_dot_level0__pb2.GetLevel0DataReq.FromString,
+          response_serializer=facility_dot_level0_dot_level0__pb2.GetLevel0DataResp.SerializeToString,
+      ),
+      'UpdateQc0Status': grpc.unary_unary_rpc_method_handler(
+          servicer.UpdateQc0Status,
+          request_deserializer=facility_dot_level0_dot_level0__pb2.UpdateQc0StatusReq.FromString,
+          response_serializer=facility_dot_level0_dot_level0__pb2.UpdateQc0StatusResp.SerializeToString,
+      ),
+      'UpdateProcStatus': grpc.unary_unary_rpc_method_handler(
+          servicer.UpdateProcStatus,
+          request_deserializer=facility_dot_level0_dot_level0__pb2.UpdateProcStatusReq.FromString,
+          response_serializer=facility_dot_level0_dot_level0__pb2.UpdateProcStatusResp.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'level0.Level0Srv', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/csst_dfs_proto/facility/level0prc/__init__.py b/csst_dfs_proto/facility/level0prc/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/csst_dfs_proto/facility/level0prc/level0prc_pb2.py b/csst_dfs_proto/facility/level0prc/level0prc_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..b65824572ef0739d0aaca24c5db279846849f2fb
--- /dev/null
+++ b/csst_dfs_proto/facility/level0prc/level0prc_pb2.py
@@ -0,0 +1,529 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: facility/level0prc/level0prc.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from ...common import error_pb2 as common_dot_error__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='facility/level0prc/level0prc.proto',
+  package='level0prc',
+  syntax='proto3',
+  serialized_options=_b('Z\'cnlab.net/csst/proto/facility/level0prc'),
+  serialized_pb=_b('\n\"facility/level0prc/level0prc.proto\x12\tlevel0prc\x1a\x12\x63ommon/error.proto\"\xa5\x01\n\x0fLevel0PrcRecord\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x11\n\tlevel0_id\x18\x02 \x01(\x03\x12\x13\n\x0bpipeline_id\x18\x03 \x01(\t\x12\x12\n\nprc_module\x18\x04 \x01(\t\x12\x11\n\tparams_id\x18\x05 \x01(\t\x12\x12\n\nprc_status\x18\x06 \x01(\r\x12\x10\n\x08prc_time\x18\x07 \x01(\t\x12\x11\n\tfile_path\x18\x08 \x01(\t\"\xe6\x01\n\x10\x46indLevel0PrcReq\x12\x11\n\tlevel0_id\x18\x01 \x01(\x03\x12\x13\n\x0bpipeline_id\x18\x02 \x01(\t\x12\x12\n\nprc_module\x18\x03 \x01(\t\x12\x12\n\nprc_status\x18\x04 \x01(\r\x12J\n\x10other_conditions\x18\x05 \x03(\x0b\x32\x30.level0prc.FindLevel0PrcReq.OtherConditionsEntry\x1a\x36\n\x14OtherConditionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x83\x01\n\x11\x46indLevel0PrcResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\ntotalCount\x18\x02 \x01(\x05\x12\x1c\n\x05\x65rror\x18\x03 \x01(\x0b\x32\r.common.Error\x12+\n\x07records\x18\x04 \x03(\x0b\x32\x1a.level0prc.Level0PrcRecord\"?\n\x11WriteLevel0PrcReq\x12*\n\x06record\x18\x01 \x01(\x0b\x32\x1a.level0prc.Level0PrcRecord\"o\n\x12WriteLevel0PrcResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\x12*\n\x06record\x18\x03 \x01(\x0b\x32\x1a.level0prc.Level0PrcRecord\"1\n\x13UpdateProcStatusReq\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0e\n\x06status\x18\x02 \x01(\r\"E\n\x14UpdateProcStatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error2\xf2\x01\n\x0cLevel0PrcSrv\x12\x43\n\x04\x46ind\x12\x1b.level0prc.FindLevel0PrcReq\x1a\x1c.level0prc.FindLevel0PrcResp\"\x00\x12\x46\n\x05Write\x12\x1c.level0prc.WriteLevel0PrcReq\x1a\x1d.level0prc.WriteLevel0PrcResp\"\x00\x12U\n\x10UpdateProcStatus\x12\x1e.level0prc.UpdateProcStatusReq\x1a\x1f.level0prc.UpdateProcStatusResp\"\x00\x42)Z\'cnlab.net/csst/proto/facility/level0prcb\x06proto3')
+  ,
+  dependencies=[common_dot_error__pb2.DESCRIPTOR,])
+
+
+
+
+_LEVEL0PRCRECORD = _descriptor.Descriptor(
+  name='Level0PrcRecord',
+  full_name='level0prc.Level0PrcRecord',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='level0prc.Level0PrcRecord.id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='level0_id', full_name='level0prc.Level0PrcRecord.level0_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='pipeline_id', full_name='level0prc.Level0PrcRecord.pipeline_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prc_module', full_name='level0prc.Level0PrcRecord.prc_module', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='params_id', full_name='level0prc.Level0PrcRecord.params_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prc_status', full_name='level0prc.Level0PrcRecord.prc_status', index=5,
+      number=6, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prc_time', full_name='level0prc.Level0PrcRecord.prc_time', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='file_path', full_name='level0prc.Level0PrcRecord.file_path', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=70,
+  serialized_end=235,
+)
+
+
+_FINDLEVEL0PRCREQ_OTHERCONDITIONSENTRY = _descriptor.Descriptor(
+  name='OtherConditionsEntry',
+  full_name='level0prc.FindLevel0PrcReq.OtherConditionsEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='level0prc.FindLevel0PrcReq.OtherConditionsEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='level0prc.FindLevel0PrcReq.OtherConditionsEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=_b('8\001'),
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=414,
+  serialized_end=468,
+)
+
+_FINDLEVEL0PRCREQ = _descriptor.Descriptor(
+  name='FindLevel0PrcReq',
+  full_name='level0prc.FindLevel0PrcReq',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='level0_id', full_name='level0prc.FindLevel0PrcReq.level0_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='pipeline_id', full_name='level0prc.FindLevel0PrcReq.pipeline_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prc_module', full_name='level0prc.FindLevel0PrcReq.prc_module', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='prc_status', full_name='level0prc.FindLevel0PrcReq.prc_status', index=3,
+      number=4, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='other_conditions', full_name='level0prc.FindLevel0PrcReq.other_conditions', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[_FINDLEVEL0PRCREQ_OTHERCONDITIONSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=238,
+  serialized_end=468,
+)
+
+
+_FINDLEVEL0PRCRESP = _descriptor.Descriptor(
+  name='FindLevel0PrcResp',
+  full_name='level0prc.FindLevel0PrcResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='success', full_name='level0prc.FindLevel0PrcResp.success', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='totalCount', full_name='level0prc.FindLevel0PrcResp.totalCount', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='level0prc.FindLevel0PrcResp.error', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='records', full_name='level0prc.FindLevel0PrcResp.records', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=471,
+  serialized_end=602,
+)
+
+
+_WRITELEVEL0PRCREQ = _descriptor.Descriptor(
+  name='WriteLevel0PrcReq',
+  full_name='level0prc.WriteLevel0PrcReq',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='record', full_name='level0prc.WriteLevel0PrcReq.record', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=604,
+  serialized_end=667,
+)
+
+
+_WRITELEVEL0PRCRESP = _descriptor.Descriptor(
+  name='WriteLevel0PrcResp',
+  full_name='level0prc.WriteLevel0PrcResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='success', full_name='level0prc.WriteLevel0PrcResp.success', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='level0prc.WriteLevel0PrcResp.error', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='record', full_name='level0prc.WriteLevel0PrcResp.record', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=669,
+  serialized_end=780,
+)
+
+
+_UPDATEPROCSTATUSREQ = _descriptor.Descriptor(
+  name='UpdateProcStatusReq',
+  full_name='level0prc.UpdateProcStatusReq',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='level0prc.UpdateProcStatusReq.id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='level0prc.UpdateProcStatusReq.status', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=782,
+  serialized_end=831,
+)
+
+
+_UPDATEPROCSTATUSRESP = _descriptor.Descriptor(
+  name='UpdateProcStatusResp',
+  full_name='level0prc.UpdateProcStatusResp',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='success', full_name='level0prc.UpdateProcStatusResp.success', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='level0prc.UpdateProcStatusResp.error', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=833,
+  serialized_end=902,
+)
+
+_FINDLEVEL0PRCREQ_OTHERCONDITIONSENTRY.containing_type = _FINDLEVEL0PRCREQ
+_FINDLEVEL0PRCREQ.fields_by_name['other_conditions'].message_type = _FINDLEVEL0PRCREQ_OTHERCONDITIONSENTRY
+_FINDLEVEL0PRCRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+_FINDLEVEL0PRCRESP.fields_by_name['records'].message_type = _LEVEL0PRCRECORD
+_WRITELEVEL0PRCREQ.fields_by_name['record'].message_type = _LEVEL0PRCRECORD
+_WRITELEVEL0PRCRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+_WRITELEVEL0PRCRESP.fields_by_name['record'].message_type = _LEVEL0PRCRECORD
+_UPDATEPROCSTATUSRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+DESCRIPTOR.message_types_by_name['Level0PrcRecord'] = _LEVEL0PRCRECORD
+DESCRIPTOR.message_types_by_name['FindLevel0PrcReq'] = _FINDLEVEL0PRCREQ
+DESCRIPTOR.message_types_by_name['FindLevel0PrcResp'] = _FINDLEVEL0PRCRESP
+DESCRIPTOR.message_types_by_name['WriteLevel0PrcReq'] = _WRITELEVEL0PRCREQ
+DESCRIPTOR.message_types_by_name['WriteLevel0PrcResp'] = _WRITELEVEL0PRCRESP
+DESCRIPTOR.message_types_by_name['UpdateProcStatusReq'] = _UPDATEPROCSTATUSREQ
+DESCRIPTOR.message_types_by_name['UpdateProcStatusResp'] = _UPDATEPROCSTATUSRESP
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Level0PrcRecord = _reflection.GeneratedProtocolMessageType('Level0PrcRecord', (_message.Message,), {
+  'DESCRIPTOR' : _LEVEL0PRCRECORD,
+  '__module__' : 'facility.level0prc.level0prc_pb2'
+  # @@protoc_insertion_point(class_scope:level0prc.Level0PrcRecord)
+  })
+_sym_db.RegisterMessage(Level0PrcRecord)
+
+FindLevel0PrcReq = _reflection.GeneratedProtocolMessageType('FindLevel0PrcReq', (_message.Message,), {
+
+  'OtherConditionsEntry' : _reflection.GeneratedProtocolMessageType('OtherConditionsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _FINDLEVEL0PRCREQ_OTHERCONDITIONSENTRY,
+    '__module__' : 'facility.level0prc.level0prc_pb2'
+    # @@protoc_insertion_point(class_scope:level0prc.FindLevel0PrcReq.OtherConditionsEntry)
+    })
+  ,
+  'DESCRIPTOR' : _FINDLEVEL0PRCREQ,
+  '__module__' : 'facility.level0prc.level0prc_pb2'
+  # @@protoc_insertion_point(class_scope:level0prc.FindLevel0PrcReq)
+  })
+_sym_db.RegisterMessage(FindLevel0PrcReq)
+_sym_db.RegisterMessage(FindLevel0PrcReq.OtherConditionsEntry)
+
+FindLevel0PrcResp = _reflection.GeneratedProtocolMessageType('FindLevel0PrcResp', (_message.Message,), {
+  'DESCRIPTOR' : _FINDLEVEL0PRCRESP,
+  '__module__' : 'facility.level0prc.level0prc_pb2'
+  # @@protoc_insertion_point(class_scope:level0prc.FindLevel0PrcResp)
+  })
+_sym_db.RegisterMessage(FindLevel0PrcResp)
+
+WriteLevel0PrcReq = _reflection.GeneratedProtocolMessageType('WriteLevel0PrcReq', (_message.Message,), {
+  'DESCRIPTOR' : _WRITELEVEL0PRCREQ,
+  '__module__' : 'facility.level0prc.level0prc_pb2'
+  # @@protoc_insertion_point(class_scope:level0prc.WriteLevel0PrcReq)
+  })
+_sym_db.RegisterMessage(WriteLevel0PrcReq)
+
+WriteLevel0PrcResp = _reflection.GeneratedProtocolMessageType('WriteLevel0PrcResp', (_message.Message,), {
+  'DESCRIPTOR' : _WRITELEVEL0PRCRESP,
+  '__module__' : 'facility.level0prc.level0prc_pb2'
+  # @@protoc_insertion_point(class_scope:level0prc.WriteLevel0PrcResp)
+  })
+_sym_db.RegisterMessage(WriteLevel0PrcResp)
+
+UpdateProcStatusReq = _reflection.GeneratedProtocolMessageType('UpdateProcStatusReq', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEPROCSTATUSREQ,
+  '__module__' : 'facility.level0prc.level0prc_pb2'
+  # @@protoc_insertion_point(class_scope:level0prc.UpdateProcStatusReq)
+  })
+_sym_db.RegisterMessage(UpdateProcStatusReq)
+
+UpdateProcStatusResp = _reflection.GeneratedProtocolMessageType('UpdateProcStatusResp', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEPROCSTATUSRESP,
+  '__module__' : 'facility.level0prc.level0prc_pb2'
+  # @@protoc_insertion_point(class_scope:level0prc.UpdateProcStatusResp)
+  })
+_sym_db.RegisterMessage(UpdateProcStatusResp)
+
+
+DESCRIPTOR._options = None
+_FINDLEVEL0PRCREQ_OTHERCONDITIONSENTRY._options = None
+
+_LEVEL0PRCSRV = _descriptor.ServiceDescriptor(
+  name='Level0PrcSrv',
+  full_name='level0prc.Level0PrcSrv',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=905,
+  serialized_end=1147,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Find',
+    full_name='level0prc.Level0PrcSrv.Find',
+    index=0,
+    containing_service=None,
+    input_type=_FINDLEVEL0PRCREQ,
+    output_type=_FINDLEVEL0PRCRESP,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Write',
+    full_name='level0prc.Level0PrcSrv.Write',
+    index=1,
+    containing_service=None,
+    input_type=_WRITELEVEL0PRCREQ,
+    output_type=_WRITELEVEL0PRCRESP,
+    serialized_options=None,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateProcStatus',
+    full_name='level0prc.Level0PrcSrv.UpdateProcStatus',
+    index=2,
+    containing_service=None,
+    input_type=_UPDATEPROCSTATUSREQ,
+    output_type=_UPDATEPROCSTATUSRESP,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_LEVEL0PRCSRV)
+
+DESCRIPTOR.services_by_name['Level0PrcSrv'] = _LEVEL0PRCSRV
+
+# @@protoc_insertion_point(module_scope)
diff --git a/csst_dfs_proto/facility/level0prc/level0prc_pb2_grpc.py b/csst_dfs_proto/facility/level0prc/level0prc_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..92c29f915f533838ba112f9109df202a5172f687
--- /dev/null
+++ b/csst_dfs_proto/facility/level0prc/level0prc_pb2_grpc.py
@@ -0,0 +1,80 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+
+from . import level0prc_pb2 as facility_dot_level0prc_dot_level0prc__pb2
+
+
+class Level0PrcSrvStub(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.Find = channel.unary_unary(
+        '/level0prc.Level0PrcSrv/Find',
+        request_serializer=facility_dot_level0prc_dot_level0prc__pb2.FindLevel0PrcReq.SerializeToString,
+        response_deserializer=facility_dot_level0prc_dot_level0prc__pb2.FindLevel0PrcResp.FromString,
+        )
+    self.Write = channel.unary_unary(
+        '/level0prc.Level0PrcSrv/Write',
+        request_serializer=facility_dot_level0prc_dot_level0prc__pb2.WriteLevel0PrcReq.SerializeToString,
+        response_deserializer=facility_dot_level0prc_dot_level0prc__pb2.WriteLevel0PrcResp.FromString,
+        )
+    self.UpdateProcStatus = channel.unary_unary(
+        '/level0prc.Level0PrcSrv/UpdateProcStatus',
+        request_serializer=facility_dot_level0prc_dot_level0prc__pb2.UpdateProcStatusReq.SerializeToString,
+        response_deserializer=facility_dot_level0prc_dot_level0prc__pb2.UpdateProcStatusResp.FromString,
+        )
+
+
+class Level0PrcSrvServicer(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def Find(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Write(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def UpdateProcStatus(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_Level0PrcSrvServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'Find': grpc.unary_unary_rpc_method_handler(
+          servicer.Find,
+          request_deserializer=facility_dot_level0prc_dot_level0prc__pb2.FindLevel0PrcReq.FromString,
+          response_serializer=facility_dot_level0prc_dot_level0prc__pb2.FindLevel0PrcResp.SerializeToString,
+      ),
+      'Write': grpc.unary_unary_rpc_method_handler(
+          servicer.Write,
+          request_deserializer=facility_dot_level0prc_dot_level0prc__pb2.WriteLevel0PrcReq.FromString,
+          response_serializer=facility_dot_level0prc_dot_level0prc__pb2.WriteLevel0PrcResp.SerializeToString,
+      ),
+      'UpdateProcStatus': grpc.unary_unary_rpc_method_handler(
+          servicer.UpdateProcStatus,
+          request_deserializer=facility_dot_level0prc_dot_level0prc__pb2.UpdateProcStatusReq.FromString,
+          response_serializer=facility_dot_level0prc_dot_level0prc__pb2.UpdateProcStatusResp.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'level0prc.Level0PrcSrv', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/csst_dfs_proto/facility/observation/__init__.py b/csst_dfs_proto/facility/observation/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/csst_dfs_proto/facility/exposure_pb2.py b/csst_dfs_proto/facility/observation/observation_pb2.py
similarity index 56%
rename from csst_dfs_proto/facility/exposure_pb2.py
rename to csst_dfs_proto/facility/observation/observation_pb2.py
index 47e7dd9ef59dec3918434c1787b0766b91589b3c..9adc6fa5bc4a1c1915ad507405d607b29608b41c 100644
--- a/csst_dfs_proto/facility/exposure_pb2.py
+++ b/csst_dfs_proto/facility/observation/observation_pb2.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: facility/exposure.proto
+# source: facility/observation/observation.proto
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
@@ -13,108 +13,115 @@ from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
 
 
-from ..common import error_pb2 as common_dot_error__pb2
+from ...common import error_pb2 as common_dot_error__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
-  name='facility/exposure.proto',
-  package='facility',
+  name='facility/observation/observation.proto',
+  package='observation',
   syntax='proto3',
-  serialized_options=_b('Z\035cnlab.net/csst/proto/facility'),
-  serialized_pb=_b('\n\x17\x66\x61\x63ility/exposure.proto\x12\x08\x66\x61\x63ility\x1a\x12\x63ommon/error.proto\"\x80\x02\n\x08\x45xposure\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x16\n\x0e\x65xp_begin_time\x18\x02 \x01(\x03\x12\x14\n\x0c\x65xp_end_time\x18\x03 \x01(\x03\x12\x11\n\tmodule_id\x18\x04 \x01(\t\x12\x10\n\x08obs_type\x18\x05 \x01(\t\x12\x1a\n\x12\x66\x61\x63ility_status_id\x18\x06 \x01(\x03\x12\x18\n\x10module_status_id\x18\x07 \x01(\x03\x12\x12\n\nqc0_status\x18\x08 \x01(\r\x12\x10\n\x08qc0_time\x18\t \x01(\x03\x12\x12\n\nprc_status\x18\n \x01(\r\x12\x10\n\x08prc_time\x18\x0b \x01(\x03\x12\x13\n\x0b\x63reate_time\x18\x0c \x01(\x03\"\xa1\x02\n\x0f\x46indExposureReq\x12\x11\n\tmodule_id\x18\x01 \x01(\t\x12\x10\n\x08obs_type\x18\x02 \x01(\t\x12\x11\n\tfile_name\x18\x03 \x01(\t\x12\x16\n\x0e\x65xp_time_start\x18\x04 \x01(\t\x12\x14\n\x0c\x65xp_time_end\x18\x05 \x01(\t\x12\x12\n\nqc0_status\x18\x06 \x01(\r\x12\x12\n\nprc_status\x18\x07 \x01(\r\x12H\n\x10other_conditions\x18\x08 \x03(\x0b\x32..facility.FindExposureReq.OtherConditionsEntry\x1a\x36\n\x14OtherConditionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"{\n\x10\x46indExposureResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\ntotalCount\x18\x02 \x01(\x05\x12\x1c\n\x05\x65rror\x18\x03 \x01(\x0b\x32\r.common.Error\x12$\n\x08\x45xposure\x18\x04 \x03(\x0b\x32\x12.facility.Exposure\" \n\x0eGetExposureReq\x12\x0e\n\x06obs_id\x18\x01 \x01(\x03\"7\n\x0fGetExposureResp\x12$\n\x08\x45xposure\x18\x01 \x01(\x0b\x32\x12.facility.Exposure\"\xa7\x01\n\x10WriteExposureReq\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x16\n\x0e\x65xp_begin_time\x18\x02 \x01(\x03\x12\x14\n\x0c\x65xp_end_time\x18\x03 \x01(\x03\x12\x11\n\tmodule_id\x18\x04 \x01(\t\x12\x10\n\x08obs_type\x18\x05 \x01(\t\x12\x1a\n\x12\x66\x61\x63ility_status_id\x18\x06 \x01(\x03\x12\x18\n\x10module_status_id\x18\x07 \x01(\x03\"h\n\x11WriteExposureResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\x12$\n\x08\x65xposure\x18\x03 \x01(\x0b\x32\x12.facility.Exposure\"4\n\x12UpdateQc0StatusReq\x12\x0e\n\x06obs_id\x18\x01 \x01(\x03\x12\x0e\n\x06status\x18\x02 \x01(\r\"D\n\x13UpdateQc0StatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\"5\n\x13UpdateProcStatusReq\x12\x0e\n\x06obs_id\x18\x01 \x01(\x03\x12\x0e\n\x06status\x18\x02 \x01(\r\"E\n\x14UpdateProcStatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error2\xf9\x02\n\x0b\x45xposureSrv\x12?\n\x04\x46ind\x12\x19.facility.FindExposureReq\x1a\x1a.facility.FindExposureResp\"\x00\x12<\n\x03Get\x12\x18.facility.GetExposureReq\x1a\x19.facility.GetExposureResp\"\x00\x12\x44\n\x05Write\x12\x1a.facility.WriteExposureReq\x1a\x1b.facility.WriteExposureResp\"\x00(\x01\x12P\n\x0fUpdateQc0Status\x12\x1c.facility.UpdateQc0StatusReq\x1a\x1d.facility.UpdateQc0StatusResp\"\x00\x12S\n\x10UpdateProcStatus\x12\x1d.facility.UpdateProcStatusReq\x1a\x1e.facility.UpdateProcStatusResp\"\x00\x42\x1fZ\x1d\x63nlab.net/csst/proto/facilityb\x06proto3')
+  serialized_options=_b('Z)cnlab.net/csst/proto/facility/observation'),
+  serialized_pb=_b('\n&facility/observation/observation.proto\x12\x0bobservation\x1a\x12\x63ommon/error.proto\"\x90\x02\n\x0bObservation\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x10\n\x08obs_time\x18\x02 \x01(\t\x12\x10\n\x08\x65xp_time\x18\x03 \x01(\x02\x12\x11\n\tmodule_id\x18\x04 \x01(\t\x12\x10\n\x08obs_type\x18\x05 \x01(\t\x12\x1a\n\x12\x66\x61\x63ility_status_id\x18\x06 \x01(\x03\x12\x18\n\x10module_status_id\x18\x07 \x01(\x03\x12\x12\n\nqc0_status\x18\x08 \x01(\r\x12\x10\n\x08qc0_time\x18\t \x01(\t\x12\x12\n\nprc_status\x18\n \x01(\r\x12\x10\n\x08prc_time\x18\x0b \x01(\t\x12\x13\n\x0b\x63reate_time\x18\x0c \x01(\t\x12\x15\n\rimport_status\x18\r \x01(\r\"\xa6\x02\n\x12\x46indObservationReq\x12\x11\n\tmodule_id\x18\x01 \x01(\t\x12\x10\n\x08obs_type\x18\x02 \x01(\t\x12\x16\n\x0e\x65xp_time_start\x18\x03 \x01(\t\x12\x14\n\x0c\x65xp_time_end\x18\x04 \x01(\t\x12\x12\n\nqc0_status\x18\x05 \x01(\r\x12\x12\n\nprc_status\x18\x06 \x01(\r\x12\r\n\x05limit\x18\x07 \x01(\r\x12N\n\x10other_conditions\x18\x08 \x03(\x0b\x32\x34.observation.FindObservationReq.OtherConditionsEntry\x1a\x36\n\x14OtherConditionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x83\x01\n\x13\x46indObservationResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\ntotalCount\x18\x02 \x01(\x05\x12\x1c\n\x05\x65rror\x18\x03 \x01(\x0b\x32\r.common.Error\x12)\n\x07records\x18\x04 \x03(\x0b\x32\x18.observation.Observation\"#\n\x11GetObservationReq\x12\x0e\n\x06obs_id\x18\x01 \x01(\x03\"C\n\x12GetObservationResp\x12-\n\x0bobservation\x18\x01 \x01(\x0b\x32\x18.observation.Observation\"\xaa\x01\n\x13WriteObservationReq\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x16\n\x0e\x65xp_begin_time\x18\x02 \x01(\x03\x12\x14\n\x0c\x65xp_end_time\x18\x03 \x01(\x03\x12\x11\n\tmodule_id\x18\x04 \x01(\t\x12\x10\n\x08obs_type\x18\x05 \x01(\t\x12\x1a\n\x12\x66\x61\x63ility_status_id\x18\x06 \x01(\x03\x12\x18\n\x10module_status_id\x18\x07 \x01(\x03\"t\n\x14WriteObservationResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\x12-\n\x0bobservation\x18\x03 \x01(\x0b\x32\x18.observation.Observation\"4\n\x12UpdateQc0StatusReq\x12\x0e\n\x06obs_id\x18\x01 \x01(\x03\x12\x0e\n\x06status\x18\x02 \x01(\r\"D\n\x13UpdateQc0StatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error\"5\n\x13UpdateProcStatusReq\x12\x0e\n\x06obs_id\x18\x01 \x01(\x03\x12\x0e\n\x06status\x18\x02 \x01(\r\"E\n\x14UpdateProcStatusResp\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x1c\n\x05\x65rror\x18\x02 \x01(\x0b\x32\r.common.Error2\xac\x03\n\x0eObservationSrv\x12K\n\x04\x46ind\x12\x1f.observation.FindObservationReq\x1a .observation.FindObservationResp\"\x00\x12H\n\x03Get\x12\x1e.observation.GetObservationReq\x1a\x1f.observation.GetObservationResp\"\x00\x12P\n\x05Write\x12 .observation.WriteObservationReq\x1a!.observation.WriteObservationResp\"\x00(\x01\x12V\n\x0fUpdateQc0Status\x12\x1f.observation.UpdateQc0StatusReq\x1a .observation.UpdateQc0StatusResp\"\x00\x12Y\n\x10UpdateProcStatus\x12 .observation.UpdateProcStatusReq\x1a!.observation.UpdateProcStatusResp\"\x00\x42+Z)cnlab.net/csst/proto/facility/observationb\x06proto3')
   ,
   dependencies=[common_dot_error__pb2.DESCRIPTOR,])
 
 
 
 
-_EXPOSURE = _descriptor.Descriptor(
-  name='Exposure',
-  full_name='facility.Exposure',
+_OBSERVATION = _descriptor.Descriptor(
+  name='Observation',
+  full_name='observation.Observation',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='id', full_name='facility.Exposure.id', index=0,
+      name='id', full_name='observation.Observation.id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='exp_begin_time', full_name='facility.Exposure.exp_begin_time', index=1,
-      number=2, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
+      name='obs_time', full_name='observation.Observation.obs_time', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='exp_end_time', full_name='facility.Exposure.exp_end_time', index=2,
-      number=3, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
+      name='exp_time', full_name='observation.Observation.exp_time', index=2,
+      number=3, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='module_id', full_name='facility.Exposure.module_id', index=3,
+      name='module_id', full_name='observation.Observation.module_id', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='obs_type', full_name='facility.Exposure.obs_type', index=4,
+      name='obs_type', full_name='observation.Observation.obs_type', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='facility_status_id', full_name='facility.Exposure.facility_status_id', index=5,
+      name='facility_status_id', full_name='observation.Observation.facility_status_id', index=5,
       number=6, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='module_status_id', full_name='facility.Exposure.module_status_id', index=6,
+      name='module_status_id', full_name='observation.Observation.module_status_id', index=6,
       number=7, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='qc0_status', full_name='facility.Exposure.qc0_status', index=7,
+      name='qc0_status', full_name='observation.Observation.qc0_status', index=7,
       number=8, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='qc0_time', full_name='facility.Exposure.qc0_time', index=8,
-      number=9, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
+      name='qc0_time', full_name='observation.Observation.qc0_time', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='prc_status', full_name='facility.Exposure.prc_status', index=9,
+      name='prc_status', full_name='observation.Observation.prc_status', index=9,
       number=10, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='prc_time', full_name='facility.Exposure.prc_time', index=10,
-      number=11, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
+      name='prc_time', full_name='observation.Observation.prc_time', index=10,
+      number=11, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='create_time', full_name='facility.Exposure.create_time', index=11,
-      number=12, type=3, cpp_type=2, label=1,
+      name='create_time', full_name='observation.Observation.create_time', index=11,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='import_status', full_name='observation.Observation.import_status', index=12,
+      number=13, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
@@ -131,27 +138,27 @@ _EXPOSURE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=58,
-  serialized_end=314,
+  serialized_start=76,
+  serialized_end=348,
 )
 
 
-_FINDEXPOSUREREQ_OTHERCONDITIONSENTRY = _descriptor.Descriptor(
+_FINDOBSERVATIONREQ_OTHERCONDITIONSENTRY = _descriptor.Descriptor(
   name='OtherConditionsEntry',
-  full_name='facility.FindExposureReq.OtherConditionsEntry',
+  full_name='observation.FindObservationReq.OtherConditionsEntry',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='key', full_name='facility.FindExposureReq.OtherConditionsEntry.key', index=0,
+      name='key', full_name='observation.FindObservationReq.OtherConditionsEntry.key', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='value', full_name='facility.FindExposureReq.OtherConditionsEntry.value', index=1,
+      name='value', full_name='observation.FindObservationReq.OtherConditionsEntry.value', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -169,68 +176,68 @@ _FINDEXPOSUREREQ_OTHERCONDITIONSENTRY = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=552,
-  serialized_end=606,
+  serialized_start=591,
+  serialized_end=645,
 )
 
-_FINDEXPOSUREREQ = _descriptor.Descriptor(
-  name='FindExposureReq',
-  full_name='facility.FindExposureReq',
+_FINDOBSERVATIONREQ = _descriptor.Descriptor(
+  name='FindObservationReq',
+  full_name='observation.FindObservationReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='module_id', full_name='facility.FindExposureReq.module_id', index=0,
+      name='module_id', full_name='observation.FindObservationReq.module_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='obs_type', full_name='facility.FindExposureReq.obs_type', index=1,
+      name='obs_type', full_name='observation.FindObservationReq.obs_type', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='file_name', full_name='facility.FindExposureReq.file_name', index=2,
+      name='exp_time_start', full_name='observation.FindObservationReq.exp_time_start', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='exp_time_start', full_name='facility.FindExposureReq.exp_time_start', index=3,
+      name='exp_time_end', full_name='observation.FindObservationReq.exp_time_end', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='exp_time_end', full_name='facility.FindExposureReq.exp_time_end', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      name='qc0_status', full_name='observation.FindObservationReq.qc0_status', index=4,
+      number=5, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='qc0_status', full_name='facility.FindExposureReq.qc0_status', index=5,
+      name='prc_status', full_name='observation.FindObservationReq.prc_status', index=5,
       number=6, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='prc_status', full_name='facility.FindExposureReq.prc_status', index=6,
+      name='limit', full_name='observation.FindObservationReq.limit', index=6,
       number=7, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='other_conditions', full_name='facility.FindExposureReq.other_conditions', index=7,
+      name='other_conditions', full_name='observation.FindObservationReq.other_conditions', index=7,
       number=8, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -239,7 +246,7 @@ _FINDEXPOSUREREQ = _descriptor.Descriptor(
   ],
   extensions=[
   ],
-  nested_types=[_FINDEXPOSUREREQ_OTHERCONDITIONSENTRY, ],
+  nested_types=[_FINDOBSERVATIONREQ_OTHERCONDITIONSENTRY, ],
   enum_types=[
   ],
   serialized_options=None,
@@ -248,41 +255,41 @@ _FINDEXPOSUREREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=317,
-  serialized_end=606,
+  serialized_start=351,
+  serialized_end=645,
 )
 
 
-_FINDEXPOSURERESP = _descriptor.Descriptor(
-  name='FindExposureResp',
-  full_name='facility.FindExposureResp',
+_FINDOBSERVATIONRESP = _descriptor.Descriptor(
+  name='FindObservationResp',
+  full_name='observation.FindObservationResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.FindExposureResp.success', index=0,
+      name='success', full_name='observation.FindObservationResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='totalCount', full_name='facility.FindExposureResp.totalCount', index=1,
+      name='totalCount', full_name='observation.FindObservationResp.totalCount', index=1,
       number=2, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.FindExposureResp.error', index=2,
+      name='error', full_name='observation.FindObservationResp.error', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='Exposure', full_name='facility.FindExposureResp.Exposure', index=3,
+      name='records', full_name='observation.FindObservationResp.records', index=3,
       number=4, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -300,20 +307,20 @@ _FINDEXPOSURERESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=608,
-  serialized_end=731,
+  serialized_start=648,
+  serialized_end=779,
 )
 
 
-_GETEXPOSUREREQ = _descriptor.Descriptor(
-  name='GetExposureReq',
-  full_name='facility.GetExposureReq',
+_GETOBSERVATIONREQ = _descriptor.Descriptor(
+  name='GetObservationReq',
+  full_name='observation.GetObservationReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='obs_id', full_name='facility.GetExposureReq.obs_id', index=0,
+      name='obs_id', full_name='observation.GetObservationReq.obs_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -331,20 +338,20 @@ _GETEXPOSUREREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=733,
-  serialized_end=765,
+  serialized_start=781,
+  serialized_end=816,
 )
 
 
-_GETEXPOSURERESP = _descriptor.Descriptor(
-  name='GetExposureResp',
-  full_name='facility.GetExposureResp',
+_GETOBSERVATIONRESP = _descriptor.Descriptor(
+  name='GetObservationResp',
+  full_name='observation.GetObservationResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='Exposure', full_name='facility.GetExposureResp.Exposure', index=0,
+      name='observation', full_name='observation.GetObservationResp.observation', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -362,62 +369,62 @@ _GETEXPOSURERESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=767,
-  serialized_end=822,
+  serialized_start=818,
+  serialized_end=885,
 )
 
 
-_WRITEEXPOSUREREQ = _descriptor.Descriptor(
-  name='WriteExposureReq',
-  full_name='facility.WriteExposureReq',
+_WRITEOBSERVATIONREQ = _descriptor.Descriptor(
+  name='WriteObservationReq',
+  full_name='observation.WriteObservationReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='id', full_name='facility.WriteExposureReq.id', index=0,
+      name='id', full_name='observation.WriteObservationReq.id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='exp_begin_time', full_name='facility.WriteExposureReq.exp_begin_time', index=1,
+      name='exp_begin_time', full_name='observation.WriteObservationReq.exp_begin_time', index=1,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='exp_end_time', full_name='facility.WriteExposureReq.exp_end_time', index=2,
+      name='exp_end_time', full_name='observation.WriteObservationReq.exp_end_time', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='module_id', full_name='facility.WriteExposureReq.module_id', index=3,
+      name='module_id', full_name='observation.WriteObservationReq.module_id', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='obs_type', full_name='facility.WriteExposureReq.obs_type', index=4,
+      name='obs_type', full_name='observation.WriteObservationReq.obs_type', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=_b("").decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='facility_status_id', full_name='facility.WriteExposureReq.facility_status_id', index=5,
+      name='facility_status_id', full_name='observation.WriteObservationReq.facility_status_id', index=5,
       number=6, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='module_status_id', full_name='facility.WriteExposureReq.module_status_id', index=6,
+      name='module_status_id', full_name='observation.WriteObservationReq.module_status_id', index=6,
       number=7, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -435,34 +442,34 @@ _WRITEEXPOSUREREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=825,
-  serialized_end=992,
+  serialized_start=888,
+  serialized_end=1058,
 )
 
 
-_WRITEEXPOSURERESP = _descriptor.Descriptor(
-  name='WriteExposureResp',
-  full_name='facility.WriteExposureResp',
+_WRITEOBSERVATIONRESP = _descriptor.Descriptor(
+  name='WriteObservationResp',
+  full_name='observation.WriteObservationResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.WriteExposureResp.success', index=0,
+      name='success', full_name='observation.WriteObservationResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.WriteExposureResp.error', index=1,
+      name='error', full_name='observation.WriteObservationResp.error', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='exposure', full_name='facility.WriteExposureResp.exposure', index=2,
+      name='observation', full_name='observation.WriteObservationResp.observation', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -480,27 +487,27 @@ _WRITEEXPOSURERESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=994,
-  serialized_end=1098,
+  serialized_start=1060,
+  serialized_end=1176,
 )
 
 
 _UPDATEQC0STATUSREQ = _descriptor.Descriptor(
   name='UpdateQc0StatusReq',
-  full_name='facility.UpdateQc0StatusReq',
+  full_name='observation.UpdateQc0StatusReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='obs_id', full_name='facility.UpdateQc0StatusReq.obs_id', index=0,
+      name='obs_id', full_name='observation.UpdateQc0StatusReq.obs_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='status', full_name='facility.UpdateQc0StatusReq.status', index=1,
+      name='status', full_name='observation.UpdateQc0StatusReq.status', index=1,
       number=2, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -518,27 +525,27 @@ _UPDATEQC0STATUSREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1100,
-  serialized_end=1152,
+  serialized_start=1178,
+  serialized_end=1230,
 )
 
 
 _UPDATEQC0STATUSRESP = _descriptor.Descriptor(
   name='UpdateQc0StatusResp',
-  full_name='facility.UpdateQc0StatusResp',
+  full_name='observation.UpdateQc0StatusResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.UpdateQc0StatusResp.success', index=0,
+      name='success', full_name='observation.UpdateQc0StatusResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.UpdateQc0StatusResp.error', index=1,
+      name='error', full_name='observation.UpdateQc0StatusResp.error', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -556,27 +563,27 @@ _UPDATEQC0STATUSRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1154,
-  serialized_end=1222,
+  serialized_start=1232,
+  serialized_end=1300,
 )
 
 
 _UPDATEPROCSTATUSREQ = _descriptor.Descriptor(
   name='UpdateProcStatusReq',
-  full_name='facility.UpdateProcStatusReq',
+  full_name='observation.UpdateProcStatusReq',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='obs_id', full_name='facility.UpdateProcStatusReq.obs_id', index=0,
+      name='obs_id', full_name='observation.UpdateProcStatusReq.obs_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='status', full_name='facility.UpdateProcStatusReq.status', index=1,
+      name='status', full_name='observation.UpdateProcStatusReq.status', index=1,
       number=2, type=13, cpp_type=3, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -594,27 +601,27 @@ _UPDATEPROCSTATUSREQ = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1224,
-  serialized_end=1277,
+  serialized_start=1302,
+  serialized_end=1355,
 )
 
 
 _UPDATEPROCSTATUSRESP = _descriptor.Descriptor(
   name='UpdateProcStatusResp',
-  full_name='facility.UpdateProcStatusResp',
+  full_name='observation.UpdateProcStatusResp',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   fields=[
     _descriptor.FieldDescriptor(
-      name='success', full_name='facility.UpdateProcStatusResp.success', index=0,
+      name='success', full_name='observation.UpdateProcStatusResp.success', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
     _descriptor.FieldDescriptor(
-      name='error', full_name='facility.UpdateProcStatusResp.error', index=1,
+      name='error', full_name='observation.UpdateProcStatusResp.error', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -632,160 +639,160 @@ _UPDATEPROCSTATUSRESP = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1279,
-  serialized_end=1348,
+  serialized_start=1357,
+  serialized_end=1426,
 )
 
-_FINDEXPOSUREREQ_OTHERCONDITIONSENTRY.containing_type = _FINDEXPOSUREREQ
-_FINDEXPOSUREREQ.fields_by_name['other_conditions'].message_type = _FINDEXPOSUREREQ_OTHERCONDITIONSENTRY
-_FINDEXPOSURERESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
-_FINDEXPOSURERESP.fields_by_name['Exposure'].message_type = _EXPOSURE
-_GETEXPOSURERESP.fields_by_name['Exposure'].message_type = _EXPOSURE
-_WRITEEXPOSURERESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
-_WRITEEXPOSURERESP.fields_by_name['exposure'].message_type = _EXPOSURE
+_FINDOBSERVATIONREQ_OTHERCONDITIONSENTRY.containing_type = _FINDOBSERVATIONREQ
+_FINDOBSERVATIONREQ.fields_by_name['other_conditions'].message_type = _FINDOBSERVATIONREQ_OTHERCONDITIONSENTRY
+_FINDOBSERVATIONRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+_FINDOBSERVATIONRESP.fields_by_name['records'].message_type = _OBSERVATION
+_GETOBSERVATIONRESP.fields_by_name['observation'].message_type = _OBSERVATION
+_WRITEOBSERVATIONRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
+_WRITEOBSERVATIONRESP.fields_by_name['observation'].message_type = _OBSERVATION
 _UPDATEQC0STATUSRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
 _UPDATEPROCSTATUSRESP.fields_by_name['error'].message_type = common_dot_error__pb2._ERROR
-DESCRIPTOR.message_types_by_name['Exposure'] = _EXPOSURE
-DESCRIPTOR.message_types_by_name['FindExposureReq'] = _FINDEXPOSUREREQ
-DESCRIPTOR.message_types_by_name['FindExposureResp'] = _FINDEXPOSURERESP
-DESCRIPTOR.message_types_by_name['GetExposureReq'] = _GETEXPOSUREREQ
-DESCRIPTOR.message_types_by_name['GetExposureResp'] = _GETEXPOSURERESP
-DESCRIPTOR.message_types_by_name['WriteExposureReq'] = _WRITEEXPOSUREREQ
-DESCRIPTOR.message_types_by_name['WriteExposureResp'] = _WRITEEXPOSURERESP
+DESCRIPTOR.message_types_by_name['Observation'] = _OBSERVATION
+DESCRIPTOR.message_types_by_name['FindObservationReq'] = _FINDOBSERVATIONREQ
+DESCRIPTOR.message_types_by_name['FindObservationResp'] = _FINDOBSERVATIONRESP
+DESCRIPTOR.message_types_by_name['GetObservationReq'] = _GETOBSERVATIONREQ
+DESCRIPTOR.message_types_by_name['GetObservationResp'] = _GETOBSERVATIONRESP
+DESCRIPTOR.message_types_by_name['WriteObservationReq'] = _WRITEOBSERVATIONREQ
+DESCRIPTOR.message_types_by_name['WriteObservationResp'] = _WRITEOBSERVATIONRESP
 DESCRIPTOR.message_types_by_name['UpdateQc0StatusReq'] = _UPDATEQC0STATUSREQ
 DESCRIPTOR.message_types_by_name['UpdateQc0StatusResp'] = _UPDATEQC0STATUSRESP
 DESCRIPTOR.message_types_by_name['UpdateProcStatusReq'] = _UPDATEPROCSTATUSREQ
 DESCRIPTOR.message_types_by_name['UpdateProcStatusResp'] = _UPDATEPROCSTATUSRESP
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Exposure = _reflection.GeneratedProtocolMessageType('Exposure', (_message.Message,), {
-  'DESCRIPTOR' : _EXPOSURE,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.Exposure)
+Observation = _reflection.GeneratedProtocolMessageType('Observation', (_message.Message,), {
+  'DESCRIPTOR' : _OBSERVATION,
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.Observation)
   })
-_sym_db.RegisterMessage(Exposure)
+_sym_db.RegisterMessage(Observation)
 
-FindExposureReq = _reflection.GeneratedProtocolMessageType('FindExposureReq', (_message.Message,), {
+FindObservationReq = _reflection.GeneratedProtocolMessageType('FindObservationReq', (_message.Message,), {
 
   'OtherConditionsEntry' : _reflection.GeneratedProtocolMessageType('OtherConditionsEntry', (_message.Message,), {
-    'DESCRIPTOR' : _FINDEXPOSUREREQ_OTHERCONDITIONSENTRY,
-    '__module__' : 'facility.exposure_pb2'
-    # @@protoc_insertion_point(class_scope:facility.FindExposureReq.OtherConditionsEntry)
+    'DESCRIPTOR' : _FINDOBSERVATIONREQ_OTHERCONDITIONSENTRY,
+    '__module__' : 'facility.observation.observation_pb2'
+    # @@protoc_insertion_point(class_scope:observation.FindObservationReq.OtherConditionsEntry)
     })
   ,
-  'DESCRIPTOR' : _FINDEXPOSUREREQ,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.FindExposureReq)
+  'DESCRIPTOR' : _FINDOBSERVATIONREQ,
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.FindObservationReq)
   })
-_sym_db.RegisterMessage(FindExposureReq)
-_sym_db.RegisterMessage(FindExposureReq.OtherConditionsEntry)
+_sym_db.RegisterMessage(FindObservationReq)
+_sym_db.RegisterMessage(FindObservationReq.OtherConditionsEntry)
 
-FindExposureResp = _reflection.GeneratedProtocolMessageType('FindExposureResp', (_message.Message,), {
-  'DESCRIPTOR' : _FINDEXPOSURERESP,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.FindExposureResp)
+FindObservationResp = _reflection.GeneratedProtocolMessageType('FindObservationResp', (_message.Message,), {
+  'DESCRIPTOR' : _FINDOBSERVATIONRESP,
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.FindObservationResp)
   })
-_sym_db.RegisterMessage(FindExposureResp)
+_sym_db.RegisterMessage(FindObservationResp)
 
-GetExposureReq = _reflection.GeneratedProtocolMessageType('GetExposureReq', (_message.Message,), {
-  'DESCRIPTOR' : _GETEXPOSUREREQ,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.GetExposureReq)
+GetObservationReq = _reflection.GeneratedProtocolMessageType('GetObservationReq', (_message.Message,), {
+  'DESCRIPTOR' : _GETOBSERVATIONREQ,
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.GetObservationReq)
   })
-_sym_db.RegisterMessage(GetExposureReq)
+_sym_db.RegisterMessage(GetObservationReq)
 
-GetExposureResp = _reflection.GeneratedProtocolMessageType('GetExposureResp', (_message.Message,), {
-  'DESCRIPTOR' : _GETEXPOSURERESP,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.GetExposureResp)
+GetObservationResp = _reflection.GeneratedProtocolMessageType('GetObservationResp', (_message.Message,), {
+  'DESCRIPTOR' : _GETOBSERVATIONRESP,
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.GetObservationResp)
   })
-_sym_db.RegisterMessage(GetExposureResp)
+_sym_db.RegisterMessage(GetObservationResp)
 
-WriteExposureReq = _reflection.GeneratedProtocolMessageType('WriteExposureReq', (_message.Message,), {
-  'DESCRIPTOR' : _WRITEEXPOSUREREQ,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.WriteExposureReq)
+WriteObservationReq = _reflection.GeneratedProtocolMessageType('WriteObservationReq', (_message.Message,), {
+  'DESCRIPTOR' : _WRITEOBSERVATIONREQ,
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.WriteObservationReq)
   })
-_sym_db.RegisterMessage(WriteExposureReq)
+_sym_db.RegisterMessage(WriteObservationReq)
 
-WriteExposureResp = _reflection.GeneratedProtocolMessageType('WriteExposureResp', (_message.Message,), {
-  'DESCRIPTOR' : _WRITEEXPOSURERESP,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.WriteExposureResp)
+WriteObservationResp = _reflection.GeneratedProtocolMessageType('WriteObservationResp', (_message.Message,), {
+  'DESCRIPTOR' : _WRITEOBSERVATIONRESP,
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.WriteObservationResp)
   })
-_sym_db.RegisterMessage(WriteExposureResp)
+_sym_db.RegisterMessage(WriteObservationResp)
 
 UpdateQc0StatusReq = _reflection.GeneratedProtocolMessageType('UpdateQc0StatusReq', (_message.Message,), {
   'DESCRIPTOR' : _UPDATEQC0STATUSREQ,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.UpdateQc0StatusReq)
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.UpdateQc0StatusReq)
   })
 _sym_db.RegisterMessage(UpdateQc0StatusReq)
 
 UpdateQc0StatusResp = _reflection.GeneratedProtocolMessageType('UpdateQc0StatusResp', (_message.Message,), {
   'DESCRIPTOR' : _UPDATEQC0STATUSRESP,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.UpdateQc0StatusResp)
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.UpdateQc0StatusResp)
   })
 _sym_db.RegisterMessage(UpdateQc0StatusResp)
 
 UpdateProcStatusReq = _reflection.GeneratedProtocolMessageType('UpdateProcStatusReq', (_message.Message,), {
   'DESCRIPTOR' : _UPDATEPROCSTATUSREQ,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.UpdateProcStatusReq)
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.UpdateProcStatusReq)
   })
 _sym_db.RegisterMessage(UpdateProcStatusReq)
 
 UpdateProcStatusResp = _reflection.GeneratedProtocolMessageType('UpdateProcStatusResp', (_message.Message,), {
   'DESCRIPTOR' : _UPDATEPROCSTATUSRESP,
-  '__module__' : 'facility.exposure_pb2'
-  # @@protoc_insertion_point(class_scope:facility.UpdateProcStatusResp)
+  '__module__' : 'facility.observation.observation_pb2'
+  # @@protoc_insertion_point(class_scope:observation.UpdateProcStatusResp)
   })
 _sym_db.RegisterMessage(UpdateProcStatusResp)
 
 
 DESCRIPTOR._options = None
-_FINDEXPOSUREREQ_OTHERCONDITIONSENTRY._options = None
+_FINDOBSERVATIONREQ_OTHERCONDITIONSENTRY._options = None
 
-_EXPOSURESRV = _descriptor.ServiceDescriptor(
-  name='ExposureSrv',
-  full_name='facility.ExposureSrv',
+_OBSERVATIONSRV = _descriptor.ServiceDescriptor(
+  name='ObservationSrv',
+  full_name='observation.ObservationSrv',
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=1351,
-  serialized_end=1728,
+  serialized_start=1429,
+  serialized_end=1857,
   methods=[
   _descriptor.MethodDescriptor(
     name='Find',
-    full_name='facility.ExposureSrv.Find',
+    full_name='observation.ObservationSrv.Find',
     index=0,
     containing_service=None,
-    input_type=_FINDEXPOSUREREQ,
-    output_type=_FINDEXPOSURERESP,
+    input_type=_FINDOBSERVATIONREQ,
+    output_type=_FINDOBSERVATIONRESP,
     serialized_options=None,
   ),
   _descriptor.MethodDescriptor(
     name='Get',
-    full_name='facility.ExposureSrv.Get',
+    full_name='observation.ObservationSrv.Get',
     index=1,
     containing_service=None,
-    input_type=_GETEXPOSUREREQ,
-    output_type=_GETEXPOSURERESP,
+    input_type=_GETOBSERVATIONREQ,
+    output_type=_GETOBSERVATIONRESP,
     serialized_options=None,
   ),
   _descriptor.MethodDescriptor(
     name='Write',
-    full_name='facility.ExposureSrv.Write',
+    full_name='observation.ObservationSrv.Write',
     index=2,
     containing_service=None,
-    input_type=_WRITEEXPOSUREREQ,
-    output_type=_WRITEEXPOSURERESP,
+    input_type=_WRITEOBSERVATIONREQ,
+    output_type=_WRITEOBSERVATIONRESP,
     serialized_options=None,
   ),
   _descriptor.MethodDescriptor(
     name='UpdateQc0Status',
-    full_name='facility.ExposureSrv.UpdateQc0Status',
+    full_name='observation.ObservationSrv.UpdateQc0Status',
     index=3,
     containing_service=None,
     input_type=_UPDATEQC0STATUSREQ,
@@ -794,7 +801,7 @@ _EXPOSURESRV = _descriptor.ServiceDescriptor(
   ),
   _descriptor.MethodDescriptor(
     name='UpdateProcStatus',
-    full_name='facility.ExposureSrv.UpdateProcStatus',
+    full_name='observation.ObservationSrv.UpdateProcStatus',
     index=4,
     containing_service=None,
     input_type=_UPDATEPROCSTATUSREQ,
@@ -802,8 +809,8 @@ _EXPOSURESRV = _descriptor.ServiceDescriptor(
     serialized_options=None,
   ),
 ])
-_sym_db.RegisterServiceDescriptor(_EXPOSURESRV)
+_sym_db.RegisterServiceDescriptor(_OBSERVATIONSRV)
 
-DESCRIPTOR.services_by_name['ExposureSrv'] = _EXPOSURESRV
+DESCRIPTOR.services_by_name['ObservationSrv'] = _OBSERVATIONSRV
 
 # @@protoc_insertion_point(module_scope)
diff --git a/csst_dfs_proto/facility/observation/observation_pb2_grpc.py b/csst_dfs_proto/facility/observation/observation_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..83dc4718890459f7bfea4caa6e8f97868d5c3e76
--- /dev/null
+++ b/csst_dfs_proto/facility/observation/observation_pb2_grpc.py
@@ -0,0 +1,114 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+
+from . import observation_pb2 as facility_dot_observation_dot_observation__pb2
+
+
+class ObservationSrvStub(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.Find = channel.unary_unary(
+        '/observation.ObservationSrv/Find',
+        request_serializer=facility_dot_observation_dot_observation__pb2.FindObservationReq.SerializeToString,
+        response_deserializer=facility_dot_observation_dot_observation__pb2.FindObservationResp.FromString,
+        )
+    self.Get = channel.unary_unary(
+        '/observation.ObservationSrv/Get',
+        request_serializer=facility_dot_observation_dot_observation__pb2.GetObservationReq.SerializeToString,
+        response_deserializer=facility_dot_observation_dot_observation__pb2.GetObservationResp.FromString,
+        )
+    self.Write = channel.stream_unary(
+        '/observation.ObservationSrv/Write',
+        request_serializer=facility_dot_observation_dot_observation__pb2.WriteObservationReq.SerializeToString,
+        response_deserializer=facility_dot_observation_dot_observation__pb2.WriteObservationResp.FromString,
+        )
+    self.UpdateQc0Status = channel.unary_unary(
+        '/observation.ObservationSrv/UpdateQc0Status',
+        request_serializer=facility_dot_observation_dot_observation__pb2.UpdateQc0StatusReq.SerializeToString,
+        response_deserializer=facility_dot_observation_dot_observation__pb2.UpdateQc0StatusResp.FromString,
+        )
+    self.UpdateProcStatus = channel.unary_unary(
+        '/observation.ObservationSrv/UpdateProcStatus',
+        request_serializer=facility_dot_observation_dot_observation__pb2.UpdateProcStatusReq.SerializeToString,
+        response_deserializer=facility_dot_observation_dot_observation__pb2.UpdateProcStatusResp.FromString,
+        )
+
+
+class ObservationSrvServicer(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def Find(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Get(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def Write(self, request_iterator, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def UpdateQc0Status(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+  def UpdateProcStatus(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_ObservationSrvServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'Find': grpc.unary_unary_rpc_method_handler(
+          servicer.Find,
+          request_deserializer=facility_dot_observation_dot_observation__pb2.FindObservationReq.FromString,
+          response_serializer=facility_dot_observation_dot_observation__pb2.FindObservationResp.SerializeToString,
+      ),
+      'Get': grpc.unary_unary_rpc_method_handler(
+          servicer.Get,
+          request_deserializer=facility_dot_observation_dot_observation__pb2.GetObservationReq.FromString,
+          response_serializer=facility_dot_observation_dot_observation__pb2.GetObservationResp.SerializeToString,
+      ),
+      'Write': grpc.stream_unary_rpc_method_handler(
+          servicer.Write,
+          request_deserializer=facility_dot_observation_dot_observation__pb2.WriteObservationReq.FromString,
+          response_serializer=facility_dot_observation_dot_observation__pb2.WriteObservationResp.SerializeToString,
+      ),
+      'UpdateQc0Status': grpc.unary_unary_rpc_method_handler(
+          servicer.UpdateQc0Status,
+          request_deserializer=facility_dot_observation_dot_observation__pb2.UpdateQc0StatusReq.FromString,
+          response_serializer=facility_dot_observation_dot_observation__pb2.UpdateQc0StatusResp.SerializeToString,
+      ),
+      'UpdateProcStatus': grpc.unary_unary_rpc_method_handler(
+          servicer.UpdateProcStatus,
+          request_deserializer=facility_dot_observation_dot_observation__pb2.UpdateProcStatusReq.FromString,
+          response_serializer=facility_dot_observation_dot_observation__pb2.UpdateProcStatusResp.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'observation.ObservationSrv', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/csst_dfs_proto/hstdm/__init__.py b/csst_dfs_proto/hstdm/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/csst_dfs_proto/mci/__init__.py b/csst_dfs_proto/mci/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/csst_dfs_proto/msc/__init__.py b/csst_dfs_proto/msc/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391