diff --git a/src/FileApi.php b/src/FileApi.php
index f883113..7a0433a 100644
--- a/src/FileApi.php
+++ b/src/FileApi.php
@@ -39,8 +39,12 @@ public function __construct($basepath = DIRECTORY_SEPARATOR, $visibility = 'publ
 
     public function setBasePath($basepath)
     {
-        if (mb_substr($basepath, -1, 1, 'utf8') != '/') {
-            $basepath .= '/';
+        if (mb_substr($basepath, -1, 1, 'utf8') != DIRECTORY_SEPARATOR) {
+            $basepath .= DIRECTORY_SEPARATOR;
+        }
+
+        if (mb_substr($basepath, 0, 1, 'utf8') == DIRECTORY_SEPARATOR) {
+            $basepath = mb_substr($basepath, 1, null, 'utf8');
         }
 
         $this->basepath = $basepath;
@@ -56,10 +60,6 @@ public function get($filename, $size = self::SIZE_LARGE)
         $file = explode('.', $filename);
         $file_path = '';
 
-        if (empty($filename)) {
-            return '';
-        }
-
         $file_path = $this->basepath . $filename;
 
         if ($size != self::SIZE_ORIGINAL
@@ -77,9 +77,9 @@ public function get($filename, $size = self::SIZE_LARGE)
         }
     }
 
-    public function thumbs($thumb_sizes = array())
+    public function thumbs($thumb_sizes = null)
     {
-        if (!empty($thumb_sizes)) {
+        if (!is_null($thumb_sizes)) {
             $this->thumb_sizes = $thumb_sizes;
         }
 
@@ -175,6 +175,131 @@ public function drop($filename)
         }
     }
 
+    public function exists($filename)
+    {
+        return Storage::exists($this->basepath . $filename);
+    }
+
+    public function isDirectory($filename)
+    {
+        return in_array(
+            $this->basepath . $filename,
+            Storage::directories($this->basepath)
+        );
+    }
+
+    public function isFile($filename)
+    {
+        return in_array(
+            $this->basepath . $filename,
+            Storage::files($this->basepath)
+        );
+    }
+
+    public function extension($filename)
+    {
+        if (!$this->exists($filename)) {
+            return null;
+        }
+
+        return pathinfo($filename)['extension'];
+    }
+
+    public function move($old_name, $new_name)
+    {
+        if ($this->isImage($old_name)) {
+            $old_thumb_name = $this->getPossibleThumbName($old_name);
+            $new_thumb_name = $this->getPossibleThumbName($new_name);
+
+            for ($i = 0; $i < count($old_thumb_name); $i++) {
+                if ($this->exists($old_thumb_name[$i])) {
+                    Storage::move($this->basepath . $old_thumb_name[$i], $this->basepath . $new_thumb_name[$i]);
+                }
+            }
+        }
+
+        Storage::move($this->basepath . $old_name, $this->basepath . $new_name);
+    }
+
+    public function makeDirectory($folder_name)
+    {
+        Storage::makeDirectory($this->basepath . $folder_name);
+    }
+
+    public function directoryIsEmpty($folder_name)
+    {
+        if (!$this->isDirectory($folder_name)) {
+            return 'This file is not a directory';
+        }
+
+        return count(Storage::files($folder_name)) == 0;
+    }
+
+    public function deleteDirectory($folder_name)
+    {
+        if ($this->isDirectory($folder_name)) {
+            Storage::deleteDirectory($this->basepath . $folder_name);
+        }
+    }
+
+    public function directories()
+    {
+        $basepath = $this->basepath;
+
+        return array_map(function ($directory) use ($basepath) {
+            return str_replace($basepath, '', $directory);
+        }, Storage::directories($basepath));
+    }
+
+    public function files()
+    {
+        $basepath = $this->basepath;
+
+        return array_map(function ($file) use ($basepath) {
+            return str_replace($basepath, '', $file);
+        }, Storage::files($basepath));
+    }
+
+    public function fileIsImage($filename)
+    {
+        $mime_type = Storage::mimeType($this->basepath . $filename);
+
+        return starts_with($mime_type, 'image');
+    }
+
+    public function getFileType($filename)
+    {
+        return Storage::mimeType($this->basepath . $filename);
+    }
+
+    public function fileHasThumb($filename, $size = null)
+    {
+        if (is_null($size)) {
+            $thumb_names = $this->getPossibleThumbName($filename);
+            foreach ($thumb_names as $thumb_name) {
+                if (Storage::exists($this->basepath . $thumb_name)) {
+                    return true;
+                }
+            }
+        }
+
+        $file_filename = pathinfo($filename)['filename'];
+        $file_extension = pathinfo($filename)['extension'];
+        $thumb_name = $file_filename . '_' . $size . '.' . $file_extension;
+
+        return Storage::exists($thumb_name);
+    }
+
+    public function lastModified($filename)
+    {
+        return Storage::lastModified($this->basepath . $filename);
+    }
+
+    public function size($filename)
+    {
+        return Storage::size($this->basepath . $filename);
+    }
+
     /********************************************
      ***********  Private Functions *************
      ********************************************/
@@ -431,4 +556,26 @@ private function saveCompress($img, $original_name, $suffix)
         // remove tmp image
         Storage::disk('local')->delete($tmp_filename);
     }
+
+    private function isImage($filename)
+    {
+        $image_types = array('image/png', 'image/gif', 'image/jpeg', 'image/jpg');
+        $file_type = Storage::mimeType($this->basepath . $filename);
+
+        return in_array($file_type, $image_types);
+    }
+
+    private function getPossibleThumbName($filename)
+    {
+        $file_filename = pathinfo($filename)['filename'];
+        $file_extension = pathinfo($filename)['extension'];
+        $default_thumbs = config('fileapi.default_thumbs');
+        $thumb_name = [];
+
+        foreach ($default_thumbs as $key => $value) {
+            $thumb_name[] = $file_filename . '_' . $key . '.' . $file_extension;
+        }
+
+        return $thumb_name;
+    }
 }
