diff --git a/docs/ansible.md b/docs/ansible.md
index 5e17147bedcb15b75ec5c7950402458977f4e5e3..030f866a16789ec585e8c089811af3073d4b5ddc 100644
--- a/docs/ansible.md
+++ b/docs/ansible.md
@@ -123,7 +123,6 @@ The following tags are defined in playbooks:
 |                hyperkube | Manipulations with K8s hyperkube image
 |          k8s-pre-upgrade | Upgrading K8s cluster
 |              k8s-secrets | Configuring K8s certs/keys
-|                      kpm | Installing K8s apps definitions with KPM
 |           kube-apiserver | Configuring static pod kube-apiserver
 |  kube-controller-manager | Configuring static pod kube-controller-manager
 |                  kubectl | Installing kubectl and bash completion
diff --git a/docs/roadmap.md b/docs/roadmap.md
index cf8fa2d9a32c651f7e651132e71bab116514cc55..a0c1a3ffc627c13e350d1c0dc4a28d754bee2b6d 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -9,7 +9,7 @@ Kubespray's roadmap
 ### Self deployment (pull-mode) [#320](https://github.com/kubespray/kubespray/issues/320)
 - the playbook would install and configure docker/rkt and the etcd cluster
 - the following data would be inserted into etcd: certs,tokens,users,inventory,group_vars.
-- a "kubespray" container would be deployed (kubespray-cli, ansible-playbook, kpm)
+- a "kubespray" container would be deployed (kubespray-cli, ansible-playbook)
 - to be discussed, a way to provide the inventory
 - **self deployment** of the node from inside a container [#321](https://github.com/kubespray/kubespray/issues/321)
 
diff --git a/inventory/sample/group_vars/all.yml b/inventory/sample/group_vars/all.yml
index 282943a8d5117d47db48155072f8084c1f8f436f..d856d064cfb1bd78529b81759c90f0f1e13db7d6 100644
--- a/inventory/sample/group_vars/all.yml
+++ b/inventory/sample/group_vars/all.yml
@@ -110,10 +110,6 @@ bin_dir: /usr/local/bin
 # Uncomment this if you have more than 3 nameservers, then we'll only use the first 3.
 #docker_dns_servers_strict: false
 
-## Default packages to install within the cluster, f.e:
-#kpm_packages:
-# - name: kube-system/grafana
-
 ## Certificate Management
 ## This setting determines whether certs are generated via scripts or whether a
 ## cluster of Hashicorp's Vault is started to issue certificates (using etcd
diff --git a/roles/kubernetes-apps/kpm/library/kpm.py b/roles/kubernetes-apps/kpm/library/kpm.py
deleted file mode 100644
index aa44d4cc8fc52ae3b2075d3e775570ca1ad2866b..0000000000000000000000000000000000000000
--- a/roles/kubernetes-apps/kpm/library/kpm.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-import kpm.deploy
-from ansible.module_utils.basic import *
-
-DOCUMENTATION = """
----
-module: kpm
-short_description: Application deployment on kubernetes with kpm registry
-description:
-  - Create, remove, and update resources within a Kubernetes Cluster
-version_added: "2.0"
-options:
-  name:
-    required: true
-    default: null
-    description:
-      - The name of the kpm package
-  namespace:
-    required: false
-    default: 'default'
-    description:
-      - The namespace to deploy package. It will be created if doesn't exist
-  force:
-    required: false
-    default: false
-    description:
-      - A flag to indicate to force delete, replace.
-  registry:
-    required: false
-    default: 'https://api.kpm.sh'
-    description:
-      - The registry url to fetch packages
-  version:
-    required: false
-    default: 'None'
-    description:
-      - The package version
-  variables:
-    required: false
-    default: 'None'
-    description:
-      - Set package variables
-  state:
-    required: false
-    choices: ['present', 'absent']
-    default: present
-    description:
-      - present handles checking existence or creating resources,
-        absent handles deleting resource(s).
-requirements:
-  - kubectl
-  - kpm
-author: "Antoine Legrand (ant31_2t@msn.com)"
-"""
-
-EXAMPLES = """
-- name: check presence or install ghost
-  kpm: name=ghost/ghost state=present
-
-- name: check absence or remove rocketchat
-  kpm: name=ant31/rocketchat state=absent
-"""
-
-RETURN = """
-"""
-
-
-def check_changed(result, state='present'):
-        no_change = ["ok", 'protected', 'absent']
-        for r in result:
-                if r['status'] not in no_change:
-                        return True
-        return False
-
-
-def main():
-        module = AnsibleModule(
-                supports_check_mode=True,
-                argument_spec = dict(
-                        version = dict(default=None, required=False),
-                        state = dict(default='present', choices=['present', 'absent']),
-                        name = dict(required=True),
-                        force = dict(required=False, default=False, type='bool'),
-                        variables = dict(required=False, default=None, type='dict'),
-                        registry = dict(required=False, default="https://api.kpm.sh"),
-                        namespace=dict(default='default', required=False)))
-
-        params = {"version": module.params.get("version"),
-                  "namespace": module.params.get('namespace'),
-                  "variables": module.params.get('variables'),
-                  "endpoint": module.params.get('registry'),
-                  "dry": module.check_mode,
-                  "proxy": None,
-                  "fmt": "json"}
-        state = module.params.get("state")
-        try:
-                if state == 'present':
-                        r = kpm.deploy.deploy(module.params.get('name'), **params)
-                elif state == 'absent':
-                        r = kpm.deploy.delete(module.params.get('name'), **params)
-        except Exception as e:
-                module.fail_json(msg=e.message)
-        res = {}
-        res['kpm'] = r
-        res['changed'] = check_changed(r, state)
-        module.exit_json(**res)
-
-if __name__ == '__main__':
-        main()
diff --git a/roles/kubernetes-apps/kpm/tasks/main.yml b/roles/kubernetes-apps/kpm/tasks/main.yml
deleted file mode 100644
index 9aadc07eab709ac45e40a035cc21754252e8bd7c..0000000000000000000000000000000000000000
--- a/roles/kubernetes-apps/kpm/tasks/main.yml
+++ /dev/null
@@ -1,20 +0,0 @@
----
-- name: install kpm
-  pip:
-    name: "kpm"
-    state: "present"
-    version: "0.16.1"
-  when: kpm_packages|default([])| length > 0
-
-- name: manage kubernetes applications
-  kpm:
-    namespace: "{{item.namespace | default(kpm_namespace | default('default'))}}"
-    registry: "{{item.registry | default(kpm_registry | default('https://api.kpm.sh'))}}"
-    state: "{{item.state | default(omit)}}"
-    version: "{{item.version | default(omit)}}"
-    variables: "{{item.variables | default(omit)}}"
-    name: "{{item.name}}"
-  with_items: "{{kpm_packages|default([])}}"
-  register: kpmresults
-  environment:
-    PATH: "{{ ansible_env.PATH }}:{{ bin_dir }}"
diff --git a/roles/kubernetes-apps/meta/main.yml b/roles/kubernetes-apps/meta/main.yml
index fca51a3b6b8b7ccc57f87119bc8617c4990dab30..acd6f74956509aa2d63d611c565fa84cca2da205 100644
--- a/roles/kubernetes-apps/meta/main.yml
+++ b/roles/kubernetes-apps/meta/main.yml
@@ -4,11 +4,6 @@ dependencies:
     tags:
       - apps
 
-  - role: kubernetes-apps/kpm
-    tags:
-      - apps
-      - kpm
-
   - role: kubernetes-apps/efk
     when: efk_enabled
     tags: