diff --git a/modules/game_minimap/minimap.lua b/modules/game_minimap/minimap.lua
index f4aec99d..03942525 100644
--- a/modules/game_minimap/minimap.lua
+++ b/modules/game_minimap/minimap.lua
@@ -4,7 +4,7 @@ Minimap = {}
 local minimapWidget
 local minimapButton
 local minimapWindow
-local DEFAULT_ZOOM = 45
+local DEFAULT_ZOOM = 60
 minimapFirstLoad = true
 
 -- private functions
@@ -31,15 +31,15 @@ function onMinimapMouseWheel(self, mousePos, direction)
 end
 
 --[[
-  Known Issue (TODO): 
-  If you move the minimap compass directions and 
+  Known Issue (TODO):
+  If you move the minimap compass directions and
   you change floor it will not update the minimap.
 ]]
 -- public functions
 function Minimap.init()
   connect(g_game, { onGameStart = Minimap.reset,
                     onForceWalk = Minimap.center })
-                    
+
   g_keyboard.bindKeyDown('Ctrl+M', Minimap.toggle)
 
   minimapButton = TopMenu.addRightGameToggleButton('minimapButton', tr('Minimap') .. ' (Ctrl+M)', 'minimap.png', Minimap.toggle)
@@ -79,7 +79,7 @@ end
 function Minimap.terminate()
   disconnect(g_game, { onGameStart = Minimap.reset,
                        onForceWalk = Minimap.center })
-                       
+
   g_keyboard.unbindKeyDown('Ctrl+M')
 
   minimapButton:destroy()
@@ -105,30 +105,28 @@ function Minimap.onMiniWindowClose()
 end
 
 function Minimap.isClickInRange(position, fromPosition, toPosition)
-	return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.x <= toPosition.x and position.y <= toPosition.y)
+  return (position.x >= fromPosition.x and position.y >= fromPosition.y and position.x <= toPosition.x and position.y <= toPosition.y)
 end
+
 -- hooked functions
-local compassZones = {}
-compassZones.west = {x = 0, y = 30, posx = -1, posy = 0}
-compassZones.north = {x = 30, y = 0, posx = 0, posy = -1}
-compassZones.south = {x = 30, y = 57, posx = 0, posy = 1}
-compassZones.east = {x = 57, y = 30, posx = 1, posy = 0}
 function Minimap.compassClick(self, mousePos)
-  local compassPos = self:getRect()
-  local pos = {x = mousePos.x-compassPos.x, y = mousePos.y-compassPos.y}
-  local move = {x = 0, y = 0}
-  for i,v in pairs(compassZones) do
-    local lowPos = {x = v.x-15, y = v.y-15}
-    local highPos = {x = v.x+15, y = v.y+15}
-    if Minimap.isClickInRange(pos, lowPos, highPos) then
-      move.x = move.x + v.posx * minimapWidget:getZoom()/10
-      move.y = move.y + v.posy * minimapWidget:getZoom()/10
-      break
-    end
-  end
+  local px = mousePos.x - self:getX()
+  local py = mousePos.y - self:getY()
+  local dx = px - self:getWidth()/2
+  local dy = -(py - self:getHeight()/2)
+  local radius = math.sqrt(dx*dx+dy*dy)
+  local movex=0
+  local movey=0
+  dx = dx/radius
+  dy = dy/radius
+
+  if dx > 0.5 then movex = 1 end
+  if dx < -0.5 then movex = -1 end
+  if dy > 0.5 then movey = -1 end
+  if dy < -0.5 then movey = 1 end
 
   local cameraPos = minimapWidget:getCameraPosition()
-  local pos = {x = cameraPos.x + move.x, y = cameraPos.y + move.y, z = cameraPos.z}
+  local pos = {x = cameraPos.x + movex, y = cameraPos.y + movey, z = cameraPos.z}
   minimapWidget:setCameraPosition(pos)
 end
 
diff --git a/modules/game_minimap/minimap.otui b/modules/game_minimap/minimap.otui
index cd06b3b4..6f87e3af 100644
--- a/modules/game_minimap/minimap.otui
+++ b/modules/game_minimap/minimap.otui
@@ -1,27 +1,24 @@
 MapControl < Button
-  size: 16 16
+  size: 20 20
 
   $pressed:
-    image-clip: 0 0 16 16
+    icon-clip: 0 0 16 16
 
   $hover !pressed:
-    image-clip: 0 16 16 16
+    icon-clip: 0 16 16 16
 
   $!pressed !hover:
-    image-clip: 0 32 16 16
-
-  $disabled:
-    image-color: #ffffff88
+    icon-clip: 0 32 16 16
 
 FloorUpControl < MapControl
-  image-source: /game_minimap/floor_up.png
-  
+  icon-source: /game_minimap/floor_up.png
+
 FloorDownControl < MapControl
-  image-source: /game_minimap/floor_down.png
-  
+  icon-source: /game_minimap/floor_down.png
+
 //ZoomOutControl < MapControl
   //image-source: /game_minimap/zoom_out.png
-  
+
 //ZoomInControl < MapControl
   //image-source: /game_minimap/zoom_in.png
 
@@ -37,81 +34,78 @@ MiniWindow
     padding: 3
     UIMap
       id: minimap
-      anchors.left: parent.left
-      anchors.top: parent.top
-      size: 110 110
-      
+      anchors.fill: parent
+
     UIButton
       id: compass
       image-source: /game_minimap/compass.png
+      image-smooth: true
       color: #ffffff
-      anchors.left: minimap.right
-      anchors.top: minimap.top
-      size: 60 60
-      margin-top: 3
-      margin-left: 5
+      anchors.left: parent.left
+      anchors.top: parent.top
+      size: 48 48
+      margin-top: 4
+      margin-left: 4
       @onClick: function(...) Minimap.compassClick(...) end
-      
+
     UIButton
       id: compassReset
-      text: Reset
+      text: R
       font: verdana-11px-rounded
-      anchors.left: compass.left
-      anchors.top: compass.top
-      margin-top: 25
-      margin-left: 14
+      anchors.centerIn: compass
+      margin-top: 2
+      margin-right: 1
       @onClick: function(...) Minimap.center(...) end
       $pressed:
         color: #eb9f4f88
-        margin-top: 26
-        margin-left: 15
 
       $hover !pressed:
         color: #eb9f4f
 
       $!pressed !hover:
         color: #ffffff
-        margin-top: 25
-        margin-left: 14
 
       $disabled:
         image-color: #ffffff88
-        
+
     FloorUpControl
       id: floorUp
-      anchors.left: minimap.right
-      anchors.top: compass.bottom
-      margin-top: 10
-      margin-left: 15
+      anchors.right: parent.right
+      anchors.bottom: parent.bottom
+      margin-right: 28
+      margin-bottom: 28
       enabled: true
       @onClick: Minimap.onButtonClick(self:getId())
-      
+
     FloorDownControl
       id: floorDown
-      anchors.left: floorUp.left
-      anchors.top: floorUp.bottom
-      margin-top: 4
+      anchors.right: parent.right
+      anchors.bottom: parent.bottom
+      margin-right: 28
+      margin-bottom: 4
       enabled: true
       @onClick: Minimap.onButtonClick(self:getId())
-      
+
     Button
       id: zoomIn
       text: +
-      size: 16 16
-      anchors.left: floorUp.right
-      anchors.top: floorUp.top
-      margin-left: 10
+      size: 20 20
+      anchors.right: parent.right
+      anchors.bottom: parent.bottom
+      margin-right: 4
+      margin-bottom: 28
       enabled: true
       @onClick: Minimap.onButtonClick(self:getId())
-      
+
     Button
       id: zoomOut
       text: -
       font: terminus-14px-bold
-      size: 16 16
-      anchors.left: floorDown.right
-      anchors.top: floorDown.top
-      margin-left: 10
+      size: 20 20
+      anchors.right: parent.right
+      anchors.bottom: parent.bottom
+      margin-right: 4
+      margin-bottom: 4
       enabled: true
       @onClick: Minimap.onButtonClick(self:getId())
-      
+
diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp
index 1daf538a..a425c78f 100644
--- a/src/framework/luafunctions.cpp
+++ b/src/framework/luafunctions.cpp
@@ -218,6 +218,7 @@ void Application::registerLuaFunctions()
     g_lua.bindClassMemberFunction<UIWidget>("setIconHeight", &UIWidget::setIconHeight);
     g_lua.bindClassMemberFunction<UIWidget>("setIconSize", &UIWidget::setIconSize);
     g_lua.bindClassMemberFunction<UIWidget>("setIconRect", &UIWidget::setIconRect);
+    g_lua.bindClassMemberFunction<UIWidget>("setIconClip", &UIWidget::setIconClip);
     g_lua.bindClassMemberFunction<UIWidget>("setBorderWidth", &UIWidget::setBorderWidth);
     g_lua.bindClassMemberFunction<UIWidget>("setBorderWidthTop", &UIWidget::setBorderWidthTop);
     g_lua.bindClassMemberFunction<UIWidget>("setBorderWidthRight", &UIWidget::setBorderWidthRight);
@@ -267,6 +268,7 @@ void Application::registerLuaFunctions()
     g_lua.bindClassMemberFunction<UIWidget>("getIconHeight", &UIWidget::getIconHeight);
     g_lua.bindClassMemberFunction<UIWidget>("getIconSize", &UIWidget::getIconSize);
     g_lua.bindClassMemberFunction<UIWidget>("getIconRect", &UIWidget::getIconRect);
+    g_lua.bindClassMemberFunction<UIWidget>("getIconClip", &UIWidget::getIconClip);
     g_lua.bindClassMemberFunction<UIWidget>("getBorderTopColor", &UIWidget::getBorderTopColor);
     g_lua.bindClassMemberFunction<UIWidget>("getBorderRightColor", &UIWidget::getBorderRightColor);
     g_lua.bindClassMemberFunction<UIWidget>("getBorderBottomColor", &UIWidget::getBorderBottomColor);
diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h
index e9c50ac8..90aa2bad 100644
--- a/src/framework/ui/uiwidget.h
+++ b/src/framework/ui/uiwidget.h
@@ -278,6 +278,7 @@ protected:
     TexturePtr m_icon;
     Color m_iconColor;
     Rect m_iconRect;
+    Rect m_iconClipRect;
     EdgeGroup<Color> m_borderColor;
     EdgeGroup<int> m_borderWidth;
     EdgeGroup<int> m_margin;
@@ -311,6 +312,7 @@ public:
     void setIconHeight(int height) { m_iconRect.setHeight(height); }
     void setIconSize(const Size& size) { m_iconRect.resize(size); }
     void setIconRect(const Rect& rect) { m_iconRect = rect; }
+    void setIconClip(const Rect& rect) { m_iconClipRect = rect; }
     void setBorderWidth(int width) { m_borderWidth.set(width); updateLayout(); }
     void setBorderWidthTop(int width) { m_borderWidth.top = width; }
     void setBorderWidthRight(int width) { m_borderWidth.right = width; }
@@ -361,6 +363,7 @@ public:
     int getIconHeight() { return m_iconRect.height(); }
     Size getIconSize() { return m_iconRect.size(); }
     Rect getIconRect() { return m_iconRect; }
+    Rect getIconClip() { return m_iconClipRect; }
     Color getBorderTopColor() { return m_borderColor.top; }
     Color getBorderRightColor() { return m_borderColor.right; }
     Color getBorderBottomColor() { return m_borderColor.bottom; }
diff --git a/src/framework/ui/uiwidgetbasestyle.cpp b/src/framework/ui/uiwidgetbasestyle.cpp
index edc6ab90..2126c624 100644
--- a/src/framework/ui/uiwidgetbasestyle.cpp
+++ b/src/framework/ui/uiwidgetbasestyle.cpp
@@ -100,6 +100,8 @@ void UIWidget::parseBaseStyle(const OTMLNodePtr& styleNode)
             setIconSize(node->value<Size>());
         else if(node->tag() == "icon-rect")
             setIconRect(node->value<Rect>());
+        else if(node->tag() == "icon-clip")
+            setIconClip(node->value<Rect>());
         else if(node->tag() == "opacity")
             setOpacity(node->value<float>());
         else if(node->tag() == "enabled")
@@ -369,15 +371,17 @@ void UIWidget::drawIcon(const Rect& screenCoords)
             drawRect.translate(m_iconRect.topLeft());
             drawRect.resize(m_iconRect.size());
         } else {
-            drawRect.resize(m_icon->getSize());
+            drawRect.resize(m_iconClipRect.size());
             drawRect.moveCenter(screenCoords.center());
         }
         g_painter->setColor(m_iconColor);
-        g_painter->drawTexturedRect(drawRect, m_icon);
+        g_painter->drawTexturedRect(drawRect, m_icon, m_iconClipRect);
     }
 }
 
 void UIWidget::setIcon(const std::string& iconFile)
 {
     m_icon = g_textures.getTexture(iconFile);
+    if(!m_iconClipRect.isValid())
+        m_iconClipRect = Rect(0, 0, m_icon->getSize());
 }