diff --git a/README.md b/README.md
index ca467086..e5b09275 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,6 @@ simple and consistent way. Owl's main features are:
- a declarative component system,
- a reactivity system based on hooks,
- concurrent mode by default,
-- a store and a frontend router
Owl components are defined with ES6 classes, they use QWeb templates, an
underlying virtual DOM, integrates beautifully with hooks, and the rendering is
diff --git a/doc/miscellaneous/comparison.md b/doc/miscellaneous/comparison.md
index db05c0f1..ffb6af5c 100644
--- a/doc/miscellaneous/comparison.md
+++ b/doc/miscellaneous/comparison.md
@@ -189,95 +189,6 @@ with a `Proxy`, which means that it is totally transparent to the developers.
Adding new keys is supported. Once any part of the state has been changed, a
rendering is scheduled in the next microtask tick (promise queue).
-## State Management
-
-Managing the state of an application is a tricky issue. Many solutions have
-been proposed these last few years. It also depends on the kind of application we
-are talking about. A small application may not need much more than a simple
-object to contain its state.
-
-However, there are some common solutions for React and Vue: redux and vuex.
-Both of them are a centralized store that own the state, and they dictate how
-the state can be mutated.
-
-**Redux**
-
-In Redux, the state is mutated by reducers. Reducers are functions
-that modify the state by returning a different object:
-
-```javascript
- ...
- switch (action.type) {
- case ADD_TODO: {
- const { id, content } = action.payload;
- return {
- ...state,
- allIds: [...state.allIds, id],
- byIds: {
- ...state.byIds,
- [id]: {
- content,
- completed: false
- }
- }
- };
- }
-```
-
-This is a little bit awkward to write, but this allows the component system to
-check if a part of the state was changed. This is exactly what is done by the
-`connect` function: it create a _connected_ component, which is subscribed to
-the state and triggers a rerender if some part of the state was modified.
-
-**VueX**
-
-VueX is based on a different principle: the state is mutated through
-some special functions (the mutations), which modify the state in place:
-
-```javascript
- function ({state}, payload) {
- const { id, content } = payload;
- const message = {id, content, completed: false};
- state.messages.push(message)
- }
-```
-
-This is simpler, but there is a little bit more happening behind the scene:
-each key from the state is silently replaced by getters and setters, and VueX
-keeps track of who get data, and retrigger a render when it was changed.
-
-**Owl**
-
-Owl store is a little bit like a mix of redux and vuex: it has actions (but not
-mutations), and like VueX, it keeps track of the state changes. However, it does
-not notify a component when the state changes. Instead, components need to connect
-to the store like in redux, with the `useStore` hook (see the [store documentation](../reference/store.md#connecting-a-component)).
-
-```javascript
-const actions = {
- increment({ state }, val) {
- state.counter.value += val;
- },
-};
-
-const state = {
- counter: { value: 0 },
-};
-const store = new owl.Store({ state, actions });
-
-class Counter extends Component {
- static template = xml`
- `;
- counter = useStore((state) => state.counter);
- dispatch = useDispatch();
-}
-
-Counter.env.store = store;
-const counter = new Counter();
-```
-
## Hooks
[Hooks](https://reactjs.org/docs/hooks-intro.html#motivation) recently took over
@@ -342,4 +253,4 @@ class Example extends Component {
Since the Owl framework had hooks from early in its life, its main APIs
are designed to be interacted with hooks from the start. For example, the
-`Context` and `Store` abstractions.
+`Context` abstraction.
diff --git a/doc/readme.md b/doc/readme.md
index cf53639f..3a9914f3 100644
--- a/doc/readme.md
+++ b/doc/readme.md
@@ -35,8 +35,6 @@ provided by Owl.
- [Props Validation](reference/props_validation.md)
- [QWeb Templating Language](reference/qweb_templating_language.md)
- [QWeb Engine](reference/qweb_engine.md)
-- [Router](reference/router.md)
-- [Store](reference/store.md)
- [Slots](reference/slots.md)
- [Tags](reference/tags.md)
- [Utils](reference/utils.md)
diff --git a/doc/reference/component.md b/doc/reference/component.md
index 9e4c32b0..bde94d20 100644
--- a/doc/reference/component.md
+++ b/doc/reference/component.md
@@ -263,7 +263,7 @@ We explain here all the public methods of the `Component` class.
Note that if a component is mounted, unmounted and remounted, it will be
automatically re-rendered to ensure that changes in its state (or something
- in the environment, or in the store, or ...) will be taken into account.
+ in the environment) will be taken into account.
If a component is mounted inside an element or a fragment which is not in the
DOM, then it will be rendered fully, but not active: the `mounted` hooks will
diff --git a/doc/reference/concurrency_model.md b/doc/reference/concurrency_model.md
index 22a5c3ab..3d081297 100644
--- a/doc/reference/concurrency_model.md
+++ b/doc/reference/concurrency_model.md
@@ -158,12 +158,10 @@ There are two different common problems with Owl asynchronous rendering model:
Here are a few tips on how to work with asynchronous components:
1. Minimize the use of asynchronous components!
-2. Maybe move the asynchronous logic in a store, which then triggers (mostly)
- synchronous renderings
-3. Lazy loading external libraries is a good use case for async rendering. This
+2. Lazy loading external libraries is a good use case for async rendering. This
is mostly fine, because we can assume that it will only takes a fraction of a
second, and only once (see [`owl.utils.loadJS`](utils.md#loadjs))
-4. For all the other cases, the [`AsyncRoot`](misc.md#asyncroot) component is there to help you. When
+3. For all the other cases, the [`AsyncRoot`](misc.md#asyncroot) component is there to help you. When
this component is met, a new rendering
sub tree is created, such that the rendering of that component (and its
children) is not tied to the rendering of the rest of the interface. It can
diff --git a/doc/reference/content.md b/doc/reference/content.md
index 6e5cb4d1..dd3b5037 100644
--- a/doc/reference/content.md
+++ b/doc/reference/content.md
@@ -11,30 +11,26 @@ browser
Component misc
Context AsyncRoot
QWeb Portal
-mount router
-Store Link
-useState RouteComponent
-config Router
- mode
-core tags
- EventBus css
- Observer xml
-hooks utils
- onWillStart debounce
- onMounted escape
- onWillUpdateProps loadJS
- onWillPatch loadFile
- onPatched shallowEqual
- onWillUnmount whenReady
+mount
+useState tags
+config css
+ mode xml
+core utils
+ EventBus debounce
+ Observer escape
+hooks loadJS
+ onWillStart loadFile
+ onMounted shallowEqual
+ onWillUpdateProps whenReady
+ onWillPatch
+ onPatched
+ onWillUnmount
useContext
useState
useRef
useComponent
useEnv
useSubEnv
- useStore
- useDispatch
- useGetters
```
Note that for convenience, the `useState` hook is also exported at the root of the `owl` object.
diff --git a/doc/reference/event_bus.md b/doc/reference/event_bus.md
index 25dfb6d0..88b25c41 100644
--- a/doc/reference/event_bus.md
+++ b/doc/reference/event_bus.md
@@ -23,5 +23,3 @@ Its API is:
| `off(eventType, owner)` | remove all listeners for an owner |
| `trigger(eventType, ...args)` | trigger an event |
| `clear` | remove all subscriptions |
-
-Note that the [`Store`](store.md) is an example of an `EventBus`.
diff --git a/doc/reference/hooks.md b/doc/reference/hooks.md
index c27fd56b..622cb005 100644
--- a/doc/reference/hooks.md
+++ b/doc/reference/hooks.md
@@ -18,9 +18,6 @@
- [`useRef`](#useref)
- [`useSubEnv`](#usesubenv)
- [`useExternalListener`](#useexternallistener)
- - [`useStore`](#usestore)
- - [`useDispatch`](#usedispatch)
- - [`useGetters`](#usegetters)
- [`useComponent`](#usecomponent)
- [`useEnv`](#useenv)
- [Making customized hooks](#making-customized-hooks)
@@ -375,31 +372,6 @@ to be closed:
useExternalListener(window, "click", this.closeMenu);
```
-### `useStore`
-
-The `useStore` hook is the entry point for a component to connect to the store.
-See the [store documentation](store.md) for more information.
-
-### `useDispatch`
-
-The `useDispatch` hook is the way for components to get a reference to the store
-`dispatch` function. See the [store documentation](store.md) for more information.
-
-### `useGetters`
-
-The `useGetters` hook is the way for components to get a reference to the store
-getters. See the [store documentation](store.md) for more information.
-
-### `useComponent`
-
-The `useComponent` hook is useful as a building block for some customized hooks,
-that may need a reference to the component calling them.
-
-### `useEnv`
-
-The `useEnv` hook is useful as a building block for some customized hooks,
-that may need a reference to the env of the component calling them.
-
### Making customized hooks
Hooks are a wonderful way to organize the code of a complex component by feature
diff --git a/doc/reference/router.md b/doc/reference/router.md
deleted file mode 100644
index 352b2646..00000000
--- a/doc/reference/router.md
+++ /dev/null
@@ -1,183 +0,0 @@
-# 🦉 Router 🦉
-
-Remove?
-
-## Content
-
-- [Overview](#overview)
-- [Example](#example)
-- [Reference](#reference)
- - [Route Definition](#route-definition)
- - [Router](#router)
- - [Navigation Guards](#navigation-guards)
- - [RouteComponent](#routecomponent)
- - [Link](#link)
-
-## Overview
-
-It is often useful to organize an application around urls. If the application is
-a single page application, then we need a way to manage those urls in the browser.
-This is why there are many different routers for different frameworks. A generic
-router can do the job just fine, but a specialized router for Owl can give a
-better developer experience.
-
-The Owl router support the following features:
-
-- `history` or `hash` mode
-- declarative routes
-- route redirection
-- navigation guards
-- parameterized routes
-- a `` component
-- a `` component
-
-Note that it is still in early stage of developments, and there are probably
-still some issues.
-
-## Example
-
-To use the Owl router, there are some steps that needs to be done:
-
-- declare some routes
-- create a router
-- add it to the environment
-
-```js
-async function protectRoute({ env, to }) {
- if (!env.session.authUser) {
- env.session.setNextRoute(to.name);
- return { to: "SIGN_IN" };
- }
- return true;
-}
-
-export const ROUTES = [
- { name: "LANDING", path: "/", component: Landing },
- { name: "TASK", path: "/tasks/{{id}}", component: Task },
- { name: "SIGN_UP", path: "/signup", component: SignUp },
- { name: "SIGN_IN", path: "/signin", component: SignIn },
- { name: "ADMIN", path: "/admin", component: Admin, beforeRouteEnter: protectRoute },
- { name: "ACCOUNT", path: "/account", component: Account, beforeRouteEnter: protectRoute },
- { name: "UNKNOWN", path: "*", redirect: { to: "LANDING" } }
-];
-
-function makeEnvironment() {
- ...
- const env = { qweb };
- env.session = new Session(env);
- env.router = new owl.router.Router(env, ROUTES);
- await env.router.start();
- return env;
-}
-
-App.env = makeEnvironment();
-// create root component here
-```
-
-Notice that the router needs to be started. This is an asynchronous operation
-because it needs to apply the potential navigation guards on the current route
-(which may or may not mean that the application is redirected to another route).
-
-## Reference
-
-### Route definition
-
-A route need to be defined as an object with the following keys:
-
-- `name` (optional): a (unique) string useful to identify the current route. If not
- given, it will be assigned an automatic name,
-- `path`: a string describing the url. It can be static: `/admin` or dynamic: `/users/{{id}}`.
- It also can be `*`, to catch all remaining routes.
-- `component` (optional): an Owl component that will be used by the `t-routecomponent`
- directive if the route is active
-- `redirect` (optional): should be destination object (with optional keys `path`, `to` and `params`) if given, the application will be redirected to the destination whenever we match this route
-- `beforeRouteEnter`: defines a [navigation guard](#navigation-guards).
-
-### `Router`
-
-The `Router` constructor takes three arguments:
-
-- `env`: a valid environment,
-- a list of routes,
-- an optional object (with the only key `mode` which can be `history` (default
- value) or `hash`).
-
-`history` will use the browser [History API](https://developer.mozilla.org/en-US/docs/Web/API/History_API) as the mechanism to manage URL.\
-Example: `https://yourdomain.tld/my_custom_route`.\
-For this mechanism to work, you need a way to configure your web server accordingly.
-
-`hash` will manipulate the hash of the URL.\
-Example: `https://yourdomain.tld/index.html#/my_custom_route`.
-
-```js
-const ROUTES = [...];
-const router = new owl.router.Router(env, ROUTES, {mode: 'history'});
-```
-
-Note that the route are defined in a list, and the order matters: the router
-tries to find a match by going down the list.
-
-The router needs to be added to the environment in the `router` sub key.
-
-Once a router is created, it needs to be started. This is necessary to initialize
-its current state to the current URL (and also, to potentially apply any
-navigation guards and/or redirecting).
-
-```js
-await router.start();
-```
-
-Once started, the router will keep track of the current url and reflect its
-value in two keys:
-
-- `router.currentRoute`
-- `router.currentParams`
-
-The router also has a `navigate` method, useful to programmatically change the
-application to another state (and the url):
-
-```js
-router.navigate({ to: "USER", params: { id: 51 } });
-```
-
-### Navigation Guards
-
-Navigation guards are very useful to be able to execute some business logic/
-perform some actions or redirect to other routes whenever the application is
-entering a new route. For example, the following guard checks if there is an
-authenticated user, and if it is not the case, redirect to the sign in route.
-
-```js
-async function protectRoute({ env, to }) {
- if (!env.session.authUser) {
- env.session.setNextRoute(to.name);
- return { to: "SIGN_IN" };
- }
- return true;
-}
-```
-
-A navigation guard is a function that returns a promise, which either resolves
-to `true` (the navigation is accepted), or to another destination object.
-
-### `RouteComponent`
-
-The `RouteComponent` component directs Owl to render the component associated
-to the currently active route (if any):
-
-```xml
-