diff --git a/.analysis_options b/.analysis_options
index 19c7129..a10d4c5 100644
--- a/.analysis_options
+++ b/.analysis_options
@@ -1,4 +1,2 @@
 analyzer:
   strong-mode: true
-  exclude:
-    - lib/src/usage_impl_flutter.dart
diff --git a/changelog.md b/changelog.md
index 597ab61..f62e4dd 100644
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,8 @@
 
 ## 3.0.0
 - removed the use of configurable imports
+- removed the Flutter specific entry-point; Flutter apps can now use the
+  regular `dart:io` entrypoint (AnalyticsIO)
 
 ## 2.2.2
 - adjust the Flutter usage client to Flutter API changes
diff --git a/example/flutter_example/.gitignore b/example/flutter_example/.gitignore
deleted file mode 100644
index 14c7d4c..0000000
--- a/example/flutter_example/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.DS_Store
-.atom/
-.idea
-.packages
-.pub/
-build/
-ios/.generated/
-packages
-pubspec.lock
diff --git a/example/flutter_example/README.md b/example/flutter_example/README.md
deleted file mode 100644
index 7608a60..0000000
--- a/example/flutter_example/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Example of usage package with Flutter
-
-To run the Flutter example, ensure that the pubspec.yaml points to your Flutter
-path. Then run:
-
-```
-pub get
-flutter run
-```
diff --git a/example/flutter_example/android/AndroidManifest.xml b/example/flutter_example/android/AndroidManifest.xml
deleted file mode 100644
index 2e28bb3..0000000
--- a/example/flutter_example/android/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.yourcompany.flutterExample"
-    android:versionCode="1"
-    android:versionName="0.0.1">
-
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21" />
-    <uses-permission android:name="android.permission.INTERNET"/>
-
-    <application android:name="org.domokit.sky.shell.SkyApplication" android:label="flutter_example" android:icon="@mipmap/ic_launcher">
-        <activity android:name="org.domokit.sky.shell.SkyActivity"
-                  android:launchMode="singleTask"
-                  android:theme="@android:style/Theme.Black.NoTitleBar"
-                  android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection"
-                  android:hardwareAccelerated="true"
-                  android:windowSoftInputMode="adjustResize">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
diff --git a/example/flutter_example/android/res/mipmap-hdpi/ic_launcher.png b/example/flutter_example/android/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index f0a55cd..0000000
--- a/example/flutter_example/android/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/example/flutter_example/android/res/mipmap-mdpi/ic_launcher.png b/example/flutter_example/android/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index eb98dc4..0000000
--- a/example/flutter_example/android/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/example/flutter_example/android/res/mipmap-xhdpi/ic_launcher.png b/example/flutter_example/android/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index f1783db..0000000
--- a/example/flutter_example/android/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/example/flutter_example/android/res/mipmap-xxhdpi/ic_launcher.png b/example/flutter_example/android/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 46828a2..0000000
--- a/example/flutter_example/android/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/example/flutter_example/android/res/mipmap-xxxhdpi/ic_launcher.png b/example/flutter_example/android/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index a527671..0000000
--- a/example/flutter_example/android/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/example/flutter_example/flutter.yaml b/example/flutter_example/flutter.yaml
deleted file mode 100644
index 2f6cd44..0000000
--- a/example/flutter_example/flutter.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-name: flutter_example
-uses-material-design: true
diff --git a/example/flutter_example/lib/main.dart b/example/flutter_example/lib/main.dart
deleted file mode 100644
index eceae54..0000000
--- a/example/flutter_example/lib/main.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016, the Flutter project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:flutter/material.dart';
-import 'package:usage/usage.dart';
-
-Future main() async {
-  runApp(new Container());
-  Analytics ga = await Analytics.create('UA-67589403-4', 'ga_test', '1.0');
-  runApp(new MaterialApp(
-    title: 'Usage Example',
-    theme: new ThemeData.dark(),
-    routes: <String, WidgetBuilder>{
-      '/': (BuildContext context) => new FlutterDemo(ga)
-    },
-  ));
-}
-
-class FlutterDemo extends StatefulWidget {
-  FlutterDemo(this.ga);
-  Analytics ga;
-  @override
-  State createState() => new _FlutterDemoState();
-}
-
-class _FlutterDemoState extends State<FlutterDemo> {
-  int _times = 0;
-
-  void _handleButtonPressed() {
-    config.ga.sendEvent('button', 'pressed');
-    setState(() {
-      _times++;
-    });
-  }
-
-  void _handleOptIn(bool value) {
-    setState(() {
-      config.ga.enabled = value;
-    });
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return new Scaffold(
-      appBar: new AppBar(
-        title: new Text('Usage Example'),
-      ),
-      body: new Column(
-        children: <Widget>[
-          new Center(
-            child: new Text("Button pressed $_times times."),
-          ),
-          new ListItem(
-            onTap: () => _handleOptIn(!config.ga.enabled),
-            leading: new Checkbox(
-              value: config.ga.enabled,
-              onChanged: _handleOptIn,
-            ),
-            title: new Text("Opt in to analytics"),
-          ),
-        ],
-        mainAxisAlignment: MainAxisAlignment.spaceAround,
-      ),
-      floatingActionButton: new FloatingActionButton(
-        child: new Icon(Icons.add),
-        onPressed: _handleButtonPressed,
-      ),
-    );
-  }
-}
diff --git a/example/flutter_example/pubspec.yaml b/example/flutter_example/pubspec.yaml
deleted file mode 100644
index 52d5cb7..0000000
--- a/example/flutter_example/pubspec.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-name: flutter_example
-description: Create a new Flutter project.
-
-environment:
-  sdk: ">=1.19.0 <2.0.0"
-  flutter: ^0.0.1
-
-dependencies:
-  usage:
-    path: ../..
-  flutter:
-    sdk: flutter
diff --git a/lib/src/usage_impl_flutter.dart b/lib/src/usage_impl_flutter.dart
deleted file mode 100644
index d6b7a05..0000000
--- a/lib/src/usage_impl_flutter.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:convert' show JSON;
-import 'dart:io';
-
-import 'package:flutter/http.dart' as http;
-import 'package:flutter/services.dart';
-import 'package:path/path.dart' as path;
-
-import '../usage.dart';
-import 'usage_impl.dart';
-import 'usage_impl_io.dart';
-
-Future<Analytics> createAnalytics(
-  String trackingId,
-  String applicationName,
-  String applicationVersion, {
-  String analyticsUrl
-}) async {
-    Directory dataDirectory = await PathProvider.getTemporaryDirectory();
-
-    String fileName = '.${applicationName.replaceAll(' ', '_')}';
-    File file = new File(path.join(dataDirectory.path, fileName));
-    await file.create();
-    String contents = await file.readAsString();
-    if (contents.isEmpty) contents = '{}';
-    Map map = JSON.decode(contents);
-
-    return new AnalyticsImpl(
-      trackingId,
-      new FlutterPersistentProperties(applicationName, file, map),
-      new FlutterPostHandler(),
-      applicationName: applicationName,
-      applicationVersion: applicationVersion,
-      analyticsUrl: analyticsUrl
-    );
-}
-
-String _createUserAgent() {
-  final String locale = getPlatformLocale() ?? '';
-
-  if (Platform.isAndroid) {
-    return 'Mozilla/5.0 (Android; Mobile; ${locale})';
-  } else if (Platform.isIOS) {
-    return 'Mozilla/5.0 (iPhone; U; CPU iPhone OS like Mac OS X; ${locale})';
-  } else {
-    // Dart/1.8.0 (macos; macos; macos; en_US)
-    final String os = Platform.operatingSystem;
-    return "Dart/${getDartVersion()} (${os}; ${os}; ${os}; ${locale})";
-  }
-}
-
-class FlutterPostHandler extends PostHandler {
-  final String _userAgent;
-  final HttpClient mockClient;
-
-  FlutterPostHandler({HttpClient this.mockClient}) : _userAgent = _createUserAgent();
-
-  Future sendPost(String url, Map<String, dynamic> parameters) {
-    String data = postEncode(parameters);
-
-    Map<String, String> headers = <String, String>{ 'User-Agent': _userAgent };
-
-    return http.post(url, body: data, headers: headers);
-  }
-}
-
-class FlutterPersistentProperties extends PersistentProperties {
-  File _file;
-  Map _map;
-
-  FlutterPersistentProperties(String name, this._file, this._map) : super(name);
-
-  dynamic operator[](String key) => _map[key];
-
-  void operator[]=(String key, dynamic value) {
-    if (value == null) {
-      _map.remove(key);
-    } else {
-      _map[key] = value;
-    }
-
-    _file.writeAsString(JSON.encode(_map) + '\n');
-  }
-}
diff --git a/readme.md b/readme.md
index dae7812..9b2331f 100644
--- a/readme.md
+++ b/readme.md
@@ -17,7 +17,22 @@
 
 ## For Flutter apps
 
-TODO:
+Flutter applications can use the `AnalyticsIO` version of this library. They will need
+to specify the documents directory in the constructor, in order to tell the library where
+to save the analytics preferences:
+
+```dart
+import 'package:flutter/services.dart';
+import 'package:usage/usage_io.dart';
+
+void main() {
+  final String UA = ...;
+
+  Analytics ga = new AnalyticsIO(UA, 'ga_test', '3.0',
+    documentsDirectory: PathProvider.getApplicationDocumentsDirectory());
+  ...
+}
+```
 
 ## For command-line apps
 
@@ -56,7 +71,7 @@
 ```dart
 final String UA = ...;
 
-Analytics ga = new AnalyticsIO(UA, 'ga_test', '1.0');
+Analytics ga = new AnalyticsIO(UA, 'ga_test', '3.0');
 ga.optIn = true;
 
 ga.sendScreenView('home');
