diff --git a/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java b/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java
index bf3754b..845ee54 100644
--- a/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java
+++ b/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java
@@ -685,6 +685,12 @@
         private boolean showBadPatches;
 
         private JPanel helpPanel;
+        private boolean drawingLine;
+        private int lineFromX;
+        private int lineFromY;
+        private int lineToX;
+        private int lineToY;
+        private boolean showDrawingLine;
 
         ImageViewer() {
             setLayout(new GridBagLayout());
@@ -735,7 +741,12 @@
                     // changed state).
                     currentButton = event.isShiftDown() ? MouseEvent.BUTTON3 : event.getButton();
                     currentButton = event.isControlDown() ? MouseEvent.BUTTON2 : currentButton;
-                    paint(event.getX(), event.getY(), currentButton);
+                    startDrawingLine(event.getX(), event.getY(), currentButton);
+                }
+
+                @Override
+                public void mouseReleased(MouseEvent event) {
+                    endDrawingLine();
                 }
             });
             addMouseMotionListener(new MouseMotionAdapter() {
@@ -743,7 +754,8 @@
                 public void mouseDragged(MouseEvent event) {
                     if (!checkLockedRegion(event.getX(), event.getY())) {
                         // use the stored button, see note above
-                        paint(event.getX(), event.getY(),  currentButton);
+
+                        moveLine(event.getX(), event.getY());
                     }
                 }
 
@@ -754,7 +766,7 @@
             });
             Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
                 public void eventDispatched(AWTEvent event) {
-                    enableEraseMode((KeyEvent) event);                    
+                    enableEraseMode((KeyEvent) event);
                 }
             }, AWTEvent.KEY_EVENT_MASK);
 
@@ -857,21 +869,34 @@
             }
         }
 
-        private void paint(int x, int y, int button) {
-            int color;
-            switch (button) {
-                case MouseEvent.BUTTON1:
-                    color = BLACK_TICK;
-                    break;
-                case MouseEvent.BUTTON2:
-                    color = RED_TICK;
-                    break;
-                case MouseEvent.BUTTON3:
-                    color = 0;
-                    break;
-                default:
-                    return;
+        private void startDrawingLine(int x, int y, int button) {
+            int left = (getWidth() - size.width) / 2;
+            int top = helpPanel.getHeight() + (getHeight() - size.height) / 2;
+
+            x = (x - left) / zoom;
+            y = (y - top) / zoom;
+
+            int width = image.getWidth();
+            int height = image.getHeight();
+            if (((x == 0 || x == width - 1) && (y > 0 && y < height - 1))
+                    || ((x > 0 && x < width - 1) && (y == 0 || y == height - 1))) {
+                drawingLine = true;
+                lineFromX = x;
+                lineFromY = y;
+                lineToX = x;
+                lineToY = y;
+
+                showDrawingLine = true;
+
+                showCursor = false;
+
+                repaint();
             }
+        }
+
+        private void moveLine(int x, int y) {
+            if (drawingLine == false)
+                return;
 
             int left = (getWidth() - size.width) / 2;
             int top = helpPanel.getHeight() + (getHeight() - size.height) / 2;
@@ -881,16 +906,74 @@
 
             int width = image.getWidth();
             int height = image.getHeight();
-            if (((x == 0 || x == width - 1) && (y > 0 && y < height - 1)) ||
-                    ((x > 0 && x < width - 1) && (y == 0 || y == height - 1))) {
-                image.setRGB(x, y, color);
-                findPatches();
-                stretchesViewer.computePatches();
-                if (showBadPatches) {
-                    findBadPatches();
+
+            showDrawingLine = false;
+
+            if (((x == lineFromX) && (y > 0 && y < height - 1))
+                    || ((x > 0 && x < width - 1) && (y == lineFromY))) {
+                if (x == lineFromX || y == lineFromY) {
+                    lineToX = x;
+                    lineToY = y;
+
+                    showDrawingLine = true;
                 }
-                repaint();
             }
+
+            repaint();
+        }
+
+        private void endDrawingLine() {
+            if (drawingLine == false)
+                return;
+
+            drawingLine = false;
+
+            if (showDrawingLine == false)
+                return;
+
+            int color;
+            switch (currentButton) {
+            case MouseEvent.BUTTON1:
+                color = BLACK_TICK;
+                break;
+            case MouseEvent.BUTTON2:
+                color = RED_TICK;
+                break;
+            case MouseEvent.BUTTON3:
+                color = 0;
+                break;
+            default:
+                return;
+            }
+
+            int x = lineFromX;
+            int y = lineFromY;
+
+            int dx = 0;
+            int dy = 0;
+
+            if (lineToX != lineFromX)
+                dx = lineToX > lineFromX ? 1 : -1;
+            else if (lineToY != lineFromY)
+                dy = lineToY > lineFromY ? 1 : -1;
+
+            do {
+                image.setRGB(x, y, color);
+
+                if (x == lineToX && y == lineToY)
+                    break;
+
+                x += dx;
+                y += dy;
+            } while (true);
+
+            findPatches();
+            stretchesViewer.computePatches();
+            if (showBadPatches) {
+                findBadPatches();
+            }
+
+            repaint();
         }
 
         private boolean checkLockedRegion(int x, int y) {
@@ -915,8 +998,10 @@
             locked = x > 0 && x < width - 1 && y > 0 && y < height - 1;
 
             boolean previousCursor = showCursor;
-            showCursor = ((x == 0 || x == width - 1) && (y > 0 && y < height - 1)) ||
-                    ((x > 0 && x < width - 1) && (y == 0 || y == height - 1));
+            showCursor =
+                    !drawingLine &&
+                    ( ((x == 0 || x == width - 1) && (y > 0 && y < height - 1)) ||
+                      ((x > 0 && x < width - 1) && (y == 0 || y == height - 1)) );
 
             if (locked != previousLock) {
                 repaint();
@@ -989,6 +1074,32 @@
 
             g2.dispose();
 
+            if (drawingLine && showDrawingLine) {
+                Graphics cursor = g.create();
+                cursor.setXORMode(Color.WHITE);
+                cursor.setColor(Color.BLACK);
+
+                x = Math.min(lineFromX, lineToX);
+                y = Math.min(lineFromY, lineToY);
+                int w = Math.abs(lineFromX - lineToX) + 1;
+                int h = Math.abs(lineFromY - lineToY) + 1;
+
+                x = x * zoom;
+                y = y * zoom;
+                w = w * zoom;
+                h = h * zoom;
+
+                int left = (getWidth() - size.width) / 2;
+                int top = helpPanel.getHeight() + (getHeight() - size.height)
+                        / 2;
+
+                x += left;
+                y += top;
+
+                cursor.drawRect(x, y, w, h);
+                cursor.dispose();
+            }
+
             if (showCursor) {
                 Graphics cursor = g.create();
                 cursor.setXORMode(Color.WHITE);
