12 ounces short pasta
4 tablespoons butter
1/2 yellow onion, chopped
2 cloves garlic, minced
4 tablespoons flour
2 1/2 cups milk
1/2 cup heavy whipping cream
1 cup parmesan cheese, shredded
1 cup sharp cheddar cheese, shredded
2 cups diced cooked ham
1/4 cup chopped fresh parsley
1/4 teaspoon ground nutmeg
1 teaspoon ground black pepper
Salt
Make the pasta: Bring a large pot of water to a boil on the stove. Salt the water liberally. Add pasta, stir and cook to al dente according to the package instructions. Drain and set aside, reserving 1/2 cup of the pasta water.
Make the béchamel sauce: Heat a large skillet to medium on the stove top. Add butter. Add onion and cook just until the onion begins to turn translucent; about 5 minutes. Add the flour and whisk constantly until the flour begins to turn a light tan color; about 2 minutes.
Add the milk and cream, about 1/2 cup at a time, whisking constantly. Let the mixture simmer (do not boil or you will scald the milk) until it thickens enough to coat the back off a spoon. This process should take about 5 minutes. Once the mixture has thickened, turn off the heat. Slowly stir in the garlic, nutmeg, pepper, 1/2 cup of the parmesan and 1/2 cup of the cheddar cheese. It's okay if the cheeses do not melt all the way; the sauce will come together in the oven.
Preheat your oven to 400 F. Coat an 9" x 9" glass baking dish liberally with cooking spray.
Add pasta to a large mixing bowl. Pour béchamel sauce over the pasta along with the ham. Fold gently to combine. Pour the pasta mixture into your baking dish. Sprinkle the rest of the parmesan and cheddar cheese on top.
Bake for 20 minutes, or until the cheese is melted and bubbling. Remove from the oven, garnish with parsley and serve.