In a large Dutch oven, combine beans and water to cover by 2 inches. Cover and let stand for 8 hours or overnight. Drain well and set beans aside.
In same pot, melt butter over medium heat. Add ham, and cook, stirring occasionally, until golden brown, 7 to 10 minutes. Using a slotted spoon, remove half of ham, drain on paper towels, and refrigerate.
Add onion, celery, and garlic to pot, and cook, stirring occasionally, until tender, 7 to 10 minutes. Stir in beans, broth, bay leaves, salt, and pepper. Increase heat to medium-high, and bring to a boil.
Cover, reduce heat, and simmer, stirring occasionally, until very tender, about 2 hours.
Top with reserved ham and serve.
