Index: kupi-mk/backend/routes/cart.js
===================================================================
--- kupi-mk/backend/routes/cart.js	(revision a50634e742db5be5422ca0b5c8ddead0ccf398f8)
+++ kupi-mk/backend/routes/cart.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -7,5 +7,5 @@
 router.get('/', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         
         const result = await pool.query(`
@@ -43,5 +43,5 @@
 router.post('/add', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         const { productId, quantity = 1 } = req.body;
         
@@ -122,5 +122,5 @@
 router.put('/update/:id', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         const cartItemId = req.params.id;
         const { quantity } = req.body;
@@ -168,5 +168,5 @@
 router.delete('/remove/:id', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         const cartItemId = req.params.id;
         
@@ -194,8 +194,8 @@
 router.delete('/clear', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         
         const result = await pool.query(
-            'DELETE FROM cart_items WHERE user_id = $1 RETURNING COUNT(*)',
+            'DELETE FROM cart_items WHERE user_id = $1',
             [userId]
         );
@@ -203,5 +203,6 @@
         res.json({
             success: true,
-            message: 'Cart cleared successfully'
+            message: 'Cart cleared successfully',
+            deletedCount: result.rowCount
         });
     } catch (error) {
@@ -214,5 +215,5 @@
 router.get('/summary', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         
         const result = await pool.query(`
Index: kupi-mk/backend/routes/orders.js
===================================================================
--- kupi-mk/backend/routes/orders.js	(revision a50634e742db5be5422ca0b5c8ddead0ccf398f8)
+++ kupi-mk/backend/routes/orders.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -4,4 +4,11 @@
 const { auth } = require('../middleware/auth');
 
+// =============================
+// Orders Routes
+// - Contains endpoints for creating orders, fetching history, and seller/admin views
+// - Important files: orders table, order_items table, products table, users table
+// - Authenticated routes use the `auth` middleware to attach `req.user.userId`
+// =============================
+
 // Create new order from cart (checkout)
 router.post('/checkout', auth, async (req, res) => {
@@ -11,5 +18,5 @@
         await client.query('BEGIN');
         
-        const userId = req.user.id;
+        const userId = req.user.userId;
         const { 
             shippingAddress, 
@@ -119,10 +126,11 @@
 router.get('/history', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         const page = parseInt(req.query.page) || 1;
         const limit = parseInt(req.query.limit) || 10;
         const offset = (page - 1) * limit;
         
-        const result = await pool.query(`
+        // Get orders with basic info
+        const ordersResult = await pool.query(`
             SELECT 
                 o.*,
@@ -136,4 +144,25 @@
         `, [userId, limit, offset]);
         
+        // Get order items for each order
+        const ordersWithItems = await Promise.all(
+            ordersResult.rows.map(async (order) => {
+                const itemsResult = await pool.query(`
+                    SELECT 
+                        oi.*,
+                        p.title as product_title,
+                        p.images as product_images
+                    FROM order_items oi
+                    JOIN products p ON oi.product_id = p.id
+                    WHERE oi.order_id = $1
+                    ORDER BY oi.created_at
+                `, [order.id]);
+                
+                return {
+                    ...order,
+                    items: itemsResult.rows
+                };
+            })
+        );
+        
         // Get total count for pagination
         const countResult = await pool.query(
@@ -144,5 +173,5 @@
         res.json({
             success: true,
-            orders: result.rows,
+            orders: ordersWithItems,
             pagination: {
                 page,
@@ -161,5 +190,5 @@
 router.get('/:orderId', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         const orderId = req.params.orderId;
         
@@ -217,13 +246,14 @@
         }
         
-        // For now, only allow users to cancel their own pending orders
+        // For now, allow users to manage their own orders for testing
         // Later we can add role-based permissions for sellers/admins
-        const userId = req.user.id;
+        const userId = req.user.userId;
         
         if (status === 'cancelled') {
+            // Only allow cancelling pending or confirmed orders
             const result = await pool.query(`
                 UPDATE orders 
                 SET status = $1, updated_at = CURRENT_TIMESTAMP 
-                WHERE id = $2 AND user_id = $3 AND status = 'pending'
+                WHERE id = $2 AND user_id = $3 AND status IN ('pending', 'confirmed')
                 RETURNING *
             `, [status, orderId, userId]);
@@ -250,7 +280,23 @@
             });
         } else {
-            res.status(403).json({ 
-                success: false, 
-                message: 'Unauthorized to update order status' 
+            // Allow status progression for testing (normally this would be seller/admin only)
+            const result = await pool.query(`
+                UPDATE orders 
+                SET status = $1, updated_at = CURRENT_TIMESTAMP 
+                WHERE id = $2 AND user_id = $3
+                RETURNING *
+            `, [status, orderId, userId]);
+            
+            if (result.rows.length === 0) {
+                return res.status(404).json({ 
+                    success: false, 
+                    message: 'Order not found' 
+                });
+            }
+            
+            res.json({
+                success: true,
+                message: `Order status updated to ${status}`,
+                order: result.rows[0]
             });
         }
@@ -264,5 +310,5 @@
 router.get('/stats/summary', auth, async (req, res) => {
     try {
-        const userId = req.user.id;
+        const userId = req.user.userId;
         
         const result = await pool.query(`
@@ -287,3 +333,160 @@
 });
 
+// Admin/Seller endpoints
+// Get all orders (for seller dashboard) - only orders containing seller's products
+router.get('/admin/all', auth, async (req, res) => {
+    try {
+        const sellerId = req.user.userId;
+        
+        // First get the basic order information
+        // - We select orders that contain at least one product from this seller (`p.seller_id = $1`).
+        // - We aggregate product titles and the item count for quick overview in the dashboard.
+        // - Note: we avoid aggregating JSON blobs here to keep GROUP BY safe and portable across Postgres versions.
+        const ordersResult = await pool.query(`
+            SELECT DISTINCT
+                o.id,
+                o.user_id,
+                o.total_amount,
+                o.status,
+                o.shipping_address,
+                o.billing_address,
+                o.phone,
+                o.payment_method,
+                o.notes,
+                o.created_at,
+                o.updated_at,
+                u.first_name,
+                u.last_name,
+                u.email,
+                COUNT(oi.id) as item_count,
+                STRING_AGG(p.title, ', ') as product_titles
+            FROM orders o
+            INNER JOIN order_items oi ON o.id = oi.order_id
+            INNER JOIN products p ON oi.product_id = p.id
+            INNER JOIN users u ON o.user_id = u.id
+            WHERE p.seller_id = $1
+            GROUP BY o.id, o.user_id, o.total_amount, o.status, o.shipping_address, 
+                     o.billing_address, o.phone, o.payment_method, o.notes, 
+                     o.created_at, o.updated_at, u.first_name, u.last_name, u.email
+            ORDER BY o.created_at DESC
+        `, [sellerId]);
+        
+        // Then get order items for each order
+        // - We query order_items separately to fetch item-level details and a single image per product
+        // - This avoids grouping JSON columns and gives us full control over returned fields
+        const orders = [];
+        for (const order of ordersResult.rows) {
+            const itemsResult = await pool.query(`
+                SELECT 
+                    oi.id,
+                    oi.product_id,
+                    p.title as product_title,
+                    oi.quantity,
+                    oi.price_at_time,
+                    CASE WHEN p.images IS NOT NULL AND array_length(p.images, 1) > 0 THEN p.images[1] ELSE NULL END as image_url
+                FROM order_items oi
+                INNER JOIN products p ON oi.product_id = p.id
+                WHERE oi.order_id = $1 AND p.seller_id = $2
+            `, [order.id, sellerId]);
+            
+            // Combine base order row with its items
+            orders.push({
+                ...order,
+                order_items: itemsResult.rows
+            });
+        }
+        
+        res.json({
+            success: true,
+            orders: orders
+        });
+    } catch (error) {
+        console.error('Error fetching all orders:', error);
+        res.status(500).json({ success: false, message: 'Server error' });
+    }
+});
+
+// Update order status (for seller dashboard)
+router.put('/admin/:orderId/status', auth, async (req, res) => {
+    const client = await pool.connect();
+    
+    try {
+        await client.query('BEGIN');
+        
+        const { orderId } = req.params;
+        const { status } = req.body;
+        
+        if (!status) {
+            return res.status(400).json({ 
+                success: false, 
+                message: 'Status is required' 
+            });
+        }
+        
+        // Validate status
+        const validStatuses = ['pending', 'confirmed', 'processing', 'shipped', 'delivered', 'cancelled'];
+        if (!validStatuses.includes(status)) {
+            return res.status(400).json({ 
+                success: false, 
+                message: 'Invalid status value' 
+            });
+        }
+        
+        // Get current order
+        const orderResult = await client.query(
+            'SELECT id, status, user_id FROM orders WHERE id = $1',
+            [orderId]
+        );
+        
+        if (orderResult.rows.length === 0) {
+            await client.query('ROLLBACK');
+            return res.status(404).json({ 
+                success: false, 
+                message: 'Order not found' 
+            });
+        }
+        
+        const currentOrder = orderResult.rows[0];
+        
+        // If cancelling order, restore stock
+        if (status === 'cancelled' && currentOrder.status !== 'cancelled') {
+            const orderItemsResult = await client.query(`
+                SELECT oi.product_id, oi.quantity
+                FROM order_items oi
+                WHERE oi.order_id = $1
+            `, [orderId]);
+            
+            for (const item of orderItemsResult.rows) {
+                await client.query(`
+                    UPDATE products 
+                    SET stock_quantity = stock_quantity + $1
+                    WHERE id = $2
+                `, [item.quantity, item.product_id]);
+            }
+        }
+        
+        // Update order status
+        await client.query(
+            'UPDATE orders SET status = $1, updated_at = CURRENT_TIMESTAMP WHERE id = $2',
+            [status, orderId]
+        );
+        
+        await client.query('COMMIT');
+        
+        res.json({
+            success: true,
+            message: `Order status updated to ${status}`,
+            orderId: orderId,
+            newStatus: status
+        });
+        
+    } catch (error) {
+        await client.query('ROLLBACK');
+        console.error('Error updating order status:', error);
+        res.status(500).json({ success: false, message: 'Server error' });
+    } finally {
+        client.release();
+    }
+});
+
 module.exports = router;
Index: kupi-mk/frontend/src/App.js
===================================================================
--- kupi-mk/frontend/src/App.js	(revision a50634e742db5be5422ca0b5c8ddead0ccf398f8)
+++ kupi-mk/frontend/src/App.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -3,4 +3,5 @@
 import { AuthProvider } from './context/AuthContext';
 import { ProductProvider } from './context/ProductContext';
+import { CartProvider } from './context/CartContext';
 
 // Components
@@ -13,4 +14,7 @@
 import EditProduct from './pages/EditProduct';
 import Profile from './pages/Profile';
+import Checkout from './pages/Checkout';
+import Orders from './pages/Orders';
+import SellerDashboard from './pages/SellerDashboard';
 import ProtectedRoute from './components/ProtectedRoute';
 
@@ -18,9 +22,10 @@
   return (
     <AuthProvider>
-      <ProductProvider>
-        <Router>
-          <div className="min-h-screen bg-gray-50">
-            <Navbar />
-            <main className="container mx-auto px-4 py-8">
+      <CartProvider>
+        <ProductProvider>
+          <Router>
+            <div className="min-h-screen bg-gray-50">
+              <Navbar />
+              <main className="container mx-auto px-4 py-8">
               <Routes>
                 <Route path="/" element={<Home />} />
@@ -52,4 +57,28 @@
                   } 
                 />
+                <Route 
+                  path="/checkout" 
+                  element={
+                    <ProtectedRoute>
+                      <Checkout />
+                    </ProtectedRoute>
+                  } 
+                />
+                <Route 
+                  path="/orders" 
+                  element={
+                    <ProtectedRoute>
+                      <Orders />
+                    </ProtectedRoute>
+                  } 
+                />
+                <Route 
+                  path="/seller-dashboard" 
+                  element={
+                    <ProtectedRoute>
+                      <SellerDashboard />
+                    </ProtectedRoute>
+                  } 
+                />
               </Routes>
             </main>
@@ -57,4 +86,5 @@
         </Router>
       </ProductProvider>
+    </CartProvider>
     </AuthProvider>
   );
Index: kupi-mk/frontend/src/components/CartIcon.js
===================================================================
--- kupi-mk/frontend/src/components/CartIcon.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/components/CartIcon.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,51 @@
+import React from 'react';
+import { useCart } from '../context/CartContext';
+
+const CartIcon = ({ onClick }) => {
+  const { totalItems, loading } = useCart();
+
+  return (
+    <button
+      onClick={onClick}
+      className="relative inline-flex items-center px-3 py-2 text-gray-700 hover:text-blue-600 transition-colors duration-200"
+      aria-label={`Shopping cart with ${totalItems} items`}
+    >
+      {/* Shopping Cart Icon */}
+      <svg
+        className="w-6 h-6"
+        fill="none"
+        stroke="currentColor"
+        viewBox="0 0 24 24"
+        xmlns="http://www.w3.org/2000/svg"
+      >
+        <path
+          strokeLinecap="round"
+          strokeLinejoin="round"
+          strokeWidth={2}
+          d="M3 3h2l.4 2M7 13h10l4-8H5.4m0 0L7 13m0 0l-1.5 6M7 13l1.5-6M17 13l1.5 6M9 19.5h6"
+        />
+      </svg>
+
+      {/* Cart Item Count Badge */}
+      {totalItems > 0 && (
+        <span className="absolute -top-1 -right-1 bg-red-500 text-white text-xs font-bold rounded-full h-5 w-5 flex items-center justify-center min-w-[20px] animate-pulse">
+          {totalItems > 99 ? '99+' : totalItems}
+        </span>
+      )}
+
+      {/* Loading indicator */}
+      {loading && (
+        <div className="absolute -top-1 -right-1 w-4 h-4">
+          <div className="animate-spin rounded-full h-4 w-4 border-2 border-blue-500 border-t-transparent"></div>
+        </div>
+      )}
+
+      {/* Cart text (optional, can be hidden on mobile) */}
+      <span className="ml-2 hidden sm:inline-block font-medium">
+        Cart
+      </span>
+    </button>
+  );
+};
+
+export default CartIcon;
Index: kupi-mk/frontend/src/components/CartItem.js
===================================================================
--- kupi-mk/frontend/src/components/CartItem.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/components/CartItem.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,127 @@
+import React, { useState } from 'react';
+import { useCart } from '../context/CartContext';
+
+const CartItem = ({ item }) => {
+  const { updateCartItem, removeFromCart } = useCart();
+  const [isUpdating, setIsUpdating] = useState(false);
+  const [isRemoving, setIsRemoving] = useState(false);
+
+  const getImageUrl = (imagePath) => {
+    if (!imagePath) return '/placeholder-image.svg';
+    if (imagePath.startsWith('http')) return imagePath;
+    if (imagePath.startsWith('/')) {
+      return `http://localhost:5001${imagePath}`;
+    }
+    return `http://localhost:5001/uploads/products/${imagePath}`;
+  };
+
+  const imageUrl = item.images && item.images.length > 0 
+    ? getImageUrl(item.images[0])
+    : '/placeholder-image.svg';
+
+  const handleQuantityChange = async (newQuantity) => {
+    if (newQuantity < 1) return;
+    
+    setIsUpdating(true);
+    const result = await updateCartItem(item.id, newQuantity);
+    if (!result.success) {
+      alert(result.message || 'Failed to update quantity');
+    }
+    setIsUpdating(false);
+  };
+
+  const handleRemove = async () => {
+    if (window.confirm('Remove this item from your cart?')) {
+      setIsRemoving(true);
+      const result = await removeFromCart(item.id);
+      if (!result.success) {
+        alert(result.message || 'Failed to remove item');
+        setIsRemoving(false);
+      }
+    }
+  };
+
+  const itemTotal = parseFloat(item.price) * item.quantity;
+
+  return (
+    <div className={`flex items-center space-x-4 py-4 border-b border-gray-200 ${isRemoving ? 'opacity-50' : ''}`}>
+      {/* Product Image */}
+      <div className="flex-shrink-0 w-16 h-16 bg-gray-200 rounded-md overflow-hidden">
+        <img
+          src={imageUrl}
+          alt={item.title}
+          className="w-full h-full object-cover"
+          onError={(e) => {
+            e.target.src = '/placeholder-image.svg';
+          }}
+        />
+      </div>
+
+      {/* Product Details */}
+      <div className="flex-1 min-w-0">
+        <h4 className="text-sm font-medium text-gray-900 truncate">
+          {item.title}
+        </h4>
+        <p className="text-sm text-gray-500">
+          {item.category_name}
+        </p>
+        <p className="text-sm font-medium text-gray-900">
+          {parseFloat(item.price).toLocaleString()} МКД
+        </p>
+      </div>
+
+      {/* Quantity Controls */}
+      <div className="flex items-center space-x-2">
+        <button
+          onClick={() => handleQuantityChange(item.quantity - 1)}
+          disabled={isUpdating || item.quantity <= 1}
+          className="w-8 h-8 rounded-full border border-gray-300 flex items-center justify-center hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed"
+        >
+          -
+        </button>
+        
+        <span className="w-8 text-center text-sm font-medium">
+          {isUpdating ? '...' : item.quantity}
+        </span>
+        
+        <button
+          onClick={() => handleQuantityChange(item.quantity + 1)}
+          disabled={isUpdating || item.quantity >= item.stock_quantity}
+          className="w-8 h-8 rounded-full border border-gray-300 flex items-center justify-center hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed"
+        >
+          +
+        </button>
+      </div>
+
+      {/* Item Total */}
+      <div className="text-right">
+        <p className="text-sm font-medium text-gray-900">
+          {itemTotal.toLocaleString()} МКД
+        </p>
+        {item.quantity > 1 && (
+          <p className="text-xs text-gray-500">
+            {parseFloat(item.price).toLocaleString()} × {item.quantity}
+          </p>
+        )}
+      </div>
+
+      {/* Remove Button */}
+      <button
+        onClick={handleRemove}
+        disabled={isRemoving}
+        className="flex-shrink-0 p-2 text-gray-400 hover:text-red-500 transition-colors disabled:opacity-50"
+        aria-label="Remove item"
+      >
+        {isRemoving ? (
+          <div className="w-4 h-4 animate-spin border-2 border-gray-400 border-t-transparent rounded-full"></div>
+        ) : (
+          <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+            <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
+          </svg>
+        )}
+      </button>
+    </div>
+  );
+};
+
+export default CartItem;
Index: kupi-mk/frontend/src/components/CartSidebar.js
===================================================================
--- kupi-mk/frontend/src/components/CartSidebar.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/components/CartSidebar.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,141 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { useCart } from '../context/CartContext';
+import CartItem from './CartItem';
+
+const CartSidebar = ({ isOpen, onClose }) => {
+  const { cartItems, totalItems, totalPrice, loading, error, clearCart } = useCart();
+
+  const handleClearCart = async () => {
+    if (window.confirm('Are you sure you want to clear your entire cart?')) {
+      const result = await clearCart();
+      if (!result.success) {
+        alert(result.message || 'Failed to clear cart');
+      }
+    }
+  };
+
+  const handleCheckout = () => {
+    onClose();
+    // Navigation to checkout will be handled by the Link component
+  };
+
+  return (
+    <>
+      {/* Backdrop */}
+      {isOpen && (
+        <div
+          className="fixed inset-0 bg-black bg-opacity-50 z-40 transition-opacity"
+          onClick={onClose}
+        />
+      )}
+
+      {/* Sidebar */}
+      <div
+        className={`fixed top-0 right-0 h-full w-full max-w-md bg-white shadow-xl z-50 transform transition-transform duration-300 ease-in-out ${
+          isOpen ? 'translate-x-0' : 'translate-x-full'
+        }`}
+      >
+        {/* Header */}
+        <div className="flex items-center justify-between p-4 border-b border-gray-200">
+          <h2 className="text-lg font-semibold text-gray-900">
+            Shopping Cart ({totalItems})
+          </h2>
+          <button
+            onClick={onClose}
+            className="p-2 hover:bg-gray-100 rounded-full transition-colors"
+            aria-label="Close cart"
+          >
+            <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+              <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
+            </svg>
+          </button>
+        </div>
+
+        {/* Content */}
+        <div className="flex flex-col h-full">
+          {/* Error Message */}
+          {error && (
+            <div className="mx-4 mt-4 p-3 bg-red-100 border border-red-300 text-red-700 rounded-md">
+              {error}
+            </div>
+          )}
+
+          {/* Loading State */}
+          {loading && (
+            <div className="flex-1 flex items-center justify-center">
+              <div className="animate-spin rounded-full h-8 w-8 border-2 border-blue-500 border-t-transparent"></div>
+            </div>
+          )}
+
+          {/* Empty Cart */}
+          {!loading && cartItems.length === 0 && (
+            <div className="flex-1 flex flex-col items-center justify-center p-8 text-center">
+              <svg className="w-16 h-16 text-gray-300 mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1} d="M3 3h2l.4 2M7 13h10l4-8H5.4m0 0L7 13m0 0l-1.5 6M7 13l1.5-6M17 13l1.5 6M9 19.5h6" />
+              </svg>
+              <h3 className="text-lg font-medium text-gray-900 mb-2">Your cart is empty</h3>
+              <p className="text-gray-500 mb-4">Add some products to get started!</p>
+              <button
+                onClick={onClose}
+                className="bg-blue-600 text-white px-6 py-2 rounded-md hover:bg-blue-700 transition-colors"
+              >
+                Continue Shopping
+              </button>
+            </div>
+          )}
+
+          {/* Cart Items */}
+          {!loading && cartItems.length > 0 && (
+            <>
+              {/* Items List */}
+              <div className="flex-1 overflow-y-auto px-4">
+                {cartItems.map((item) => (
+                  <CartItem key={item.id} item={item} />
+                ))}
+              </div>
+
+              {/* Footer */}
+              <div className="border-t border-gray-200 p-4 space-y-4">
+                {/* Clear Cart Button */}
+                {cartItems.length > 1 && (
+                  <button
+                    onClick={handleClearCart}
+                    className="w-full text-sm text-red-600 hover:text-red-700 font-medium"
+                  >
+                    Clear Cart
+                  </button>
+                )}
+
+                {/* Total */}
+                <div className="flex justify-between items-center text-lg font-semibold">
+                  <span>Total:</span>
+                  <span>{totalPrice.toLocaleString()} МКД</span>
+                </div>
+
+                {/* Action Buttons */}
+                <div className="space-y-2">
+                  <Link
+                    to="/checkout"
+                    onClick={handleCheckout}
+                    className="w-full bg-blue-600 text-white py-3 px-4 rounded-md hover:bg-blue-700 transition-colors font-medium text-center block"
+                  >
+                    Proceed to Checkout
+                  </Link>
+                  <button
+                    onClick={onClose}
+                    className="w-full border border-gray-300 text-gray-700 py-3 px-4 rounded-md hover:bg-gray-50 transition-colors font-medium"
+                  >
+                    Continue Shopping
+                  </button>
+                </div>
+              </div>
+            </>
+          )}
+        </div>
+      </div>
+    </>
+  );
+};
+
+export default CartSidebar;
Index: kupi-mk/frontend/src/components/Navbar.js
===================================================================
--- kupi-mk/frontend/src/components/Navbar.js	(revision a50634e742db5be5422ca0b5c8ddead0ccf398f8)
+++ kupi-mk/frontend/src/components/Navbar.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -1,9 +1,12 @@
-import React from 'react';
+import React, { useState } from 'react';
 import { Link, useNavigate } from 'react-router-dom';
 import { useAuth } from '../context/AuthContext';
+import CartIcon from './CartIcon';
+import CartSidebar from './CartSidebar';
 
 const Navbar = () => {
   const { user, logout, isAuthenticated } = useAuth();
   const navigate = useNavigate();
+  const [isCartOpen, setIsCartOpen] = useState(false);
 
   const handleLogout = () => {
@@ -52,4 +55,7 @@
             {isAuthenticated() ? (
               <>
+                {/* Cart Icon - only show when logged in */}
+                <CartIcon onClick={() => setIsCartOpen(true)} />
+                
                 <Link
                   to="/create-product"
@@ -82,4 +88,17 @@
                       Мој профил
                     </Link>
+                    <Link
+                      to="/orders"
+                      className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100"
+                    >
+                      Мои нарачки
+                    </Link>
+                    <Link
+                      to="/seller-dashboard"
+                      className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100"
+                    >
+                      Продавач панел
+                    </Link>
+                    {/* Seller Dashboard: visible when logged in; shows seller-specific order management */}
                     <button
                       onClick={handleLogout}
@@ -110,4 +129,10 @@
         </div>
       </div>
+      
+      {/* Cart Sidebar */}
+      <CartSidebar 
+        isOpen={isCartOpen} 
+        onClose={() => setIsCartOpen(false)} 
+      />
     </nav>
   );
Index: kupi-mk/frontend/src/components/ProductCard.js
===================================================================
--- kupi-mk/frontend/src/components/ProductCard.js	(revision a50634e742db5be5422ca0b5c8ddead0ccf398f8)
+++ kupi-mk/frontend/src/components/ProductCard.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -1,6 +1,13 @@
-import React from 'react';
+import React, { useState } from 'react';
 import { Link } from 'react-router-dom';
+import { useAuth } from '../context/AuthContext';
+import { useCart } from '../context/CartContext';
+import StarRating from './StarRating';
 
 const ProductCard = ({ product }) => {
+  const { isAuthenticated } = useAuth();
+  const { addToCart } = useCart();
+  const [isAddingToCart, setIsAddingToCart] = useState(false);
+  
   const getImageUrl = (imagePath) => {
     if (!imagePath) return '/placeholder-image.svg';
@@ -25,7 +32,35 @@
   console.log('Image URL:', imageUrl); // Debug log
 
+  const handleAddToCart = async (e) => {
+    e.preventDefault();
+    e.stopPropagation();
+    
+    if (!isAuthenticated()) {
+      alert('Please log in to add items to cart');
+      return;
+    }
+    
+    if (product.stock_quantity < 1) {
+      alert('This product is out of stock');
+      return;
+    }
+    
+    setIsAddingToCart(true);
+    const result = await addToCart(product.id, 1);
+    
+    if (result.success) {
+      // Could show a toast notification here instead
+      alert(result.message || 'Product added to cart!');
+    } else {
+      alert(result.message || 'Failed to add product to cart');
+    }
+    
+    setIsAddingToCart(false);
+  };
+
   return (
-    <Link to={`/product/${product.id}`} className="group">
-      <div className="bg-white rounded-lg shadow-md overflow-hidden hover:shadow-lg transition-shadow duration-300">
+    <div className="bg-white rounded-lg shadow-md overflow-hidden hover:shadow-lg transition-shadow duration-300 group">
+      {/* Product Image and Info - Clickable Link */}
+      <Link to={`/product/${product.id}`} className="block">
         <div className="aspect-w-16 aspect-h-9 bg-gray-200">
           <img
@@ -43,5 +78,5 @@
         </div>
         
-        <div className="p-4">
+        <div className="p-4 pb-2">
           <h3 className="text-lg font-semibold text-gray-900 mb-2 line-clamp-2">
             {product.title}
@@ -64,4 +99,19 @@
           </div>
           
+          {/* Rating Display */}
+          {product.average_rating && product.average_rating > 0 && (
+            <div className="mt-2">
+              <StarRating 
+                rating={product.average_rating} 
+                readonly={true} 
+                size="sm"
+                showRatingText={false}
+              />
+              <span className="text-xs text-gray-500 ml-2">
+                ({product.review_count || 0} reviews)
+              </span>
+            </div>
+          )}
+          
           <div className="mt-3 flex justify-between items-center text-sm text-gray-500">
             <span>{product.category_name}</span>
@@ -69,6 +119,44 @@
           </div>
         </div>
+      </Link>
+      
+      {/* Add to Cart Section - Not part of the link */}
+      <div className="px-4 pb-4">
+        <div className="flex items-center justify-between">
+          <div className="text-sm text-gray-500">
+            {product.stock_quantity > 0 ? (
+              <span className="text-green-600">
+                ✓ {product.stock_quantity} на залиха
+              </span>
+            ) : (
+              <span className="text-red-600">✗ Нема на залиха</span>
+            )}
+          </div>
+          
+          {isAuthenticated() && (
+            <button
+              onClick={handleAddToCart}
+              disabled={isAddingToCart || product.stock_quantity < 1}
+              className={`px-4 py-2 rounded-md text-sm font-medium transition-colors duration-200 ${
+                product.stock_quantity < 1
+                  ? 'bg-gray-200 text-gray-500 cursor-not-allowed'
+                  : isAddingToCart
+                  ? 'bg-blue-400 text-white cursor-not-allowed'
+                  : 'bg-blue-600 text-white hover:bg-blue-700'
+              }`}
+            >
+              {isAddingToCart ? (
+                <div className="flex items-center space-x-2">
+                  <div className="w-4 h-4 animate-spin border-2 border-white border-t-transparent rounded-full"></div>
+                  <span>Adding...</span>
+                </div>
+              ) : (
+                '+ Додај во кошничка'
+              )}
+            </button>
+          )}
+        </div>
       </div>
-    </Link>
+    </div>
   );
 };
Index: kupi-mk/frontend/src/components/ReviewForm.js
===================================================================
--- kupi-mk/frontend/src/components/ReviewForm.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/components/ReviewForm.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,148 @@
+import React, { useState } from 'react';
+import { useAuth } from '../context/AuthContext';
+import StarRating from './StarRating';
+import api from '../services/api';
+
+const ReviewForm = ({ productId, onReviewAdded, onCancel }) => {
+    const { user } = useAuth();
+    const [formData, setFormData] = useState({
+        rating: 0,
+        comment: ''
+    });
+    const [loading, setLoading] = useState(false);
+    const [error, setError] = useState(null);
+
+    const handleSubmit = async (e) => {
+        e.preventDefault();
+        
+        if (formData.rating === 0) {
+            setError('Please select a rating');
+            return;
+        }
+
+        if (!formData.comment.trim()) {
+            setError('Please write a comment');
+            return;
+        }
+
+        setLoading(true);
+        setError(null);
+
+        try {
+            const response = await api.post('/reviews', {
+                product_id: productId,
+                rating: formData.rating,
+                comment: formData.comment.trim()
+            });
+
+            if (response.data.success) {
+                setFormData({ rating: 0, comment: '' });
+                if (onReviewAdded) {
+                    onReviewAdded(response.data.review);
+                }
+            } else {
+                setError(response.data.message || 'Failed to submit review');
+            }
+        } catch (error) {
+            console.error('Error submitting review:', error);
+            setError('Failed to submit review. Please try again.');
+        } finally {
+            setLoading(false);
+        }
+    };
+
+    const handleRatingChange = (rating) => {
+        setFormData(prev => ({ ...prev, rating }));
+        setError(null);
+    };
+
+    const handleCommentChange = (e) => {
+        setFormData(prev => ({ ...prev, comment: e.target.value }));
+        setError(null);
+    };
+
+    if (!user) {
+        return (
+            <div className="bg-gray-100 p-6 rounded-lg text-center">
+                <p className="text-gray-600 mb-4">Please log in to write a review</p>
+                <a
+                    href="/login"
+                    className="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700"
+                >
+                    Log In
+                </a>
+            </div>
+        );
+    }
+
+    return (
+        <div className="bg-white p-6 rounded-lg border border-gray-200">
+            <h3 className="text-lg font-semibold text-gray-800 mb-4">Write a Review</h3>
+            
+            <form onSubmit={handleSubmit}>
+                {/* Rating */}
+                <div className="mb-4">
+                    <label className="block text-sm font-medium text-gray-700 mb-2">
+                        Rating *
+                    </label>
+                    <StarRating
+                        rating={formData.rating}
+                        onRatingChange={handleRatingChange}
+                        readonly={false}
+                        showRatingText={false}
+                        size="lg"
+                    />
+                </div>
+
+                {/* Comment */}
+                <div className="mb-4">
+                    <label className="block text-sm font-medium text-gray-700 mb-2">
+                        Your Review *
+                    </label>
+                    <textarea
+                        rows={4}
+                        value={formData.comment}
+                        onChange={handleCommentChange}
+                        placeholder="Share your thoughts about this product..."
+                        className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 resize-none"
+                        disabled={loading}
+                    />
+                    <p className="text-xs text-gray-500 mt-1">
+                        {formData.comment.length}/500 characters
+                    </p>
+                </div>
+
+                {/* Error Message */}
+                {error && (
+                    <div className="mb-4 p-3 bg-red-100 border border-red-300 text-red-700 rounded-md">
+                        {error}
+                    </div>
+                )}
+
+                {/* Buttons */}
+                <div className="flex space-x-3">
+                    <button
+                        type="submit"
+                        disabled={loading}
+                        className="flex-1 bg-blue-600 text-white py-2 px-4 rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed"
+                    >
+                        {loading ? 'Submitting...' : 'Submit Review'}
+                    </button>
+                    
+                    {onCancel && (
+                        <button
+                            type="button"
+                            onClick={onCancel}
+                            disabled={loading}
+                            className="flex-1 border border-gray-300 text-gray-700 py-2 px-4 rounded-md hover:bg-gray-50 disabled:opacity-50"
+                        >
+                            Cancel
+                        </button>
+                    )}
+                </div>
+            </form>
+        </div>
+    );
+};
+
+export default ReviewForm;
Index: kupi-mk/frontend/src/components/ReviewList.js
===================================================================
--- kupi-mk/frontend/src/components/ReviewList.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/components/ReviewList.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,221 @@
+import React, { useState } from 'react';
+import { useAuth } from '../context/AuthContext';
+import StarRating from './StarRating';
+import api from '../services/api';
+
+const ReviewList = ({ reviews, onReviewUpdate, onReviewDelete }) => {
+    const { user } = useAuth();
+    const [editingReview, setEditingReview] = useState(null);
+    const [editFormData, setEditFormData] = useState({ rating: 0, comment: '' });
+    const [loading, setLoading] = useState(false);
+
+    const formatDate = (dateString) => {
+        return new Date(dateString).toLocaleDateString('en-US', {
+            year: 'numeric',
+            month: 'long',
+            day: 'numeric'
+        });
+    };
+
+    const handleEditStart = (review) => {
+        setEditingReview(review.id);
+        setEditFormData({
+            rating: review.rating,
+            comment: review.comment
+        });
+    };
+
+    const handleEditCancel = () => {
+        setEditingReview(null);
+        setEditFormData({ rating: 0, comment: '' });
+    };
+
+    const handleEditSubmit = async (reviewId) => {
+        setLoading(true);
+        try {
+            const response = await api.put(`/reviews/${reviewId}`, {
+                rating: editFormData.rating,
+                comment: editFormData.comment
+            });
+
+            if (response.data.success) {
+                if (onReviewUpdate) {
+                    onReviewUpdate(response.data.review);
+                }
+                setEditingReview(null);
+            }
+        } catch (error) {
+            console.error('Error updating review:', error);
+            alert('Failed to update review');
+        } finally {
+            setLoading(false);
+        }
+    };
+
+    const handleDelete = async (reviewId) => {
+        if (!window.confirm('Are you sure you want to delete this review?')) {
+            return;
+        }
+
+        try {
+            const response = await api.delete(`/reviews/${reviewId}`);
+            
+            if (response.data.success) {
+                if (onReviewDelete) {
+                    onReviewDelete(reviewId);
+                }
+            }
+        } catch (error) {
+            console.error('Error deleting review:', error);
+            alert('Failed to delete review');
+        }
+    };
+
+    const handleHelpful = async (reviewId, isHelpful) => {
+        try {
+            await api.post(`/reviews/${reviewId}/helpful`, {
+                is_helpful: isHelpful
+            });
+            // You might want to refresh the reviews here or update the helpful count
+        } catch (error) {
+            console.error('Error marking review helpful:', error);
+        }
+    };
+
+    if (!reviews || reviews.length === 0) {
+        return (
+            <div className="bg-gray-50 p-8 rounded-lg text-center">
+                <div className="mb-4">
+                    <svg className="mx-auto h-12 w-12 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+                        <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-1l-4 4z" />
+                    </svg>
+                </div>
+                <p className="text-gray-600">No reviews yet. Be the first to review this product!</p>
+            </div>
+        );
+    }
+
+    return (
+        <div className="space-y-6">
+            {reviews.map((review) => (
+                <div key={review.id} className="bg-white p-6 rounded-lg border border-gray-200">
+                    {/* Review Header */}
+                    <div className="flex items-start justify-between mb-4">
+                        <div className="flex items-center space-x-3">
+                            <div className="w-10 h-10 bg-blue-600 rounded-full flex items-center justify-center">
+                                <span className="text-white font-medium">
+                                    {review.user_first_name ? review.user_first_name.charAt(0).toUpperCase() : 'U'}
+                                </span>
+                            </div>
+                            <div>
+                                <p className="font-medium text-gray-800">
+                                    {review.user_first_name} {review.user_last_name}
+                                </p>
+                                <p className="text-sm text-gray-500">
+                                    {formatDate(review.created_at)}
+                                </p>
+                            </div>
+                        </div>
+
+                        {/* Review Actions - only show for own reviews */}
+                        {user && user.id === review.user_id && (
+                            <div className="flex space-x-2">
+                                <button
+                                    onClick={() => handleEditStart(review)}
+                                    className="text-sm text-blue-600 hover:text-blue-700"
+                                >
+                                    Edit
+                                </button>
+                                <button
+                                    onClick={() => handleDelete(review.id)}
+                                    className="text-sm text-red-600 hover:text-red-700"
+                                >
+                                    Delete
+                                </button>
+                            </div>
+                        )}
+                    </div>
+
+                    {/* Rating */}
+                    <div className="mb-3">
+                        <StarRating 
+                            rating={editingReview === review.id ? editFormData.rating : review.rating}
+                            onRatingChange={editingReview === review.id ? 
+                                (rating) => setEditFormData(prev => ({ ...prev, rating })) : 
+                                null
+                            }
+                            readonly={editingReview !== review.id}
+                            showRatingText={false}
+                        />
+                    </div>
+
+                    {/* Review Content */}
+                    {editingReview === review.id ? (
+                        <div className="mb-4">
+                            <textarea
+                                value={editFormData.comment}
+                                onChange={(e) => setEditFormData(prev => ({ ...prev, comment: e.target.value }))}
+                                className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 resize-none"
+                                rows={3}
+                                disabled={loading}
+                            />
+                            <div className="flex space-x-2 mt-3">
+                                <button
+                                    onClick={() => handleEditSubmit(review.id)}
+                                    disabled={loading}
+                                    className="bg-blue-600 text-white px-3 py-1 rounded-md text-sm hover:bg-blue-700 disabled:opacity-50"
+                                >
+                                    {loading ? 'Saving...' : 'Save'}
+                                </button>
+                                <button
+                                    onClick={handleEditCancel}
+                                    disabled={loading}
+                                    className="border border-gray-300 text-gray-700 px-3 py-1 rounded-md text-sm hover:bg-gray-50 disabled:opacity-50"
+                                >
+                                    Cancel
+                                </button>
+                            </div>
+                        </div>
+                    ) : (
+                        <p className="text-gray-700 mb-4">{review.comment}</p>
+                    )}
+
+                    {/* Helpful Section */}
+                    {editingReview !== review.id && (
+                        <div className="flex items-center space-x-4 text-sm text-gray-500">
+                            <span>Was this review helpful?</span>
+                            <div className="flex space-x-2">
+                                <button
+                                    onClick={() => handleHelpful(review.id, true)}
+                                    className="flex items-center space-x-1 hover:text-green-600"
+                                >
+                                    <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+                                        <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M14 10h4.764a2 2 0 011.789 2.894l-3.5 7A2 2 0 0115.263 21h-4.017c-.163 0-.326-.02-.485-.06L7 20m7-10V5a2 2 0 00-2-2h-.095c-.5 0-.905.405-.905.905 0 .714-.211 1.412-.608 2.006L9 7v3m-3 10v-1a2 2 0 012-2h1m-6 3a2 2 0 002-2v-7a2 2 0 00-2-2H3a2 2 0 00-2 2v9a2 2 0 002 2z" />
+                                    </svg>
+                                    <span>Yes</span>
+                                    {review.helpful_count > 0 && (
+                                        <span>({review.helpful_count})</span>
+                                    )}
+                                </button>
+                                <button
+                                    onClick={() => handleHelpful(review.id, false)}
+                                    className="flex items-center space-x-1 hover:text-red-600"
+                                >
+                                    <svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+                                        <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 14H5.236a2 2 0 01-1.789-2.894l3.5-7A2 2 0 018.736 3h4.018c.163 0 .326.02.485.06L17 4m-7 10v2a2 2 0 002 2h.095c.5 0 .905-.405.905-.905 0-.714.211-1.412.608-2.006L15 17v-3m-6-10.5a2 2 0 00-2 2v1a2 2 0 002 2h1m-1 4v-1a2 2 0 012-2h1" />
+                                    </svg>
+                                    <span>No</span>
+                                    {review.not_helpful_count > 0 && (
+                                        <span>({review.not_helpful_count})</span>
+                                    )}
+                                </button>
+                            </div>
+                        </div>
+                    )}
+                </div>
+            ))}
+        </div>
+    );
+};
+
+export default ReviewList;
Index: kupi-mk/frontend/src/components/StarRating.js
===================================================================
--- kupi-mk/frontend/src/components/StarRating.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/components/StarRating.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,80 @@
+import React from 'react';
+
+const StarRating = ({ 
+    rating, 
+    onRatingChange, 
+    readonly = false, 
+    size = 'md',
+    showRatingText = true 
+}) => {
+    const sizes = {
+        sm: 'w-4 h-4',
+        md: 'w-5 h-5',
+        lg: 'w-6 h-6'
+    };
+
+    const handleStarClick = (starValue) => {
+        if (!readonly && onRatingChange) {
+            onRatingChange(starValue);
+        }
+    };
+
+    const renderStar = (starValue) => {
+        const isFilled = starValue <= rating;
+        const isHalfFilled = starValue - 0.5 === rating;
+        
+        return (
+            <button
+                key={starValue}
+                type="button"
+                disabled={readonly}
+                onClick={() => handleStarClick(starValue)}
+                className={`${sizes[size]} ${
+                    readonly 
+                        ? 'cursor-default' 
+                        : 'cursor-pointer hover:scale-110 transition-transform'
+                } focus:outline-none`}
+            >
+                <svg
+                    className={`${sizes[size]} ${
+                        isFilled 
+                            ? 'text-yellow-400' 
+                            : isHalfFilled 
+                                ? 'text-yellow-400' 
+                                : 'text-gray-300'
+                    }`}
+                    fill="currentColor"
+                    viewBox="0 0 20 20"
+                >
+                    <path
+                        d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"
+                    />
+                    {isHalfFilled && (
+                        <defs>
+                            <linearGradient id={`half-${starValue}`}>
+                                <stop offset="50%" stopColor="currentColor" />
+                                <stop offset="50%" stopColor="#D1D5DB" />
+                            </linearGradient>
+                        </defs>
+                    )}
+                </svg>
+            </button>
+        );
+    };
+
+    return (
+        <div className="flex items-center space-x-1">
+            <div className="flex items-center">
+                {[1, 2, 3, 4, 5].map(starValue => renderStar(starValue))}
+            </div>
+            
+            {showRatingText && (
+                <span className="text-sm text-gray-600 ml-2">
+                    {rating > 0 ? `${rating.toFixed(1)} out of 5` : 'No rating'}
+                </span>
+            )}
+        </div>
+    );
+};
+
+export default StarRating;
Index: kupi-mk/frontend/src/context/CartContext.js
===================================================================
--- kupi-mk/frontend/src/context/CartContext.js	(revision a50634e742db5be5422ca0b5c8ddead0ccf398f8)
+++ kupi-mk/frontend/src/context/CartContext.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -109,8 +109,9 @@
 export const CartProvider = ({ children }) => {
     const [state, dispatch] = useReducer(cartReducer, initialState);
-    const { user, token } = useAuth();
+    const { user } = useAuth();
 
     // Load cart when user logs in
     useEffect(() => {
+        const token = localStorage.getItem('token');
         if (user && token) {
             loadCart();
@@ -119,5 +120,5 @@
             dispatch({ type: 'CLEAR_CART' });
         }
-    }, [user, token]);
+    }, [user]);
 
     const loadCart = async () => {
Index: kupi-mk/frontend/src/pages/Checkout.js
===================================================================
--- kupi-mk/frontend/src/pages/Checkout.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/pages/Checkout.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,321 @@
+import React, { useState, useEffect } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { useCart } from '../context/CartContext';
+import api from '../services/api';
+
+const Checkout = () => {
+    const { cartItems, totalPrice, clearCart } = useCart();
+    const navigate = useNavigate();
+    
+    const [loading, setLoading] = useState(false);
+    const [orderPlaced, setOrderPlaced] = useState(false);
+    const [orderId, setOrderId] = useState(null);
+    const [formData, setFormData] = useState({
+        shippingAddress: {
+            fullName: '',
+            street: '',
+            city: '',
+            postalCode: '',
+            country: 'Macedonia'
+        },
+        phone: '',
+        paymentMethod: 'cash_on_delivery',
+        notes: ''
+    });
+
+    useEffect(() => {
+        // If cart is empty, redirect to home
+        if (!cartItems || cartItems.length === 0) {
+            navigate('/');
+        }
+    }, [cartItems, navigate]);
+
+    const handleInputChange = (section, field, value) => {
+        setFormData(prev => ({
+            ...prev,
+            [section]: {
+                ...prev[section],
+                [field]: value
+            }
+        }));
+    };
+
+    const handleSubmit = async (e) => {
+        e.preventDefault();
+        setLoading(true);
+
+        try {
+            const orderData = {
+                shippingAddress: formData.shippingAddress,
+                phone: formData.phone,
+                paymentMethod: formData.paymentMethod,
+                notes: formData.notes
+            };
+
+            const response = await api.post('/orders/checkout', orderData);
+            
+            if (response.data.success) {
+                setOrderId(response.data.order.id);
+                setOrderPlaced(true);
+                clearCart();
+                
+                // Redirect to order confirmation after 3 seconds
+                setTimeout(() => {
+                    navigate('/orders');
+                }, 3000);
+            }
+        } catch (error) {
+            console.error('Error placing order:', error);
+            alert('Failed to place order. Please try again.');
+        } finally {
+            setLoading(false);
+        }
+    };
+
+    if (orderPlaced) {
+        return (
+            <div className="min-h-screen bg-gray-50 flex items-center justify-center">
+                <div className="bg-white p-8 rounded-lg shadow-md text-center max-w-md">
+                    <div className="mb-4">
+                        <svg className="mx-auto h-16 w-16 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+                            <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
+                        </svg>
+                    </div>
+                    <h2 className="text-2xl font-bold text-gray-800 mb-2">Order Placed Successfully!</h2>
+                    <p className="text-gray-600 mb-4">
+                        Your order #{orderId} has been placed successfully.
+                    </p>
+                    <p className="text-sm text-gray-500">
+                        Redirecting to order history...
+                    </p>
+                </div>
+            </div>
+        );
+    }
+
+    if (!cartItems || cartItems.length === 0) {
+        return null; // This will trigger redirect in useEffect
+    }
+
+    return (
+        <div className="min-h-screen bg-gray-50 py-8">
+            <div className="max-w-4xl mx-auto px-4">
+                <h1 className="text-3xl font-bold text-gray-800 mb-8">Checkout</h1>
+                
+                <div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
+                    {/* Order Form */}
+                    <div className="bg-white p-6 rounded-lg shadow-md">
+                        <h2 className="text-xl font-semibold mb-6">Order Details</h2>
+                        
+                        <form onSubmit={handleSubmit}>
+                            {/* Shipping Address */}
+                            <div className="mb-8">
+                                <h3 className="text-lg font-medium mb-4">Shipping Address</h3>
+                                
+                                <div className="grid grid-cols-1 gap-4">
+                                    <div>
+                                        <label className="block text-sm font-medium text-gray-700 mb-1">
+                                            Full Name *
+                                        </label>
+                                        <input
+                                            type="text"
+                                            required
+                                            value={formData.shippingAddress.fullName}
+                                            onChange={(e) => handleInputChange('shippingAddress', 'fullName', e.target.value)}
+                                            className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
+                                        />
+                                    </div>
+                                    
+                                    <div>
+                                        <label className="block text-sm font-medium text-gray-700 mb-1">
+                                            Street Address *
+                                        </label>
+                                        <input
+                                            type="text"
+                                            required
+                                            value={formData.shippingAddress.street}
+                                            onChange={(e) => handleInputChange('shippingAddress', 'street', e.target.value)}
+                                            className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
+                                        />
+                                    </div>
+                                    
+                                    <div className="grid grid-cols-2 gap-4">
+                                        <div>
+                                            <label className="block text-sm font-medium text-gray-700 mb-1">
+                                                City *
+                                            </label>
+                                            <input
+                                                type="text"
+                                                required
+                                                value={formData.shippingAddress.city}
+                                                onChange={(e) => handleInputChange('shippingAddress', 'city', e.target.value)}
+                                                className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
+                                            />
+                                        </div>
+                                        
+                                        <div>
+                                            <label className="block text-sm font-medium text-gray-700 mb-1">
+                                                Postal Code *
+                                            </label>
+                                            <input
+                                                type="text"
+                                                required
+                                                value={formData.shippingAddress.postalCode}
+                                                onChange={(e) => handleInputChange('shippingAddress', 'postalCode', e.target.value)}
+                                                className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
+                                            />
+                                        </div>
+                                    </div>
+                                    
+                                    <div>
+                                        <label className="block text-sm font-medium text-gray-700 mb-1">
+                                            Country
+                                        </label>
+                                        <select
+                                            value={formData.shippingAddress.country}
+                                            onChange={(e) => handleInputChange('shippingAddress', 'country', e.target.value)}
+                                            className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
+                                        >
+                                            <option value="Macedonia">Macedonia</option>
+                                            <option value="Serbia">Serbia</option>
+                                            <option value="Bulgaria">Bulgaria</option>
+                                            <option value="Albania">Albania</option>
+                                            <option value="Greece">Greece</option>
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+                            
+                            {/* Contact Information */}
+                            <div className="mb-8">
+                                <h3 className="text-lg font-medium mb-4">Contact Information</h3>
+                                
+                                <div>
+                                    <label className="block text-sm font-medium text-gray-700 mb-1">
+                                        Phone Number *
+                                    </label>
+                                    <input
+                                        type="tel"
+                                        required
+                                        value={formData.phone}
+                                        onChange={(e) => setFormData(prev => ({ ...prev, phone: e.target.value }))}
+                                        placeholder="e.g. +389 70 123 456"
+                                        className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
+                                    />
+                                </div>
+                            </div>
+                            
+                            {/* Payment Method */}
+                            <div className="mb-8">
+                                <h3 className="text-lg font-medium mb-4">Payment Method</h3>
+                                
+                                <div className="space-y-3">
+                                    <label className="flex items-center">
+                                        <input
+                                            type="radio"
+                                            name="paymentMethod"
+                                            value="cash_on_delivery"
+                                            checked={formData.paymentMethod === 'cash_on_delivery'}
+                                            onChange={(e) => setFormData(prev => ({ ...prev, paymentMethod: e.target.value }))}
+                                            className="mr-3"
+                                        />
+                                        <span>Cash on Delivery</span>
+                                    </label>
+                                    
+                                    <label className="flex items-center">
+                                        <input
+                                            type="radio"
+                                            name="paymentMethod"
+                                            value="bank_transfer"
+                                            checked={formData.paymentMethod === 'bank_transfer'}
+                                            onChange={(e) => setFormData(prev => ({ ...prev, paymentMethod: e.target.value }))}
+                                            className="mr-3"
+                                        />
+                                        <span>Bank Transfer</span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            {/* Order Notes */}
+                            <div className="mb-8">
+                                <label className="block text-sm font-medium text-gray-700 mb-1">
+                                    Order Notes (Optional)
+                                </label>
+                                <textarea
+                                    rows={3}
+                                    value={formData.notes}
+                                    onChange={(e) => setFormData(prev => ({ ...prev, notes: e.target.value }))}
+                                    placeholder="Special delivery instructions, etc."
+                                    className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
+                                />
+                            </div>
+                            
+                            <button
+                                type="submit"
+                                disabled={loading}
+                                className="w-full bg-blue-600 text-white py-3 px-4 rounded-md hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed"
+                            >
+                                {loading ? 'Placing Order...' : 'Place Order'}
+                            </button>
+                        </form>
+                    </div>
+                    
+                    {/* Order Summary */}
+                    <div className="bg-white p-6 rounded-lg shadow-md h-fit">
+                        <h2 className="text-xl font-semibold mb-6">Order Summary</h2>
+                        
+                        <div className="space-y-4 mb-6">
+                            {cartItems.map((item) => (
+                                <div key={item.id} className="flex items-center space-x-4">
+                                    <div className="w-16 h-16 bg-gray-200 rounded-md overflow-hidden">
+                                        {item.images && item.images.length > 0 ? (
+                                            <img 
+                                                src={`http://localhost:5001${item.images[0]}`}
+                                                alt={item.title}
+                                                className="w-full h-full object-cover"
+                                            />
+                                        ) : (
+                                            <div className="w-full h-full flex items-center justify-center text-gray-400">
+                                                No image
+                                            </div>
+                                        )}
+                                    </div>
+                                    
+                                    <div className="flex-1">
+                                        <h4 className="font-medium text-gray-800">{item.title}</h4>
+                                        <p className="text-sm text-gray-600">
+                                            Quantity: {item.quantity}
+                                        </p>
+                                    </div>
+                                    
+                                    <div className="text-right">
+                                        <p className="font-medium">${(item.price * item.quantity).toFixed(2)}</p>
+                                    </div>
+                                </div>
+                            ))}
+                        </div>
+                        
+                        <div className="border-t pt-4">
+                            <div className="flex justify-between items-center mb-2">
+                                <span className="text-gray-600">Subtotal:</span>
+                                <span className="font-medium">${totalPrice.toFixed(2)}</span>
+                            </div>
+                            
+                            <div className="flex justify-between items-center mb-2">
+                                <span className="text-gray-600">Shipping:</span>
+                                <span className="font-medium">Free</span>
+                            </div>
+                            
+                            <div className="flex justify-between items-center text-lg font-bold border-t pt-2">
+                                <span>Total:</span>
+                                <span>${totalPrice.toFixed(2)}</span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    );
+};
+
+export default Checkout;
Index: kupi-mk/frontend/src/pages/Orders.js
===================================================================
--- kupi-mk/frontend/src/pages/Orders.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/pages/Orders.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,257 @@
+// Orders (Customer) Page
+// - Purpose: show the logged-in customer's order history
+// - Note: seller-specific controls (status advancement) were intentionally removed from this page
+//         and moved to the Seller Dashboard to maintain proper role separation.
+
+import React, { useState, useEffect } from 'react';
+import api from '../services/api';
+
+const Orders = () => {
+    const [orders, setOrders] = useState([]);
+    const [loading, setLoading] = useState(true);
+    const [error, setError] = useState(null);
+    const [selectedOrder, setSelectedOrder] = useState(null);
+
+    useEffect(() => {
+        fetchOrders();
+    }, []);
+
+    const fetchOrders = async () => {
+        try {
+            const response = await api.get('/orders/history');
+            if (response.data.success) {
+                setOrders(response.data.orders);
+            } else {
+                setError('Failed to fetch orders');
+            }
+        } catch (error) {
+            console.error('Error fetching orders:', error);
+            setError('Failed to fetch orders');
+        } finally {
+            setLoading(false);
+        }
+    };
+
+    const handleCancelOrder = async (orderId) => {
+        if (!window.confirm('Are you sure you want to cancel this order?')) {
+            return;
+        }
+
+        try {
+            const response = await api.put(`/orders/${orderId}/status`, {
+                status: 'cancelled'
+            });
+
+            if (response.data.success) {
+                // Refresh orders list
+                fetchOrders();
+                alert('Order cancelled successfully');
+            } else {
+                alert(response.data.message || 'Failed to cancel order');
+            }
+        } catch (error) {
+            console.error('Error cancelling order:', error);
+            alert('Failed to cancel order. Please try again.');
+        }
+    };
+
+    const getStatusColor = (status) => {
+        switch (status.toLowerCase()) {
+            case 'pending':
+                return 'bg-yellow-100 text-yellow-800';
+            case 'confirmed':
+                return 'bg-blue-100 text-blue-800';
+            case 'processing':
+                return 'bg-purple-100 text-purple-800';
+            case 'shipped':
+                return 'bg-indigo-100 text-indigo-800';
+            case 'delivered':
+                return 'bg-green-100 text-green-800';
+            case 'cancelled':
+                return 'bg-red-100 text-red-800';
+            default:
+                return 'bg-gray-100 text-gray-800';
+        }
+    };
+
+    const formatDate = (dateString) => {
+        return new Date(dateString).toLocaleDateString('en-US', {
+            year: 'numeric',
+            month: 'long',
+            day: 'numeric',
+            hour: '2-digit',
+            minute: '2-digit'
+        });
+    };
+
+    if (loading) {
+        return (
+            <div className="min-h-screen bg-gray-50 flex items-center justify-center">
+                <div className="text-center">
+                    <div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto"></div>
+                    <p className="mt-4 text-gray-600">Loading orders...</p>
+                </div>
+            </div>
+        );
+    }
+
+    if (error) {
+        return (
+            <div className="min-h-screen bg-gray-50 flex items-center justify-center">
+                <div className="text-center">
+                    <p className="text-red-600 mb-4">{error}</p>
+                    <button
+                        onClick={fetchOrders}
+                        className="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700"
+                    >
+                        Try Again
+                    </button>
+                </div>
+            </div>
+        );
+    }
+
+    return (
+        <div className="min-h-screen bg-gray-50 py-8">
+            <div className="max-w-6xl mx-auto px-4">
+                <h1 className="text-3xl font-bold text-gray-800 mb-8">Order History</h1>
+                
+                {orders.length === 0 ? (
+                    <div className="bg-white p-8 rounded-lg shadow-md text-center">
+                        <div className="mb-4">
+                            <svg className="mx-auto h-16 w-16 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+                                <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z" />
+                            </svg>
+                        </div>
+                        <h2 className="text-xl font-semibold text-gray-800 mb-2">No Orders Yet</h2>
+                        <p className="text-gray-600 mb-4">You haven't placed any orders yet.</p>
+                        <a
+                            href="/"
+                            className="inline-block bg-blue-600 text-white px-6 py-2 rounded-md hover:bg-blue-700"
+                        >
+                            Start Shopping
+                        </a>
+                    </div>
+                ) : (
+                    <div className="space-y-6">
+                        {orders.map((order) => (
+                            <div key={order.id} className="bg-white rounded-lg shadow-md overflow-hidden">
+                                {/* Order Header */}
+                                <div className="p-6 border-b border-gray-200">
+                                    <div className="flex flex-col sm:flex-row sm:items-center sm:justify-between">
+                                        <div className="mb-4 sm:mb-0">
+                                            <h3 className="text-lg font-semibold text-gray-800">
+                                                Order #{order.id}
+                                            </h3>
+                                            <p className="text-sm text-gray-600">
+                                                Placed on {formatDate(order.created_at)}
+                                            </p>
+                                        </div>
+                                        
+                                        <div className="flex flex-col sm:items-end">
+                                            <span className={`inline-flex items-center px-3 py-1 rounded-full text-sm font-medium ${getStatusColor(order.status)}`}>
+                                                {order.status.charAt(0).toUpperCase() + order.status.slice(1)}
+                                            </span>
+                                            <p className="mt-2 text-lg font-semibold text-gray-800">
+                                                {parseFloat(order.total_amount || 0).toLocaleString('mk-MK')} ден.
+                                            </p>
+                                        </div>
+                                    </div>
+                                </div>
+                                
+                                {/* Order Items - Only show if selected */}
+                                {selectedOrder === order.id && (
+                                    <>
+                                        <div className="p-6">
+                                            <h4 className="font-medium text-gray-800 mb-4">Items Ordered</h4>
+                                            <div className="space-y-4">
+                                                {order.items && order.items.map((item, index) => (
+                                                    <div key={index} className="flex items-center space-x-4">
+                                                        <div className="w-16 h-16 bg-gray-200 rounded-md overflow-hidden">
+                                                            {item.product_images && item.product_images.length > 0 ? (
+                                                                <img 
+                                                                    src={`http://localhost:5001${item.product_images[0]}`}
+                                                                    alt={item.product_title}
+                                                                    className="w-full h-full object-cover"
+                                                                />
+                                                            ) : (
+                                                                <div className="w-full h-full flex items-center justify-center text-gray-400">
+                                                                    No image
+                                                                </div>
+                                                            )}
+                                                        </div>
+                                                        
+                                                        <div className="flex-1">
+                                                            <h5 className="font-medium text-gray-800">{item.product_title}</h5>
+                                                            <p className="text-sm text-gray-600">
+                                                                Quantity: {item.quantity} × {parseFloat(item.price_at_time || item.price || 0).toLocaleString('mk-MK')} ден.
+                                                            </p>
+                                                        </div>
+                                                        
+                                                        <div className="text-right">
+                                                            <p className="font-medium">{(parseFloat(item.price_at_time || item.price || 0) * item.quantity).toLocaleString('mk-MK')} ден.</p>
+                                                        </div>
+                                                    </div>
+                                                ))}
+                                            </div>
+                                        </div>
+                                        
+                                        {/* Shipping Address */}
+                                        {order.shipping_address && (
+                                            <div className="px-6 pb-6">
+                                                <h4 className="font-medium text-gray-800 mb-2">Shipping Address</h4>
+                                                <div className="text-sm text-gray-600">
+                                                    <p>{order.shipping_address.fullName}</p>
+                                                    <p>{order.shipping_address.street}</p>
+                                                    <p>{order.shipping_address.city}, {order.shipping_address.postalCode}</p>
+                                                    <p>{order.shipping_address.country}</p>
+                                                </div>
+                                            </div>
+                                        )}
+                                        
+                                        {/* Order Notes */}
+                                        {order.notes && (
+                                            <div className="px-6 pb-6">
+                                                <h4 className="font-medium text-gray-800 mb-2">Order Notes</h4>
+                                                <p className="text-sm text-gray-600">{order.notes}</p>
+                                            </div>
+                                        )}
+                                    </>
+                                )}
+                                
+                                {/* Order Actions */}
+                                <div className="px-6 pb-6">
+                                    <div className="flex flex-col sm:flex-row gap-3">
+                                        <button
+                                            onClick={() => setSelectedOrder(selectedOrder === order.id ? null : order.id)}
+                                            className="flex-1 border border-gray-300 text-gray-700 py-2 px-4 rounded-md hover:bg-gray-50 transition-colors"
+                                        >
+                                            {selectedOrder === order.id ? 'Hide Details' : 'View Details'}
+                                        </button>
+                                        
+                                        {order.status === 'delivered' && (
+                                            <button className="flex-1 bg-blue-600 text-white py-2 px-4 rounded-md hover:bg-blue-700 transition-colors">
+                                                Reorder Items
+                                            </button>
+                                        )}
+                                        
+                                        {(order.status === 'pending' || order.status === 'confirmed') && (
+                                            <button 
+                                                onClick={() => handleCancelOrder(order.id)}
+                                                className="flex-1 bg-red-600 text-white py-2 px-4 rounded-md hover:bg-red-700 transition-colors"
+                                            >
+                                                Cancel Order
+                                            </button>
+                                        )}
+                                    </div>
+                                </div>
+                            </div>
+                        ))}
+                    </div>
+                )}
+            </div>
+        </div>
+    );
+};
+
+export default Orders;
Index: kupi-mk/frontend/src/pages/ProductDetail.js
===================================================================
--- kupi-mk/frontend/src/pages/ProductDetail.js	(revision a50634e742db5be5422ca0b5c8ddead0ccf398f8)
+++ kupi-mk/frontend/src/pages/ProductDetail.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -1,13 +1,28 @@
-import React, { useState, useEffect } from 'react';
+import React, { useState, useEffect, useCallback } from 'react';
 import { useParams } from 'react-router-dom';
 import { useProducts } from '../context/ProductContext';
+import { useAuth } from '../context/AuthContext';
+import { useCart } from '../context/CartContext';
+import ReviewForm from '../components/ReviewForm';
+import ReviewList from '../components/ReviewList';
+import StarRating from '../components/StarRating';
+import api from '../services/api';
 
 const ProductDetail = () => {
   const { id } = useParams();
   const { fetchProduct } = useProducts();
+  const { isAuthenticated } = useAuth();
+  const { addToCart } = useCart();
   const [product, setProduct] = useState(null);
   const [loading, setLoading] = useState(true);
   const [currentImageIndex, setCurrentImageIndex] = useState(0);
   const [showShareMessage, setShowShareMessage] = useState(false);
+  const [quantity, setQuantity] = useState(1);
+  const [isAddingToCart, setIsAddingToCart] = useState(false);
+  const [reviews, setReviews] = useState([]);
+  const [reviewsLoading, setReviewsLoading] = useState(false);
+  const [showReviewForm, setShowReviewForm] = useState(false);
+  const [averageRating, setAverageRating] = useState(0);
+  const [totalReviews, setTotalReviews] = useState(0);
 
   const copyProductLink = () => {
@@ -29,4 +44,75 @@
   };
 
+  const handleAddToCart = async () => {
+    if (!isAuthenticated()) {
+      alert('Please log in to add items to cart');
+      return;
+    }
+    
+    if (!product || product.stock_quantity < quantity) {
+      alert('Not enough stock available');
+      return;
+    }
+    
+    setIsAddingToCart(true);
+    const result = await addToCart(product.id, quantity);
+    
+    if (result.success) {
+      alert(result.message || `${quantity} item(s) added to cart!`);
+    } else {
+      alert(result.message || 'Failed to add product to cart');
+    }
+    
+    setIsAddingToCart(false);
+  };
+
+  const handleQuantityChange = (newQuantity) => {
+    if (newQuantity >= 1 && newQuantity <= (product?.stock_quantity || 0)) {
+      setQuantity(newQuantity);
+    }
+  };
+
+  const fetchReviews = useCallback(async () => {
+    if (!id) return;
+    
+    setReviewsLoading(true);
+    try {
+      const response = await api.get(`/reviews/product/${id}`);
+      if (response.data.success) {
+        setReviews(response.data.reviews);
+        setAverageRating(response.data.averageRating || 0);
+        setTotalReviews(response.data.totalReviews || 0);
+      }
+    } catch (error) {
+      console.error('Error fetching reviews:', error);
+    } finally {
+      setReviewsLoading(false);
+    }
+  }, [id]);
+
+  const handleReviewAdded = (newReview) => {
+    setReviews(prev => [newReview, ...prev]);
+    setShowReviewForm(false);
+    setTotalReviews(prev => prev + 1);
+    // Recalculate average rating
+    const newAverage = (averageRating * totalReviews + newReview.rating) / (totalReviews + 1);
+    setAverageRating(newAverage);
+  };
+
+  const handleReviewUpdate = (updatedReview) => {
+    setReviews(prev => prev.map(review => 
+      review.id === updatedReview.id ? updatedReview : review
+    ));
+    // You might want to recalculate average rating here too
+    fetchReviews(); // Simple approach - refetch all reviews
+  };
+
+  const handleReviewDelete = (reviewId) => {
+    setReviews(prev => prev.filter(review => review.id !== reviewId));
+    setTotalReviews(prev => prev - 1);
+    // Recalculate average rating or refetch
+    fetchReviews();
+  };
+
   useEffect(() => {
     const loadProduct = async () => {
@@ -39,5 +125,6 @@
 
     loadProduct();
-  }, [id, fetchProduct]);
+    fetchReviews();
+  }, [id, fetchProduct, fetchReviews]);
 
   if (loading) {
@@ -178,4 +265,86 @@
               </div>
             </div>
+
+            {/* Add to Cart Section */}
+            {isAuthenticated() && (
+              <div className="bg-gray-50 p-4 rounded-lg space-y-4">
+                <h3 className="text-lg font-semibold text-gray-900">
+                  Додај во кошничка
+                </h3>
+                
+                {/* Stock Information */}
+                <div className="text-sm">
+                  {product.stock_quantity > 0 ? (
+                    <span className="text-green-600 font-medium">
+                      ✓ {product.stock_quantity} на залиха
+                    </span>
+                  ) : (
+                    <span className="text-red-600 font-medium">✗ Нема на залиха</span>
+                  )}
+                </div>
+                
+                {/* Quantity Selector */}
+                {product.stock_quantity > 0 && (
+                  <div className="flex items-center space-x-4">
+                    <label className="text-sm font-medium text-gray-700">
+                      Количина:
+                    </label>
+                    <div className="flex items-center border border-gray-300 rounded-md">
+                      <button
+                        onClick={() => handleQuantityChange(quantity - 1)}
+                        disabled={quantity <= 1}
+                        className="px-3 py-2 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed"
+                      >
+                        -
+                      </button>
+                      <span className="px-4 py-2 border-l border-r border-gray-300 min-w-[50px] text-center">
+                        {quantity}
+                      </span>
+                      <button
+                        onClick={() => handleQuantityChange(quantity + 1)}
+                        disabled={quantity >= product.stock_quantity}
+                        className="px-3 py-2 hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed"
+                      >
+                        +
+                      </button>
+                    </div>
+                    <span className="text-sm text-gray-500">
+                      (макс {product.stock_quantity})
+                    </span>
+                  </div>
+                )}
+                
+                {/* Add to Cart Button */}
+                <button
+                  onClick={handleAddToCart}
+                  disabled={isAddingToCart || product.stock_quantity < 1 || quantity < 1}
+                  className={`w-full py-3 px-6 rounded-lg font-bold transition-colors ${
+                    product.stock_quantity < 1
+                      ? 'bg-gray-300 text-gray-500 cursor-not-allowed'
+                      : isAddingToCart
+                      ? 'bg-blue-400 text-white cursor-not-allowed'
+                      : 'bg-blue-600 hover:bg-blue-700 text-white'
+                  }`}
+                >
+                  {isAddingToCart ? (
+                    <div className="flex items-center justify-center space-x-2">
+                      <div className="w-4 h-4 animate-spin border-2 border-white border-t-transparent rounded-full"></div>
+                      <span>Се додава...</span>
+                    </div>
+                  ) : product.stock_quantity < 1 ? (
+                    'Нема на залиха'
+                  ) : (
+                    `🛒 Додај ${quantity} во кошничка`
+                  )}
+                </button>
+                
+                {/* Total Price */}
+                {product.stock_quantity > 0 && (
+                  <div className="text-center text-lg font-semibold text-gray-900">
+                    Вкупно: {(parseFloat(product.price) * quantity).toLocaleString('mk-MK')} ден.
+                  </div>
+                )}
+              </div>
+            )}
 
             {/* Contact Buttons */}
@@ -232,4 +401,58 @@
         </div>
       </div>
+
+      {/* Reviews Section */}
+      <div className="mt-8 bg-white rounded-lg shadow-lg p-6">
+        <div className="flex items-center justify-between mb-6">
+          <div>
+            <h3 className="text-xl font-bold text-gray-900">Customer Reviews</h3>
+            <div className="flex items-center space-x-4 mt-2">
+              <div className="flex items-center space-x-2">
+                <StarRating rating={averageRating} readonly={true} showRatingText={false} />
+                <span className="text-sm text-gray-600">
+                  {averageRating > 0 ? averageRating.toFixed(1) : '0'} out of 5
+                </span>
+              </div>
+              <span className="text-sm text-gray-500">
+                ({totalReviews} {totalReviews === 1 ? 'review' : 'reviews'})
+              </span>
+            </div>
+          </div>
+          
+          {isAuthenticated() && (
+            <button
+              onClick={() => setShowReviewForm(!showReviewForm)}
+              className="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700"
+            >
+              {showReviewForm ? 'Cancel' : 'Write Review'}
+            </button>
+          )}
+        </div>
+
+        {/* Review Form */}
+        {showReviewForm && (
+          <div className="mb-6">
+            <ReviewForm
+              productId={product.id}
+              onReviewAdded={handleReviewAdded}
+              onCancel={() => setShowReviewForm(false)}
+            />
+          </div>
+        )}
+
+        {/* Reviews List */}
+        {reviewsLoading ? (
+          <div className="text-center py-8">
+            <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto"></div>
+            <p className="mt-2 text-gray-600">Loading reviews...</p>
+          </div>
+        ) : (
+          <ReviewList
+            reviews={reviews}
+            onReviewUpdate={handleReviewUpdate}
+            onReviewDelete={handleReviewDelete}
+          />
+        )}
+      </div>
     </div>
   );
Index: kupi-mk/frontend/src/pages/SellerDashboard.js
===================================================================
--- kupi-mk/frontend/src/pages/SellerDashboard.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
+++ kupi-mk/frontend/src/pages/SellerDashboard.js	(revision 737b1eda40c1dd27e47d79b1d5c1ff07d1dbdea8)
@@ -0,0 +1,340 @@
+// Seller Dashboard Page
+// - Purpose: provide a seller-only view of orders that include products from the authenticated seller
+// - Features:
+//   1) List orders filtered to this seller's products
+//   2) Show customer information and quick order summary
+//   3) Expand to view order items, shipping address, and notes
+//   4) Allow status updates (confirm, process, ship, deliver, cancel)
+
+import React, { useState, useEffect, useCallback } from 'react';
+import api from '../services/api';
+
+const SellerDashboard = () => {
+    // ----- Component state -----
+    // orders: list of orders returned from backend (already filtered to seller)
+    // loading / error: UI state for network requests
+    // filter: UI filter for order status
+    // expandedOrder: which order row is expanded to show details
+    const [orders, setOrders] = useState([]);
+    const [loading, setLoading] = useState(true);
+    const [error, setError] = useState(null);
+    const [filter, setFilter] = useState('all'); // all, pending, confirmed, processing, shipped, delivered, cancelled
+    const [expandedOrder, setExpandedOrder] = useState(null);
+
+    // ----- Fetch orders -----
+    // fetchAllOrders: calls `/orders/admin/all` and applies `filter` on the client side
+    const fetchAllOrders = useCallback(async () => {
+        try {
+            setLoading(true);
+            const response = await api.get('/orders/admin/all');
+            if (response.data.success) {
+                let filteredOrders = response.data.orders;
+                if (filter !== 'all') {
+                    filteredOrders = response.data.orders.filter(order => order.status === filter);
+                }
+                setOrders(filteredOrders);
+            } else {
+                setError('Failed to fetch orders');
+            }
+        } catch (error) {
+            console.error('Error fetching orders:', error);
+            setError('Failed to fetch orders');
+        } finally {
+            setLoading(false);
+        }
+    }, [filter]);
+
+    useEffect(() => {
+        fetchAllOrders();
+    }, [fetchAllOrders]);
+
+    // ----- Update order status -----
+    // handleUpdateOrderStatus: sends updated status to backend and refreshes order list
+    const handleUpdateOrderStatus = async (orderId, newStatus) => {
+        try {
+            const response = await api.put(`/orders/admin/${orderId}/status`, {
+                status: newStatus
+            });
+
+            if (response.data.success) {
+                fetchAllOrders(); // Refresh the list
+                alert(`Order #${orderId} status updated to ${newStatus}`);
+            } else {
+                alert(response.data.message || 'Failed to update order status');
+            }
+        } catch (error) {
+            console.error('Error updating order status:', error);
+            alert('Failed to update order status');
+        }
+    };
+
+    // ----- UI helpers -----
+    // getStatusColor: returns CSS classes for order status badge
+    const getStatusColor = (status) => {
+        switch (status.toLowerCase()) {
+            case 'pending':
+                return 'bg-yellow-100 text-yellow-800 border-yellow-200';
+            case 'confirmed':
+                return 'bg-blue-100 text-blue-800 border-blue-200';
+            case 'processing':
+                return 'bg-purple-100 text-purple-800 border-purple-200';
+            case 'shipped':
+                return 'bg-indigo-100 text-indigo-800 border-indigo-200';
+            case 'delivered':
+                return 'bg-green-100 text-green-800 border-green-200';
+            case 'cancelled':
+                return 'bg-red-100 text-red-800 border-red-200';
+            default:
+                return 'bg-gray-100 text-gray-800 border-gray-200';
+        }
+    };
+
+    // formatDate: formats date string to local date string
+    const formatDate = (dateString) => {
+        return new Date(dateString).toLocaleDateString('en-US', {
+            year: 'numeric',
+            month: 'short',
+            day: 'numeric',
+            hour: '2-digit',
+            minute: '2-digit'
+        });
+    };
+
+    // getAvailableStatuses: returns next possible statuses for an order based on its current status
+    const getAvailableStatuses = (currentStatus) => {
+        const statusFlow = {
+            'pending': ['confirmed', 'cancelled'],
+            'confirmed': ['processing', 'cancelled'],
+            'processing': ['shipped'],
+            'shipped': ['delivered'],
+            'delivered': [],
+            'cancelled': []
+        };
+        return statusFlow[currentStatus] || [];
+    };
+
+    // ----- Render -----
+    if (loading) {
+        return (
+            <div className="min-h-screen bg-gray-50 flex items-center justify-center">
+                <div className="text-center">
+                    <div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto"></div>
+                    <p className="mt-4 text-gray-600">Loading orders...</p>
+                </div>
+            </div>
+        );
+    }
+
+    if (error) {
+        return (
+            <div className="min-h-screen bg-gray-50 flex items-center justify-center">
+                <div className="text-center">
+                    <p className="text-red-600 mb-4">{error}</p>
+                    <button
+                        onClick={fetchAllOrders}
+                        className="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700"
+                    >
+                        Try Again
+                    </button>
+                </div>
+            </div>
+        );
+    }
+
+    return (
+        <div className="min-h-screen bg-gray-50 py-8">
+            <div className="max-w-7xl mx-auto px-4">
+                <div className="mb-8">
+                    <h1 className="text-3xl font-bold text-gray-800">Seller Dashboard</h1>
+                    <p className="text-gray-600 mt-2">Manage and track all customer orders</p>
+                </div>
+
+                {/* Filter Tabs */}
+                <div className="bg-white rounded-lg shadow-md mb-6">
+                    <div className="border-b border-gray-200">
+                        <nav className="flex space-x-8 px-6">
+                            {['all', 'pending', 'confirmed', 'processing', 'shipped', 'delivered', 'cancelled'].map((status) => (
+                                <button
+                                    key={status}
+                                    onClick={() => setFilter(status)}
+                                    className={`py-4 px-1 border-b-2 font-medium text-sm capitalize ${
+                                        filter === status
+                                            ? 'border-blue-500 text-blue-600'
+                                            : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'
+                                    }`}
+                                >
+                                    {status} ({orders.filter(order => status === 'all' || order.status === status).length})
+                                </button>
+                            ))}
+                        </nav>
+                    </div>
+                </div>
+
+                {/* Orders Table */}
+                <div className="bg-white rounded-lg shadow-md overflow-hidden">
+                    <div className="overflow-x-auto">
+                        <table className="min-w-full divide-y divide-gray-200">
+                            <thead className="bg-gray-50">
+                                <tr>
+                                    {/* Table header: basic order meta */}
+                                    <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
+                                        Order ID
+                                    </th>
+                                    <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
+                                        Customer
+                                    </th>
+                                    <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
+                                        Date
+                                    </th>
+                                    <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
+                                        Total
+                                    </th>
+                                    <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
+                                        Status
+                                    </th>
+                                    <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
+                                        Actions
+                                    </th>
+                                </tr>
+                            </thead>
+                            <tbody className="bg-white divide-y divide-gray-200">
+                                {orders.map((order) => (
+                                    <React.Fragment key={order.id}>
+                                        {/* Order row: summary information */}
+                                        <tr className="hover:bg-gray-50">
+                                            <td className="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
+                                                #{order.id}
+                                            </td>
+                                            <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
+                                                {/* Customer name, phone and email (from joined users table) */}
+                                                {order.first_name && order.last_name 
+                                                    ? `${order.first_name} ${order.last_name}` 
+                                                    : order.shipping_address?.fullName || 'N/A'}
+                                                <br />
+                                                <span className="text-xs text-gray-500">{order.phone}</span>
+                                                <br />
+                                                <span className="text-xs text-gray-400">{order.email}</span>
+                                            </td>
+                                            <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
+                                                {formatDate(order.created_at)}
+                                            </td>
+                                            <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
+                                                {parseFloat(order.total_amount || 0).toLocaleString('mk-MK')} ден.
+                                            </td>
+                                            <td className="px-6 py-4 whitespace-nowrap">
+                                                <span className={`inline-flex items-center px-3 py-1 rounded-full text-sm font-medium border ${getStatusColor(order.status)}`}>
+                                                    {order.status.charAt(0).toUpperCase() + order.status.slice(1)}
+                                                </span>
+                                            </td>
+                                            <td className="px-6 py-4 whitespace-nowrap text-sm font-medium space-x-2">
+                                                {/* Actions: seller can advance order status according to business rules */}
+                                                {getAvailableStatuses(order.status).map((nextStatus) => (
+                                                    <button
+                                                        key={nextStatus}
+                                                        onClick={() => handleUpdateOrderStatus(order.id, nextStatus)}
+                                                        className={`inline-flex items-center px-3 py-1 border border-transparent text-sm leading-5 font-medium rounded-md text-white ${
+                                                            nextStatus === 'cancelled' 
+                                                                ? 'bg-red-600 hover:bg-red-700' 
+                                                                : 'bg-blue-600 hover:bg-blue-700'
+                                                        } focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500`}
+                                                    >
+                                                        Mark as {nextStatus}
+                                                    </button>
+                                                ))}
+                                                
+                                                {/* Toggle expanded details inline instead of using alert() */}
+                                                <button
+                                                    onClick={() => setExpandedOrder(expandedOrder === order.id ? null : order.id)}
+                                                    className="inline-flex items-center px-3 py-1 border border-gray-300 text-sm leading-5 font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"
+                                                >
+                                                    {expandedOrder === order.id ? 'Hide Details' : 'View Details'}
+                                                </button>
+                                            </td>
+                                        </tr>
+                                        
+                                        {/* Expanded Order Details Row: displayed inline when the seller clicks View Details */}
+                                        {expandedOrder === order.id && (
+                                            <tr>
+                                                <td colSpan="6" className="px-6 py-4 bg-gray-50">
+                                                    <div className="space-y-4">
+                                                        {/* Order Items */}
+                                                        <div>
+                                                            <h4 className="font-semibold text-gray-800 mb-3">Order Items</h4>
+                                                            <div className="space-y-2">
+                                                                {order.order_items && order.order_items.map((item, index) => (
+                                                                    <div key={index} className="flex items-center space-x-4 bg-white p-3 rounded-md">
+                                                                        {item.image_url && (
+                                                                            <img 
+                                                                                src={`http://localhost:5001${item.image_url}`}
+                                                                                alt={item.product_title}
+                                                                                className="w-12 h-12 object-cover rounded-md"
+                                                                            />
+                                                                        )}
+                                                                        <div className="flex-1">
+                                                                            <p className="font-medium text-gray-800">{item.product_title}</p>
+                                                                            <p className="text-sm text-gray-600">
+                                                                                Quantity: {item.quantity} × {parseFloat(item.price_at_time || 0).toLocaleString('mk-MK')} ден.
+                                                                            </p>
+                                                                        </div>
+                                                                        <div className="text-right">
+                                                                            <p className="font-medium text-gray-800">
+                                                                                {(parseFloat(item.price_at_time || 0) * item.quantity).toLocaleString('mk-MK')} ден.
+                                                                            </p>
+                                                                        </div>
+                                                                    </div>
+                                                                ))}
+                                                            </div>
+                                                        </div>
+                                                        
+                                                        {/* Shipping Information */}
+                                                        {order.shipping_address && (
+                                                            <div>
+                                                                <h4 className="font-semibold text-gray-800 mb-2">Shipping Address</h4>
+                                                                <div className="bg-white p-3 rounded-md text-sm text-gray-700">
+                                                                    <p>{order.shipping_address.fullName}</p>
+                                                                    <p>{order.shipping_address.street}</p>
+                                                                    <p>{order.shipping_address.city}, {order.shipping_address.postalCode}</p>
+                                                                    <p>{order.shipping_address.country}</p>
+                                                                </div>
+                                                            </div>
+                                                        )}
+                                                        
+                                                        {/* Order Notes */}
+                                                        {order.notes && (
+                                                            <div>
+                                                                <h4 className="font-semibold text-gray-800 mb-2">Order Notes</h4>
+                                                                <div className="bg-white p-3 rounded-md text-sm text-gray-700">
+                                                                    {order.notes}
+                                                                </div>
+                                                            </div>
+                                                        )}
+                                                    </div>
+                                                </td>
+                                            </tr>
+                                        )}
+                                    </React.Fragment>
+                                ))}
+                            </tbody>
+                        </table>
+                    </div>
+
+                    {orders.length === 0 && (
+                        <div className="text-center py-12">
+                            <div className="mb-4">
+                                <svg className="mx-auto h-12 w-12 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
+                                    <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5H7a2 2 0 00-2 2v10a2 2 0 002 2h8a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
+                                </svg>
+                            </div>
+                            <h3 className="text-lg font-medium text-gray-900 mb-2">No orders found</h3>
+                            <p className="text-gray-600">
+                                {filter === 'all' ? 'No orders have been placed yet.' : `No ${filter} orders found.`}
+                            </p>
+                        </div>
+                    )}
+                </div>
+            </div>
+        </div>
+    );
+};
+
+export default SellerDashboard;
