diff -rup clean-unity-5.10.0/debian/changelog unity-5.10.0/debian/changelog
--- clean-unity-5.10.0/debian/changelog	2012-04-27 23:11:36.000000000 +0100
+++ unity-5.10.0/debian/changelog	2012-04-27 23:05:37.124817661 +0100
@@ -1,3 +1,9 @@
+unity (5.10.0-0ubuntu6+ojno1) precise; urgency=low
+
+  * Re-apply minimize on click patch
+
+ -- Jonathan French (Launchpad) <me@jonathanfrench.net>  Wed, 27 Apr 2012 23:05:24 +0100
+
 unity (5.10.0-0ubuntu6) precise-proposed; urgency=low
 
   * Cherry-picked upstream:
Only in unity-5.10.0/debian: changelog~
diff -rup clean-unity-5.10.0/plugins/unityshell/src/BamfLauncherIcon.cpp unity-5.10.0/plugins/unityshell/src/BamfLauncherIcon.cpp
--- clean-unity-5.10.0/plugins/unityshell/src/BamfLauncherIcon.cpp	2012-04-27 23:11:36.000000000 +0100
+++ unity-5.10.0/plugins/unityshell/src/BamfLauncherIcon.cpp	2012-04-27 23:14:19.038256323 +0100
@@ -251,7 +251,8 @@ void BamfLauncherIcon::ActivateLauncherI
 
   /* Behaviour:
    * 1) Nothing running, or nothing visible -> launch application
-   * 2) Running and active -> spread application
+   * 2a) Running and active with more than one window -> spread application
+   * 2b) Running and active with only one window -> minimize application
    * 3) Running and not active -> focus application
    * 4) Spread is active and different icon pressed -> change spread
    * 5) Spread is active -> Spread de-activated, and fall through
@@ -283,7 +284,11 @@ void BamfLauncherIcon::ActivateLauncherI
       {
         if (arg.source != ActionArg::SWITCHER)
         {
-          Spread(true, 0, false);
+          std::vector<Window> windowList = GetWindows(WindowFilter::MAPPED|WindowFilter::ON_CURRENT_DESKTOP);
+          if (windowList.size() == 1)
+            Minimize(windowList);
+          else if (windowList.size() > 1)
+            Spread(windowList, 0, false);
         }
       }
     }
@@ -294,7 +299,7 @@ void BamfLauncherIcon::ActivateLauncherI
         wm->TerminateScale();
         Focus(arg);
         if (arg.source != ActionArg::SWITCHER)
-          Spread(true, 0, false);
+          Spread(GetWindows(WindowFilter::MAPPED|WindowFilter::ON_CURRENT_DESKTOP), 0, false);
       }
       else // #3 above
       {
@@ -633,12 +638,17 @@ void BamfLauncherIcon::Focus(ActionArg a
   wm->FocusWindowGroup(windows, visibility, arg.monitor);
 }
 
-bool BamfLauncherIcon::Spread(bool current_desktop, int state, bool force)
+bool BamfLauncherIcon::Spread(std::vector<Window> windows, int state, bool force)
 {
-  auto windows = GetWindows(current_desktop ? WindowFilter::ON_CURRENT_DESKTOP : 0);
   return WindowManager::Default()->ScaleWindowGroup(windows, state, force);
 }
 
+void BamfLauncherIcon::Minimize(std::vector<Window> windowList)
+{
+  for (unsigned int i = 0; i < windowList.size(); i++)
+    WindowManager::Default()->Minimize(windowList[i]);
+}
+
 void BamfLauncherIcon::EnsureWindowState()
 {
   GList* children, *l;
@@ -846,6 +856,30 @@ void BamfLauncherIcon::EnsureMenuItemsRe
 
   dbusmenu_menuitem_property_set(_menu_items["Pin"], DBUSMENU_MENUITEM_PROP_LABEL, label);
 
+  /* Minimize */
+  if (_menu_items.find("Minimize") == _menu_items.end())
+  {
+    menu_item = dbusmenu_menuitem_new();
+    dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Minimize"));
+    dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
+    dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
+    
+    _gsignals.Add(new glib::Signal<void, DbusmenuMenuitem*, int>(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
+                                    [&] (DbusmenuMenuitem*, int) {
+                                      Minimize(GetWindows(WindowFilter::MAPPED|WindowFilter::ON_CURRENT_DESKTOP));
+                                    }));
+    _menu_items["Minimize"] = glib::Object<DbusmenuMenuitem>(menu_item);
+  }
+  
+  bool any_not_minimized = false;
+  WindowManager *wm = WindowManager::Default();
+  std::vector<Window> windowList = GetWindows(WindowFilter::MAPPED|WindowFilter::USER_VISIBLE|WindowFilter::ON_CURRENT_DESKTOP);
+  for (auto it = windowList.begin(); it != windowList.end(); ++it)
+  {
+    if (!wm->IsWindowMinimized(*it)) any_not_minimized = true;
+  }
+  
+  dbusmenu_menuitem_property_set_bool(_menu_items["Minimize"], DBUSMENU_MENUITEM_PROP_ENABLED, IsVisible() && any_not_minimized); 
 
   /* Quit */
   if (_menu_items.find("Quit") == _menu_items.end())
@@ -987,7 +1021,7 @@ std::list<DbusmenuMenuitem*> BamfLaunche
 
   for (auto it_m = _menu_items.begin(); it_m != _menu_items.end(); ++it_m)
   {
-    if (!IsRunning() && it_m->first == "Quit")
+    if (!IsRunning() && (it_m->first == "Quit" || it_m->first == "Minimize"))
       continue;
 
     bool exists = false;
Only in unity-5.10.0/plugins/unityshell/src: BamfLauncherIcon.cpp~
diff -rup clean-unity-5.10.0/plugins/unityshell/src/BamfLauncherIcon.h unity-5.10.0/plugins/unityshell/src/BamfLauncherIcon.h
--- clean-unity-5.10.0/plugins/unityshell/src/BamfLauncherIcon.h	2012-04-12 14:21:21.000000000 +0100
+++ unity-5.10.0/plugins/unityshell/src/BamfLauncherIcon.h	2012-04-27 23:03:06.626709682 +0100
@@ -106,7 +106,8 @@ private:
 
   void OpenInstanceWithUris(std::set<std::string> uris);
   void Focus(ActionArg arg);
-  bool Spread(bool current_desktop, int state, bool force);
+  bool Spread(std::vector<Window> windowList, int state, bool force);
+  void Minimize(std::vector<Window> windowList);
 
   void OnWindowMinimized(guint32 xid);
   void OnWindowMoved(guint32 xid);
diff -rup clean-unity-5.10.0/plugins/unityshell/src/PluginAdapter.cpp unity-5.10.0/plugins/unityshell/src/PluginAdapter.cpp
--- clean-unity-5.10.0/plugins/unityshell/src/PluginAdapter.cpp	2012-04-27 23:11:36.000000000 +0100
+++ unity-5.10.0/plugins/unityshell/src/PluginAdapter.cpp	2012-04-27 23:03:06.626709682 +0100
@@ -415,6 +415,21 @@ PluginAdapter::IsWindowMaximized(guint x
 }
 
 bool
+PluginAdapter::IsWindowMinimized(guint xid)
+{
+  Window win = (Window)xid;
+  CompWindow* window;
+  
+  window = m_Screen->findWindow(win);
+  if (window)
+  {
+    return window->minimized();
+  }
+  
+  return false;
+}
+
+bool
 PluginAdapter::IsWindowDecorated(guint32 xid)
 {
   Display* display = m_Screen->dpy();
diff -rup clean-unity-5.10.0/plugins/unityshell/src/PluginAdapter.h unity-5.10.0/plugins/unityshell/src/PluginAdapter.h
--- clean-unity-5.10.0/plugins/unityshell/src/PluginAdapter.h	2012-04-27 23:11:36.000000000 +0100
+++ unity-5.10.0/plugins/unityshell/src/PluginAdapter.h	2012-04-27 23:03:06.626709682 +0100
@@ -116,6 +116,7 @@ public:
 
   // WindowManager implementation
   bool IsWindowMaximized(guint xid);
+  bool IsWindowMinimized(guint xid);
   bool IsWindowDecorated(guint xid);
   bool IsWindowOnCurrentDesktop(guint xid);
   bool IsWindowObscured(guint xid);
diff -rup clean-unity-5.10.0/plugins/unityshell/src/WindowManager.cpp unity-5.10.0/plugins/unityshell/src/WindowManager.cpp
--- clean-unity-5.10.0/plugins/unityshell/src/WindowManager.cpp	2012-04-27 23:11:36.000000000 +0100
+++ unity-5.10.0/plugins/unityshell/src/WindowManager.cpp	2012-04-27 23:03:06.630709632 +0100
@@ -52,6 +52,11 @@ class WindowManagerDummy : public Window
   {
     return false;
   }
+  
+  bool IsWindowMinimized(guint32 xid)
+  {
+    return false;
+  }
 
   bool IsWindowDecorated(guint32 xid)
   {
diff -rup clean-unity-5.10.0/plugins/unityshell/src/WindowManager.h unity-5.10.0/plugins/unityshell/src/WindowManager.h
--- clean-unity-5.10.0/plugins/unityshell/src/WindowManager.h	2012-04-27 23:11:36.000000000 +0100
+++ unity-5.10.0/plugins/unityshell/src/WindowManager.h	2012-04-27 23:03:06.630709632 +0100
@@ -58,6 +58,7 @@ public:
   virtual guint32 GetActiveWindow() = 0;
 
   virtual bool IsWindowMaximized(guint32 xid) = 0;
+  virtual bool IsWindowMinimized(guint xid) = 0;
   virtual bool IsWindowDecorated(guint32 xid) = 0;
   virtual bool IsWindowOnCurrentDesktop(guint32 xid) = 0;
   virtual bool IsWindowObscured(guint32 xid) = 0;
