在观察者中将产品添加到购物车

I need to create a possibility for customers to offer a one product free of charge (as an example) in Magento shop. I figured out most of things from this post, but now I have one problem. I am created an Observer method that is executed on checkout_cart_product_add_after. And there I have some code (its just a part of whole thing):

    $productId = $observer->getProduct()->getId();
    $cartHelper = Mage::helper('checkout/cart');
    $items = $cartHelper->getCart()->getItems();
    Mage::getModel('core/session')->addNotice('Product id: '.$productId);
    foreach ($items as $item) {
         if ($item->getProduct()->getId() == $productId) {
              $itemId = $item->getItemId();
              $cart = $cartHelper->getCart()->removeItem($itemId)->save() ;//It WORKS!!!!!!!!!!!!
              $product = Mage::getModel('catalog/product')->load($productId);
              $cart->addProduct($product, $this->_getRequest()->getParams());                    
                    $cart->save();
                    Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
                    break;
                }
            }

So first of all my code adds a product to cart with 0.00 price (product as an example) based on some request parameters. Thats part works fine so it is not posted here. The second part (that I posted above) must delete an existing product and replace it with product with normal price. Almost everything works fine except one thing - the line $cart->addProduct($product, $this->_getRequest()->getParams()); don't work and I cant understand why (no errors, no exceptions, no logs). _getRequest method looks like this:

    protected function _getRequest()
    {
        return Mage::app()->getRequest();
    } 

And if I log an $this->_getRequest()->getParams() there is will be something like this:

    2012-04-09T14:46:56+00:00 DEBUG (7): Array(
    [uenc] => aHR0cDovL2xvY2FsaG9zdC93b3AvZmVhdHVyZWQvY2xhc3NpYy1saW5lLXBvbHkuaHRtbA,,
    [product] => 50
    [related_product] => 
    [bundle_option] => Array(
            [20] => 75
            [21] => 84
            [22] => 94
        )
    [qty] => 1
    [send-request] => 0
)

So why that $cart->addProduct($product, $this->_getRequest()->getParams()); will not work? How to do it right? Maybe it is better to use addAction() of Mage_Checkout_CartController (overwrite it)? Sorry for my language. Thanks for answers. Hope somebody can help me...

I'll answer my question to clarify things for anybody, who will stumble the same problem. The code:

$cart->addProduct($product, $this->_getRequest()->getParams());

will not work because I call $cart->save() before it and than tried to do the same after it and that was the problem. When I removed first $cart->save() it is worked just fine.