Index: frontend/src/pages/doctors/DoctorDetail.js
===================================================================
--- frontend/src/pages/doctors/DoctorDetail.js	(revision 20468d38749c5a3ed89d6df4db22905a1d0c3df1)
+++ frontend/src/pages/doctors/DoctorDetail.js	(revision 20468d38749c5a3ed89d6df4db22905a1d0c3df1)
@@ -0,0 +1,108 @@
+import React, { useState, useEffect } from 'react';
+import { useParams, Link, useNavigate } from 'react-router-dom';
+import { doctorService } from '../../services/doctorService';
+import Loading from '../../components/Loading';
+import ErrorAlert from '../../components/ErrorAlert';
+
+function DoctorDetail() {
+  const formatDepartmentName = (name) => {
+    if (!name) return 'N/A';
+    return name.replace(/_DEPT$/, '').replace(/_/g, ' ').split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(' ');
+  };
+
+  const { id } = useParams();
+  const navigate = useNavigate();
+  const user = JSON.parse(localStorage.getItem('user') || '{}');
+  const isPatient = user.role === 'PATIENT';
+  const isAdmin = user.role === 'ADMIN';
+  const isLabTechnician = user.role === 'LAB_TECHNICIAN';
+  const isBillingAdmin = user.role === 'BILLING_ADMIN';
+
+  const [doctor, setDoctor] = useState(null);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState(null);
+
+  useEffect(() => {
+    fetchDoctor();
+  }, [id]);
+
+  const fetchDoctor = async () => {
+    try {
+      setLoading(true);
+      const response = await doctorService.getDoctorById(id);
+      setDoctor(response.data);
+    } catch (err) {
+      setError('Failed to fetch doctor details');
+      console.error(err);
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  if (loading) return <Loading />;
+
+  if (!doctor) {
+    return (
+      <div>
+        <ErrorAlert message="Doctor not found" onClose={() => navigate('/doctors')} />
+      </div>
+    );
+  }
+
+  return (
+    <div>
+      <div className="flex justify-between items-center mb-6">
+        <h1 className="text-3xl font-bold" style={{ color: '#7c3aed' }}>Dr. {doctor.firstName} {doctor.lastName}</h1>
+        <div className="space-x-2">
+          {isAdmin && (
+            <Link to={`/doctors/${id}/edit`} className="bg-purple-600 text-white px-4 py-2 rounded hover:bg-purple-700">
+              Edit
+            </Link>
+          )}
+          <button onClick={() => navigate('/doctors')} className="bg-gray-300 text-gray-700 px-4 py-2 rounded hover:bg-gray-400">
+            Back
+          </button>
+        </div>
+      </div>
+
+      {error && <ErrorAlert message={error} onClose={() => setError(null)} />}
+
+      <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
+        <div className="bg-white rounded-lg shadow p-6">
+          <h2 className="text-xl font-bold mb-4">Professional Information</h2>
+          <div className="space-y-3">
+            <InfoRow label="Email" value={doctor.emailAddress} />
+            <InfoRow label="Specialization" value={doctor.specialization?.specializationName} />
+            <InfoRow label="Level" value={doctor.level?.level} />
+            <InfoRow label="Department" value={formatDepartmentName(doctor.department?.departmentName)} />
+          </div>
+        </div>
+
+        {!isPatient && !isLabTechnician && !isBillingAdmin && (
+          <div className="bg-white rounded-lg shadow p-6">
+            <h2 className="text-xl font-bold mb-4">Quick Links</h2>
+            <div className="space-y-2">
+              <Link to={`/appointments?doctorId=${id}`} className="block p-3 bg-blue-50 hover:bg-purple-100 rounded text-purple-600">
+                View My Appointments
+              </Link>
+              <Link to="/patients" className="block p-3 bg-green-50 hover:bg-green-100 rounded text-green-600">
+                View Patients
+              </Link>
+            </div>
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+
+function InfoRow({ label, value }) {
+  return (
+    <div className="flex justify-between">
+      <span className="text-gray-800">{label}:</span>
+      <span className="text-gray-800">{value || 'N/A'}</span>
+    </div>
+  );
+}
+
+export default DoctorDetail;
Index: frontend/src/pages/doctors/DoctorForm.js
===================================================================
--- frontend/src/pages/doctors/DoctorForm.js	(revision 20468d38749c5a3ed89d6df4db22905a1d0c3df1)
+++ frontend/src/pages/doctors/DoctorForm.js	(revision 20468d38749c5a3ed89d6df4db22905a1d0c3df1)
@@ -0,0 +1,184 @@
+import React, { useState, useEffect } from 'react';
+import { useNavigate, useParams } from 'react-router-dom';
+import { doctorService } from '../../services/doctorService';
+import ErrorAlert from '../../components/ErrorAlert';
+import SuccessAlert from '../../components/SuccessAlert';
+
+function DoctorForm() {
+  const { id } = useParams();
+  const navigate = useNavigate();
+  const [formData, setFormData] = useState({
+    firstName: '',
+    lastName: '',
+    emailAddress: '',
+    levelId: '',
+    specializationId: '',
+    departmentId: '',
+  });
+  const [error, setError] = useState(null);
+  const [success, setSuccess] = useState(null);
+  const [loading, setLoading] = useState(false);
+
+  useEffect(() => {
+    if (id) {
+      fetchDoctor();
+    }
+  }, [id]);
+
+  const fetchDoctor = async () => {
+    try {
+      setLoading(true);
+      const response = await doctorService.getDoctorById(id);
+      setFormData({
+        firstName: response.data.firstName,
+        lastName: response.data.lastName,
+        emailAddress: response.data.emailAddress,
+        levelId: response.data.level?.levelId || '',
+        specializationId: response.data.specialization?.specializationId || '',
+        departmentId: response.data.department?.departmentId || '',
+      });
+    } catch (err) {
+      setError('Failed to fetch doctor');
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  const handleChange = (e) => {
+    const { name, value } = e.target;
+    setFormData(prev => ({
+      ...prev,
+      [name]: value
+    }));
+  };
+
+  const handleSubmit = async (e) => {
+    e.preventDefault();
+
+    if (!formData.firstName || !formData.lastName || !formData.emailAddress) {
+      setError('Please fill in all required fields');
+      return;
+    }
+
+    try {
+      setLoading(true);
+      if (id) {
+        await doctorService.updateDoctor(id, formData);
+        setSuccess('Doctor updated successfully!');
+      } else {
+        await doctorService.createDoctor(formData);
+        setSuccess('Doctor created successfully!');
+      }
+      setTimeout(() => navigate('/doctors'), 1500);
+    } catch (err) {
+      setError(err.response?.data?.error || 'Failed to save doctor');
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  return (
+    <div className="max-w-2xl mx-auto">
+      <h1 className="text-3xl font-bold mb-6">
+        {id ? 'Edit Doctor' : 'Add New Doctor'}
+      </h1>
+
+      {error && <ErrorAlert message={error} onClose={() => setError(null)} />}
+      {success && <SuccessAlert message={success} onClose={() => setSuccess(null)} />}
+
+      <form onSubmit={handleSubmit} className="bg-white rounded-lg shadow p-6 space-y-4">
+        <div className="grid grid-cols-2 gap-4">
+          <div>
+            <label className="block text-sm font-semibold mb-2">First Name *</label>
+            <input
+              type="text"
+              name="firstName"
+              value={formData.firstName}
+              onChange={handleChange}
+              className="w-full px-4 py-2 border rounded-lg"
+              required
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-semibold mb-2">Last Name *</label>
+            <input
+              type="text"
+              name="lastName"
+              value={formData.lastName}
+              onChange={handleChange}
+              className="w-full px-4 py-2 border rounded-lg"
+              required
+            />
+          </div>
+        </div>
+
+        <div>
+          <label className="block text-sm font-semibold mb-2">Email *</label>
+          <input
+            type="email"
+            name="emailAddress"
+            value={formData.emailAddress}
+            onChange={handleChange}
+            className="w-full px-4 py-2 border rounded-lg"
+            required
+          />
+        </div>
+
+        <div className="grid grid-cols-3 gap-4">
+          <div>
+            <label className="block text-sm font-semibold mb-2">Level</label>
+            <input
+              type="number"
+              name="levelId"
+              value={formData.levelId}
+              onChange={handleChange}
+              placeholder="Level ID"
+              className="w-full px-4 py-2 border rounded-lg"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-semibold mb-2">Specialization</label>
+            <input
+              type="number"
+              name="specializationId"
+              value={formData.specializationId}
+              onChange={handleChange}
+              placeholder="Spec. ID"
+              className="w-full px-4 py-2 border rounded-lg"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-semibold mb-2">Department</label>
+            <input
+              type="number"
+              name="departmentId"
+              value={formData.departmentId}
+              onChange={handleChange}
+              placeholder="Dept. ID"
+              className="w-full px-4 py-2 border rounded-lg"
+            />
+          </div>
+        </div>
+
+        <div className="flex gap-4 pt-4">
+          <button
+            type="submit"
+            disabled={loading}
+            className="bg-purple-600 text-white px-6 py-2 rounded hover:bg-purple-700 disabled:opacity-50"
+          >
+            {loading ? 'Saving...' : 'Save Doctor'}
+          </button>
+          <button
+            type="button"
+            onClick={() => navigate('/doctors')}
+            className="bg-gray-300 text-gray-700 px-6 py-2 rounded hover:bg-gray-400"
+          >
+            Cancel
+          </button>
+        </div>
+      </form>
+    </div>
+  );
+}
+
+export default DoctorForm;
Index: frontend/src/pages/doctors/DoctorList.js
===================================================================
--- frontend/src/pages/doctors/DoctorList.js	(revision 20468d38749c5a3ed89d6df4db22905a1d0c3df1)
+++ frontend/src/pages/doctors/DoctorList.js	(revision 20468d38749c5a3ed89d6df4db22905a1d0c3df1)
@@ -0,0 +1,106 @@
+import React, { useState, useEffect } from 'react';
+import { Link } from 'react-router-dom';
+import { doctorService } from '../../services/doctorService';
+import Loading from '../../components/Loading';
+import ErrorAlert from '../../components/ErrorAlert';
+
+function DoctorList() {
+  const user = JSON.parse(localStorage.getItem('user') || '{}');
+  const isAdmin = user.role === 'ADMIN';
+  const [doctors, setDoctors] = useState([]);
+  const [loading, setLoading] = useState(true);
+  const [error, setError] = useState(null);
+  const [searchTerm, setSearchTerm] = useState('');
+
+  useEffect(() => {
+    fetchDoctors();
+  }, []);
+
+  const fetchDoctors = async () => {
+    try {
+      setLoading(true);
+      const response = await doctorService.getAllDoctors();
+      setDoctors(response.data);
+    } catch (err) {
+      setError('Failed to fetch doctors');
+      console.error(err);
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  const filteredDoctors = doctors.filter(doctor =>
+    doctor.firstName.toLowerCase().includes(searchTerm.toLowerCase()) ||
+    doctor.lastName.toLowerCase().includes(searchTerm.toLowerCase()) ||
+    doctor.emailAddress.includes(searchTerm)
+  );
+
+  if (loading) return <Loading />;
+
+  return (
+    <div>
+      <div className="flex justify-between items-center mb-6">
+        <h1 className="text-3xl font-bold" style={{ color: '#7c3aed' }}>Doctors</h1>
+        {isAdmin && (
+          <Link to="/doctors/new" style={{
+            display: 'inline-block',
+            background: '#bfdbfe',
+            color: '#1e1035',
+            padding: '8px 16px',
+            borderRadius: '6px',
+            textDecoration: 'none',
+            fontSize: '14px',
+            fontWeight: '400'
+          }} onMouseEnter={(e) => e.currentTarget.style.background = '#93c5fd'} onMouseLeave={(e) => e.currentTarget.style.background = '#bfdbfe'}>
+            Add Doctor
+          </Link>
+        )}
+      </div>
+
+      {error && <ErrorAlert message={error} onClose={() => setError(null)} />}
+
+      <div className="mb-6">
+        <input
+          type="text"
+          placeholder="Search by name or email..."
+          className="w-full px-4 py-2 border rounded-lg"
+          value={searchTerm}
+          onChange={(e) => setSearchTerm(e.target.value)}
+        />
+      </div>
+
+      <div className="bg-white rounded-lg shadow overflow-hidden">
+        <table className="w-full">
+          <thead className="bg-gray-100">
+            <tr>
+              <th className="px-6 py-3 text-left text-sm font-semibold">Name</th>
+              <th className="px-6 py-3 text-left text-sm font-semibold">Email</th>
+              <th className="px-6 py-3 text-left text-sm font-semibold">Specialization</th>
+              <th className="px-6 py-3 text-left text-sm font-semibold">Level</th>
+              <th className="px-6 py-3 text-left text-sm font-semibold">Department</th>
+              <th className="px-6 py-3 text-left text-sm font-semibold">Actions</th>
+            </tr>
+          </thead>
+          <tbody>
+            {filteredDoctors.map(doctor => (
+              <tr key={doctor.doctorId} className="border-t hover:bg-gray-50">
+                <td className="px-6 py-3">{doctor.firstName} {doctor.lastName}</td>
+                <td className="px-6 py-3">{doctor.emailAddress}</td>
+                <td className="px-6 py-3">{doctor.specialization?.specializationName || 'N/A'}</td>
+                <td className="px-6 py-3">{doctor.level?.level || 'N/A'}</td>
+                <td className="px-6 py-3">{doctor.department?.departmentName ? doctor.department.departmentName.replace(/_DEPT$/, '').replace(/_/g, ' ').split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(' ') : 'N/A'}</td>
+                <td className="px-6 py-3">
+                  <Link to={`/doctors/${doctor.doctorId}`} style={{ color: '#7c3aed', textDecoration: 'none', fontWeight: '400' }} onMouseEnter={(e) => e.currentTarget.style.textDecoration = 'underline'} onMouseLeave={(e) => e.currentTarget.style.textDecoration = 'none'}>
+                    View
+                  </Link>
+                </td>
+              </tr>
+            ))}
+          </tbody>
+        </table>
+      </div>
+    </div>
+  );
+}
+
+export default DoctorList;
