diff --git a/lib/main.dart b/lib/main.dart
index fb389e4..84943fa 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,9 +1,11 @@
-import 'package:sky/widgets/basic.dart';
+//import 'package:sky/widgets/basic.dart';
 
-import 'card.dart';
+import 'card.dart' as card;
 import 'my_button.dart';
 import 'dart:sky' as sky;
 import 'package:vector_math/vector_math.dart' as vector_math;
+import 'package:sky/theme/colors.dart' as colors;
+import 'package:sky/widgets.dart';
 
 class HelloWorldApp extends App {
   int counter = 0;
@@ -14,7 +16,17 @@
   double dx = 0.0;
   double dy = 0.0;
 
-  Transform makeTransform() {
+  // Used for drag/drop of the square
+  DragController _dragController;
+  Offset _displacement = Offset.zero;
+
+  // Positioning of the dotX and dotY
+  double dotX = 10.0;
+  double dotY = 10.0 + sky.view.paddingTop;
+
+  String debug3 = '';
+
+  Container makeTransform() {
     return new Container(
       child: new MyButton(
         child: new Text('Engage'),
@@ -71,6 +83,48 @@
     });
   }
 
+  EventDisposition _startDrag(sky.PointerEvent event) {
+    setState(() {
+      _dragController = new DragController(new DragData("Orange"));
+      _dragController.update(new Point(event.x, event.y));
+      _displacement = Offset.zero;
+      debug3 = "START ${event.x.toStringAsFixed(3)} ${event.y.toStringAsFixed(3)}";
+    });
+    return EventDisposition.consumed;
+  }
+
+  EventDisposition _updateDrag(sky.PointerEvent event) {
+    setState(() {
+      _dragController.update(new Point(event.x, event.y));
+      _displacement += new Offset(event.dx, event.dy);
+      debug3 = "DRAG ${event.x.toStringAsFixed(3)} ${event.y.toStringAsFixed(3)}";
+    });
+    return EventDisposition.consumed;
+  }
+
+  EventDisposition _cancelDrag(sky.PointerEvent event) {
+    setState(() {
+      _dragController.cancel();
+      _dragController = null;
+      debug3 = "CANCELED";
+    });
+    return EventDisposition.consumed;
+  }
+
+  EventDisposition _drop(sky.PointerEvent event) {
+    setState(() {
+      _dragController.update(new Point(event.x, event.y));
+      _dragController.drop();
+      _dragController = null;
+
+      dotX += _displacement.dx;
+      dotY += _displacement.dy;
+      _displacement = Offset.zero;
+      debug3 = "DROP ${event.x.toStringAsFixed(3)} ${event.y.toStringAsFixed(3)}";
+    });
+    return EventDisposition.consumed;
+  }
+
   Widget build() {
     return new Center(child: new Flex([
       new Center(child: new Text('Hello, world!')),
@@ -80,31 +134,107 @@
       new Center(child: new MyToolBar()),
       makeTransform(),
       new Flex([
-        new CardComponent(new Card.fromString("classic h1"), true),
-        new CardComponent(new Card.fromString("classic sk"), true),
-        new CardComponent(new Card.fromString("classic d5"), true)
-      ])
+        new card.CardComponent(new card.Card.fromString("classic h1"), true),
+        new card.CardComponent(new card.Card.fromString("classic sk"), true),
+        new card.CardComponent(new card.Card.fromString("classic d5"), true)
+      ]),
+      new Center(child: new Text('Drag: ${debug3}')),
+      new Center(child: new Text('X, Y: ${dotX} ${dotY}')),
+      new Container(
+        decoration: new BoxDecoration(backgroundColor: colors.Pink[500]),
+        child: new Stack([
+          new Flex([
+            new ExampleDragTarget(),
+            new ExampleDragTarget()
+          ]),
+          new Positioned(
+            top: _dragController != null ? dotY + _displacement.dy : -1000.0,
+            left: _dragController != null ? dotX + _displacement.dx : -1000.0,
+            child: new IgnorePointer(
+              child: new Opacity(
+                opacity: 1.0,
+                child: new Dot()
+              )
+            )
+          ),
+          new Listener(
+            onPointerDown: _startDrag,
+            onPointerMove: _updateDrag,
+            onPointerCancel: _cancelDrag,
+            onPointerUp: _drop,
+            child: new Positioned(
+              top: dotY,
+              left: dotX,
+              child: new Opacity(
+                opacity: _dragController != null ? 0.0 : 1.0,
+                child: new Dot()
+              )
+            )
+          )
+        ])
+      )
     ], direction: FlexDirection.vertical));
   }
 }
 
+class Dot extends Component {
+  Widget build() {
+    return new Container(
+      width: 50.0,
+      height: 50.0,
+      decoration: new BoxDecoration(
+        backgroundColor: colors.DeepOrange[500]
+      )
+    );
+  }
+}
+
+class DragData {
+  DragData(this.text);
+
+  final String text;
+}
+
+class ExampleDragTarget extends StatefulComponent {
+  String _text = 'ready';
+
+  void syncFields(ExampleDragTarget source) {
+  }
+
+  void _handleAccept(DragData data) {
+    setState(() {
+      _text = data.text;
+    });
+  }
+
+  Widget build() {
+    return new DragTarget<DragData>(
+      onAccept: _handleAccept,
+      builder: (List<DragData> data, _) {
+        return new Container(
+          width: 100.0,
+          height: 100.0,
+          margin: new EdgeDims.all(10.0),
+          decoration: new BoxDecoration(
+            border: new Border.all(
+              width: 3.0,
+              color: data.isEmpty ? colors.white : colors.Blue[500]
+            ),
+            backgroundColor: data.isEmpty ? colors.Grey[500] : colors.Green[500]
+          ),
+          child: new Center(
+            child: new Text(_text)
+          )
+        );
+      }
+    );
+  }
+}
+
 void main() {
   runApp(new HelloWorldApp());
 }
 
-/*import 'package:sky/widgets/basic.dart';
-
-
-class DemoApp extends App {
-  Widget build() {
-    return new Center(child: new MyToolBar());
-  }
-}
-
-void main() {
-  runApp(new DemoApp());
-}*/
-
 class MyToolBar extends Component {
   Widget build() {
     return new Container(
diff --git a/pubspec.yaml b/pubspec.yaml
index ef1200b..a8ad234 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,4 +1,4 @@
 name: your_app_name
 dependencies:
   sky: any
-  sky_tools: any
+  sky_tools: any
\ No newline at end of file
