diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 392e26f4960a1e0556df6f42bdfbb00a774d22a1..7fc6a6de8dbe62ea84e26662e671e964b3bd21c4 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -103,7 +103,11 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p)
 	mPadTop(p.pad_top),
 	mPadBottom(p.pad_bottom),
 	mPadBetween(p.pad_between),
-	mPopupMenuHandle()
+	mPopupMenuHandle(),
+	mStartDragItemCallback(NULL),
+	mHandleDragItemCallback(NULL),
+	mHandleDropCallback(NULL),
+	mDragAndDropTarget(false)
 {
 	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text;
 	mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon;
@@ -253,7 +257,7 @@ bool LLToolBar::removeCommand(const LLCommandId& commandId)
 	mButtons.erase(it_button);
 
 	mNeedsLayout = true;
-
+	
 	return true;
 }
 
@@ -635,8 +639,6 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
 		cbParam.parameter = commandp->executeParameters();
 
 		button->setCommitCallback(cbParam);
-		button->setStartDragCallback(mStartDragItemCallback);
-		button->setHandleDragCallback(mHandleDragItemCallback);
 
 		const std::string& isEnabledFunction = commandp->isEnabledFunctionName();
 		if (isEnabledFunction.length() > 0)
@@ -671,6 +673,10 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
 		}
 	}
 
+	// Drag and drop behavior must work also if provided in the Toybox and, potentially, any read-only toolbar
+	button->setStartDragCallback(mStartDragItemCallback);
+	button->setHandleDragCallback(mHandleDragItemCallback);
+
 	button->setCommandId(id);
 
 	return button;
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index ac99e23aaef161a3a8a4a1c8d17137e675e48c7f..3fbe5a7703b9a9e86d091d690e758e9f1b280c3b 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -75,7 +75,7 @@ class LLToolBarButton : public LLButton
 	S32				mMouseDownY;
 	LLUI::RangeS32	mWidthRange;
 	S32				mDesiredHeight;
-	bool						mIsDragged;
+	bool							mIsDragged;
 	tool_startdrag_callback_t		mStartDragItemCallback;
 	tool_handledrag_callback_t		mHandleDragItemCallback;
 
@@ -159,7 +159,7 @@ class LLToolBar
 								   void* cargo_data,
 								   EAcceptance* accept,
 								   std::string& tooltip_msg);
-
+	
 	bool addCommand(const LLCommandId& commandId, int rank = -1);
 	bool removeCommand(const LLCommandId& commandId);
 	bool hasCommand(const LLCommandId& commandId) const;
@@ -168,6 +168,7 @@ class LLToolBar
 	void setStartDragCallback(tool_startdrag_callback_t cb)   { mStartDragItemCallback  = cb; }
 	void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
 	void setHandleDropCallback(tool_handledrop_callback_t cb) { mHandleDropCallback     = cb; }
+	bool isReadOnly() const { return mReadOnly; }
 
 	LLToolBarButton* createButton(const LLCommandId& id);
 
@@ -180,7 +181,7 @@ class LLToolBar
 	tool_startdrag_callback_t		mStartDragItemCallback;
 	tool_handledrag_callback_t		mHandleDragItemCallback;
 	tool_handledrop_callback_t		mHandleDropCallback;
-	bool						mDragAndDropTarget;
+	bool							mDragAndDropTarget;
 
 public:
 	// Methods used in loading and saving toolbar settings
diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp
index cf22e071aaf7f949b01b460a22942f8ce6e2b52b..58bb417b71f74bafd156f4f896217fb6bd749fde 100644
--- a/indra/newview/llfloatertoybox.cpp
+++ b/indra/newview/llfloatertoybox.cpp
@@ -62,7 +62,10 @@ BOOL LLFloaterToybox::postBuild()
 
 	mBtnRestoreDefaults = getChild<LLButton>("btn_restore_defaults");
 	mToolBar = getChild<LLToolBar>("toybox_toolbar");
-
+	mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragItem,_1,_2,_3));
+	mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragItem,_1,_2,_3,_4));
+	mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDrop,_1,_2,_3,_4));
+	
 	LLCommandManager& cmdMgr = LLCommandManager::instance();
 
 	//
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index 5f3e3860355cd8fb4d82bb4737d917e254532782..c0408e4850d63fa8312b8f8bc172cd90de846268 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -377,24 +377,26 @@ BOOL LLToolBarView::handleDrop( void* cargo_data, S32 x, S32 y, LLToolBar* toolb
 		if (command)
 		{
 			// Convert the (x,y) position in rank in toolbar
-			int rank = toolbar->getRankFromPosition(x,y);
+			int rank = 0;
+			if (!toolbar->isReadOnly())
+			{
+				rank = toolbar->getRankFromPosition(x,y);
+			}
 			// Suppress the command from the toolbars (including the one it's dropped in, 
 			// this will handle move position).
 			gToolBarView->mToolbarLeft->removeCommand(command->id());
 			gToolBarView->mToolbarRight->removeCommand(command->id());
 			gToolBarView->mToolbarBottom->removeCommand(command->id());
 			// Now insert it in the toolbar at the detected rank
-			toolbar->addCommand(command->id(),rank);
+			if (!toolbar->isReadOnly())
+			{
+				toolbar->addCommand(command->id(),rank);
+			}
 		}
 		else
 		{
 			llwarns << "Command couldn't be found in command manager" << llendl;
 		}
-
-	}
-	else
-	{
-		llinfos << "Merov debug : handleDrop. Drop source is not a widget -> nothing to do" << llendl;
 	}
 	
 	return TRUE;