Added source code
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2a0102c
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,18 @@
+.PHONY: all clean
+
+VERSION=v0.0.1
+BUILD_DATE=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
+GIT_COMMIT=$(shell git rev-parse HEAD --)
+GIT_VERSION=${VERSION}-master+${GIT_COMMIT}
+LDFLAGS="-X github.com/swisstxt/cloudstack-cloud-controller-manager/vendor/k8s.io/kubernetes/pkg/version.gitVersion=${GIT_VERSION} -X github.com/swisstxt/cloudstack-cloud-controller-manager/vendor/k8s.io/kubernetes/pkg/version.gitCommit=${GIT_COMMIT} -X github.com/swisstxt/cloudstack-cloud-controller-manager/vendor/k8s.io/kubernetes/pkg/version.buildDate=${BUILD_DATE}"
+
+CMD_SRC=\
+	cmd/cloudstack-ccm/main.go
+
+all: cloudstack-ccm
+
+clean:
+	rm -f cloudstack-ccm
+
+cloudstack-ccm: ${CMD_SRC}
+	go build -ldflags ${LDFLAGS} -o $@ $^
diff --git a/cloudstack.go b/cloudstack.go
new file mode 100644
index 0000000..5030186
--- /dev/null
+++ b/cloudstack.go
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2018 SWISS TXT AG
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package cloudstack
+
+import (
+	"io"
+
+	"k8s.io/klog"
+
+	cloudprovider "k8s.io/cloud-provider"
+)
+
+type CloudstackProvider struct {
+}
+
+const (
+	cloudstackProviderName string = "custom-cloudstack"
+)
+
+func init() {
+	cloudprovider.RegisterCloudProvider(cloudstackProviderName, func(r io.Reader) (cloudprovider.Interface, error) {
+		klog.Infof("Creating Cloudstack provider from config %v", r)
+		return &CloudstackProvider{}, nil
+	})
+}
+
+// Initialize provides the cloud with a kubernetes client builder and may spawn goroutines
+// to perform housekeeping or run custom controllers specific to the cloud provider.
+// Any tasks started here should be cleaned up when the stop channel closes.
+func (p *CloudstackProvider) Initialize(clientBuilder cloudprovider.ControllerClientBuilder, stop <-chan struct{}) {
+	klog.Infof("Initializing Cloudstack provider")
+	// initialize
+
+	go func() {
+		<-stop
+		// cleanup
+
+	}()
+}
+
+// LoadBalancer returns a balancer interface. Also returns true if the interface is supported, false otherwise.
+func (p *CloudstackProvider) LoadBalancer() (cloudprovider.LoadBalancer, bool) {
+	klog.Infof("Getting LoadBalancers from Cloudstack provider")
+	return nil, false
+}
+
+// Instances returns an instances interface. Also returns true if the interface is supported, false otherwise.
+func (p *CloudstackProvider) Instances() (cloudprovider.Instances, bool) {
+	klog.Infof("Getting Instances from Cloudstack provider")
+	return nil, false
+}
+
+// Zones returns a zones interface. Also returns true if the interface is supported, false otherwise.
+func (p *CloudstackProvider) Zones() (cloudprovider.Zones, bool) {
+	klog.Infof("Getting Zones from Cloudstack provider")
+	return nil, false
+}
+
+// Clusters returns a clusters interface.  Also returns true if the interface is supported, false otherwise.
+func (p *CloudstackProvider) Clusters() (cloudprovider.Clusters, bool) {
+	klog.Infof("Getting Clusters from Cloudstack provider")
+	return nil, false
+}
+
+// Routes returns a routes interface along with whether the interface is supported.
+func (p *CloudstackProvider) Routes() (cloudprovider.Routes, bool) {
+	klog.Infof("Getting Routes from Cloudstack provider")
+	return nil, false
+}
+
+// ProviderName returns the cloud provider ID.
+func (p *CloudstackProvider) ProviderName() string {
+	return cloudstackProviderName
+}
+
+// HasClusterID returns true if a ClusterID is required and set
+func (p *CloudstackProvider) HasClusterID() bool {
+	return false
+}
diff --git a/cmd/cloudstack-ccm/main.go b/cmd/cloudstack-ccm/main.go
new file mode 100644
index 0000000..2766af7
--- /dev/null
+++ b/cmd/cloudstack-ccm/main.go
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2016 The Kubernetes Authors.
+ * Copyright 2018 SWISS TXT AG
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+	goflag "flag"
+	"math/rand"
+	"time"
+
+	"k8s.io/klog"
+
+	utilflag "k8s.io/apiserver/pkg/util/flag"
+	"k8s.io/apiserver/pkg/util/logs"
+	"k8s.io/kubernetes/cmd/cloud-controller-manager/app"
+	_ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration
+	_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
+
+	"github.com/spf13/pflag"
+
+	_ "github.com/swisstxt/cloudstack-cloud-controller-manager" // our cloud package
+)
+
+func main() {
+	rand.Seed(time.Now().UnixNano())
+
+	command := app.NewCloudControllerManagerCommand()
+
+	// TODO: once we switch everything over to Cobra commands, we can go back to calling
+	// utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the
+	// normalize func and add the go flag set by hand.
+	pflag.CommandLine.SetNormalizeFunc(utilflag.WordSepNormalizeFunc)
+	pflag.CommandLine.AddGoFlagSet(goflag.CommandLine)
+	//utilflag.InitFlags()
+	logs.InitLogs()
+	defer logs.FlushLogs()
+
+	if err := command.Execute(); err != nil {
+		klog.Fatalf("error: %v\n", err)
+	}
+}