diff --git a/packages/node/node.go b/packages/node/node.go
index 443da232a8ca87ea15d151c3e51350e992b1888f..9ecb5776aa77541513b6014cc8aa60fe33f55faf 100644
--- a/packages/node/node.go
+++ b/packages/node/node.go
@@ -1,7 +1,6 @@
 package node
 
 import (
-	"strings"
 	"sync"
 
 	"github.com/iotaledger/goshimmer/packages/daemon"
@@ -16,7 +15,7 @@ type Node struct {
 var DisabledPlugins = make(map[string]bool)
 var EnabledPlugins = make(map[string]bool)
 
-func Load(plugins ...*Plugin) *Node {
+func New(plugins ...*Plugin) *Node {
 	node := &Node{
 		loggers:       make([]*Logger, 0),
 		wg:            &sync.WaitGroup{},
@@ -24,20 +23,22 @@ func Load(plugins ...*Plugin) *Node {
 	}
 
 	node.AddLogger(DEFAULT_LOGGER)
-	node.Load(plugins...)
+
+	// configure the enabled plugins
+	node.configure(plugins...)
 
 	return node
 }
 
 func Start(plugins ...*Plugin) *Node {
-	node := Load(plugins...)
+	node := New(plugins...)
 	node.Start()
 
 	return node
 }
 
 func Run(plugins ...*Plugin) *Node {
-	node := Load(plugins...)
+	node := New(plugins...)
 	node.Run()
 
 	return node
@@ -101,39 +102,33 @@ func (node *Node) LogFailure(pluginName string, message string) {
 	}
 }
 
-func getPluginKey(plugin *Plugin) string {
-	return strings.ToLower(strings.Replace(plugin.Name, " ", "", -1))
-}
-
 func isDisabled(plugin *Plugin) bool {
-	_, exists := DisabledPlugins[getPluginKey(plugin)]
+	_, exists := DisabledPlugins[GetPluginIdentifier(plugin.Name)]
 
 	return exists
 }
 
 func isEnabled(plugin *Plugin) bool {
-	_, exists := EnabledPlugins[getPluginKey(plugin)]
+	_, exists := EnabledPlugins[GetPluginIdentifier(plugin.Name)]
 
 	return exists
 }
 
-func (node *Node) Load(plugins ...*Plugin) {
-	if len(plugins) >= 1 {
-		for _, plugin := range plugins {
-			status := plugin.Status
-			if (status == Enabled && !isDisabled(plugin)) ||
-				(status == Disabled && isEnabled(plugin)) {
+func (node *Node) configure(plugins ...*Plugin) {
+	for _, plugin := range plugins {
+		status := plugin.Status
+		if (status == Enabled && !isDisabled(plugin)) ||
+			(status == Disabled && isEnabled(plugin)) {
 
-				plugin.wg = node.wg
-				plugin.Node = node
+			plugin.wg = node.wg
+			plugin.Node = node
 
-				plugin.Events.Configure.Trigger(plugin)
-				node.loadedPlugins = append(node.loadedPlugins, plugin)
+			plugin.Events.Configure.Trigger(plugin)
+			node.loadedPlugins = append(node.loadedPlugins, plugin)
 
-				node.LogInfo("Node", "Loading Plugin: "+plugin.Name+" ... done")
-			} else {
-				node.LogInfo("Node", "Skipping Plugin: "+plugin.Name)
-			}
+			node.LogInfo("Node", "Loading Plugin: "+plugin.Name+" ... done")
+		} else {
+			node.LogInfo("Node", "Skipping Plugin: "+plugin.Name)
 		}
 	}
 }
@@ -141,12 +136,10 @@ func (node *Node) Load(plugins ...*Plugin) {
 func (node *Node) Start() {
 	node.LogInfo("Node", "Executing plugins ...")
 
-	if len(node.loadedPlugins) >= 1 {
-		for _, plugin := range node.loadedPlugins {
-			plugin.Events.Run.Trigger(plugin)
+	for _, plugin := range node.loadedPlugins {
+		plugin.Events.Run.Trigger(plugin)
 
-			node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
-		}
+		node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
 	}
 
 	node.LogSuccess("Node", "Starting background workers ...")
@@ -157,12 +150,10 @@ func (node *Node) Start() {
 func (node *Node) Run() {
 	node.LogInfo("Node", "Executing plugins ...")
 
-	if len(node.loadedPlugins) >= 1 {
-		for _, plugin := range node.loadedPlugins {
-			plugin.Events.Run.Trigger(plugin)
+	for _, plugin := range node.loadedPlugins {
+		plugin.Events.Run.Trigger(plugin)
 
-			node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
-		}
+		node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
 	}
 
 	node.LogSuccess("Node", "Starting background workers ...")
diff --git a/packages/node/plugin.go b/packages/node/plugin.go
index 4e915d3a48c211ab63fd6884d8cdd185cc69b522..bb7efa8494c53492686f30877b9413398f33565f 100644
--- a/packages/node/plugin.go
+++ b/packages/node/plugin.go
@@ -1,9 +1,11 @@
 package node
 
 import (
+	"strings"
 	"sync"
 
 	"github.com/iotaledger/goshimmer/packages/events"
+	"github.com/iotaledger/goshimmer/packages/parameter"
 )
 
 const (
@@ -20,7 +22,7 @@ type Plugin struct {
 }
 
 // Creates a new plugin with the given name, default status and callbacks.
-// The last specified callback is the run callback, while all other callbacks are configure callbacks.
+// The last specified callback is the mandatory run callback, while all other callbacks are configure callbacks.
 func NewPlugin(name string, status int, callback Callback, callbacks ...Callback) *Plugin {
 	plugin := &Plugin{
 		Name:   name,
@@ -31,6 +33,9 @@ func NewPlugin(name string, status int, callback Callback, callbacks ...Callback
 		},
 	}
 
+	// make the plugin known to the parameters
+	parameter.AddPlugin(name, status)
+
 	if len(callbacks) >= 1 {
 		plugin.Events.Configure.Attach(events.NewClosure(callback))
 		for _, callback = range callbacks[:len(callbacks)-1] {
@@ -45,6 +50,10 @@ func NewPlugin(name string, status int, callback Callback, callbacks ...Callback
 	return plugin
 }
 
+func GetPluginIdentifier(name string) string {
+	return strings.ToLower(strings.Replace(name, " ", "", -1))
+}
+
 func (plugin *Plugin) LogSuccess(message string) {
 	plugin.Node.LogSuccess(plugin.Name, message)
 }
diff --git a/packages/parameter/events.go b/packages/parameter/events.go
index ad91b734b30ca35dd8dbd169570e34f063cf96f1..b755a038485a09e01eb0c20ddd9ceaa2496dc7ab 100644
--- a/packages/parameter/events.go
+++ b/packages/parameter/events.go
@@ -8,10 +8,12 @@ var Events = struct {
 	AddBool   *events.Event
 	AddInt    *events.Event
 	AddString *events.Event
+	AddPlugin *events.Event
 }{
 	AddBool:   events.NewEvent(boolParameterCaller),
 	AddInt:    events.NewEvent(intParameterCaller),
 	AddString: events.NewEvent(stringParameterCaller),
+	AddPlugin: events.NewEvent(pluginParameterCaller),
 }
 
 func boolParameterCaller(handler interface{}, params ...interface{}) {
@@ -25,3 +27,7 @@ func intParameterCaller(handler interface{}, params ...interface{}) {
 func stringParameterCaller(handler interface{}, params ...interface{}) {
 	handler.(func(*StringParameter))(params[0].(*StringParameter))
 }
+
+func pluginParameterCaller(handler interface{}, params ...interface{}) {
+	handler.(func(string, int))(params[0].(string), params[1].(int))
+}
diff --git a/packages/parameter/parameter.go b/packages/parameter/parameter.go
index 2d1809149d1896818c58983910b14e35b4f6dd35..24e9117d815000c2c046b21e6b1e30f248291c9a 100644
--- a/packages/parameter/parameter.go
+++ b/packages/parameter/parameter.go
@@ -32,7 +32,7 @@ func GetBools() map[string]*BoolParameter {
 var intParameters = make(map[string]*IntParameter)
 
 func AddInt(name string, defaultValue int, description string) *IntParameter {
-	if intParameters[name] != nil {
+	if _, exists := intParameters[name]; exists {
 		panic("duplicate parameter - \"" + name + "\" was defined already")
 	}
 
@@ -61,7 +61,7 @@ func GetInts() map[string]*IntParameter {
 var stringParameters = make(map[string]*StringParameter)
 
 func AddString(name string, defaultValue string, description string) *StringParameter {
-	if stringParameters[name] != nil {
+	if _, exists := stringParameters[name]; exists {
 		panic("duplicate parameter - \"" + name + "\" was defined already")
 	}
 
@@ -86,3 +86,19 @@ func GetString(name string) *StringParameter {
 func GetStrings() map[string]*StringParameter {
 	return stringParameters
 }
+
+var plugins = make(map[string]int)
+
+func AddPlugin(name string, status int) {
+	if _, exists := plugins[name]; exists {
+		panic("duplicate plugin - \"" + name + "\" was defined already")
+	}
+
+	plugins[name] = status
+
+	Events.AddPlugin.Trigger(name, status)
+}
+
+func GetPlugins() map[string]int {
+	return plugins
+}
diff --git a/plugins/cli/cli.go b/plugins/cli/cli.go
index dc898c984705fab9b0934a1bc1bf3d2e0e71e7f0..73aa4f190443766000142900e852467c354d20a6 100644
--- a/plugins/cli/cli.go
+++ b/plugins/cli/cli.go
@@ -5,6 +5,10 @@ import (
 	"fmt"
 	"os"
 	"path/filepath"
+	"sort"
+	"strings"
+
+	"github.com/iotaledger/goshimmer/packages/node"
 )
 
 func AddBoolParameter(p *bool, name string, usage string) {
@@ -19,20 +23,36 @@ func AddStringParameter(p *string, name string, usage string) {
 	flag.StringVar(p, name, *p, usage)
 }
 
+var enabledPlugins []string
+var disabledPlugins []string
+
+func AddPluginStatus(name string, status int) {
+	switch status {
+	case node.Enabled:
+		enabledPlugins = append(enabledPlugins, name)
+	case node.Disabled:
+		disabledPlugins = append(disabledPlugins, name)
+	}
+}
+
+func getList(a []string) string {
+	sort.Strings(a)
+	return strings.Join(a, " ")
+}
+
 func printUsage() {
-	_, err := fmt.Fprintf(
+	fmt.Fprintf(
 		os.Stderr,
 		"\n"+
-			"SHIMMER 1.0\n\n"+
+			"SHIMMER\n\n"+
 			"  A lightweight modular IOTA node.\n\n"+
 			"Usage:\n\n"+
 			"  %s [OPTIONS]\n\n"+
-			"Options:\n\n",
+			"Options:\n",
 		filepath.Base(os.Args[0]),
 	)
-	if err != nil {
-		panic(err)
-	}
-
 	flag.PrintDefaults()
+
+	fmt.Fprintf(os.Stderr, "\nThe following plugins are enabled by default and can be disabled with -%s:\n  %s\n", getFlagName(node.DISABLE_PLUGINS.Name), getList(enabledPlugins))
+	fmt.Fprintf(os.Stderr, "The following plugins are disabled by default and can be enabled with -%s:\n  %s\n\n", getFlagName(node.ENABLE_PLUGINS.Name), getList(disabledPlugins))
 }
diff --git a/plugins/cli/plugin.go b/plugins/cli/plugin.go
index 0c0158f0860d85e109d4d8eeb17918650917f47a..ae97189d4520992e2d66e16eda5569afc1533042 100644
--- a/plugins/cli/plugin.go
+++ b/plugins/cli/plugin.go
@@ -10,40 +10,44 @@ import (
 	"github.com/iotaledger/goshimmer/packages/parameter"
 )
 
-func onAddBoolParameter(param *parameter.BoolParameter) {
-	flagName := strings.Replace(strings.Replace(strings.ToLower(param.Name), "/", "-", 1), "_", "-", -1)
+func getFlagName(paramName string) string {
+	return strings.Replace(strings.Replace(strings.ToLower(paramName), "/", "-", 1), "_", "-", -1)
+}
 
-	AddBoolParameter(param.Value, flagName, param.Description)
+func onAddBoolParameter(param *parameter.BoolParameter) {
+	AddBoolParameter(param.Value, getFlagName(param.Name), param.Description)
 }
 
 func onAddIntParameter(param *parameter.IntParameter) {
-	flagName := strings.Replace(strings.Replace(strings.ToLower(param.Name), "/", "-", 1), "_", "-", -1)
-
-	AddIntParameter(param.Value, flagName, param.Description)
+	AddIntParameter(param.Value, getFlagName(param.Name), param.Description)
 }
 
 func onAddStringParameter(param *parameter.StringParameter) {
-	flagName := strings.Replace(strings.Replace(strings.ToLower(param.Name), "/", "-", 1), "_", "-", -1)
+	AddStringParameter(param.Value, getFlagName(param.Name), param.Description)
+}
 
-	AddStringParameter(param.Value, flagName, param.Description)
+func onAddPlugin(name string, status int) {
+	AddPluginStatus(node.GetPluginIdentifier(name), status)
 }
 
 func init() {
 	for _, param := range parameter.GetBools() {
 		onAddBoolParameter(param)
 	}
-
 	for _, param := range parameter.GetInts() {
 		onAddIntParameter(param)
 	}
-
 	for _, param := range parameter.GetStrings() {
 		onAddStringParameter(param)
 	}
+	for name, status := range parameter.GetPlugins() {
+		onAddPlugin(name, status)
+	}
 
 	parameter.Events.AddBool.Attach(events.NewClosure(onAddBoolParameter))
 	parameter.Events.AddInt.Attach(events.NewClosure(onAddIntParameter))
 	parameter.Events.AddString.Attach(events.NewClosure(onAddStringParameter))
+	parameter.Events.AddPlugin.Attach(events.NewClosure(onAddPlugin))
 
 	flag.Usage = printUsage
 }
@@ -73,6 +77,8 @@ func configure(ctx *node.Plugin) {
 	ctx.Node.LogInfo("Node", "Loading plugins ...")
 }
 
-var PLUGIN = node.NewPlugin("CLI", node.Enabled, configure, func(plugin *node.Plugin) {
+func run(ctx *node.Plugin) {
+	// do nothing; everything is handled in the configure step
+}
 
-})
+var PLUGIN = node.NewPlugin("CLI", node.Enabled, configure, run)