diff --git a/.gitignore b/.gitignore
index c90ef404..c2f6e62b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@ composer.phar
 composer.lock
 .idea
 examples/.env
+.phpunit.result.cache
 /.DS_Store
diff --git a/composer.json b/composer.json
index f4d78e5b..069a9cfa 100644
--- a/composer.json
+++ b/composer.json
@@ -19,11 +19,10 @@
     "amocrm"
   ],
   "require": {
-    "php": ">=7.1",
+    "php": ">=7.1 || >=8.0",
     "ext-json": "*",
     "amocrm/oauth2-amocrm": "^2.0",
     "guzzlehttp/guzzle": "6.* || 7.*",
-    "illuminate/support": "5.* || 6.* || 7.* || 8.* || 9.*",
     "symfony/dotenv": "3.* || 4.* || 5.* || 6.*",
     "fig/http-message-util": "1.*",
     "ramsey/uuid": "^3 || ^4",
@@ -31,7 +30,7 @@
     "nesbot/carbon": "^2.52"
   },
   "require-dev": {
-    "phpunit/phpunit": "7.*.* || 9.*.*",
+    "phpunit/phpunit": "7.* || 8.* || 9.*",
     "squizlabs/php_codesniffer": "3.5.*"
   },
   "autoload": {
@@ -45,7 +44,9 @@
       "AmoCRM\\Models\\": "src/AmoCRM/Models",
       "AmoCRM\\Collections\\": "src/AmoCRM/Collections",
       "AmoCRM\\Filters\\": "src/AmoCRM/Filters",
-      "AmoCRM\\Helpers\\": "src/AmoCRM/Helpers"
+      "AmoCRM\\Helpers\\": "src/AmoCRM/Helpers",
+      "AmoCRM\\Contracts\\": "src/AmoCRM/Contracts",
+      "AmoCRM\\Support\\": "src/AmoCRM/Support"
     }
   },
   "scripts": {
diff --git a/src/AmoCRM/Collections/BaseApiCollection.php b/src/AmoCRM/Collections/BaseApiCollection.php
index 6ea275a6..2371301d 100644
--- a/src/AmoCRM/Collections/BaseApiCollection.php
+++ b/src/AmoCRM/Collections/BaseApiCollection.php
@@ -5,7 +5,7 @@
 use AmoCRM\Models\BaseApiModel;
 use ArrayAccess;
 use ArrayIterator;
-use Illuminate\Support\Str;
+use AmoCRM\Support\Str;
 use InvalidArgumentException;
 use IteratorAggregate;
 use JsonSerializable;
diff --git a/src/AmoCRM/Contracts/Support/Arrayable.php b/src/AmoCRM/Contracts/Support/Arrayable.php
new file mode 100644
index 00000000..1bdf458a
--- /dev/null
+++ b/src/AmoCRM/Contracts/Support/Arrayable.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace AmoCRM\Contracts\Support;
+
+interface Arrayable
+{
+    /**
+     * Get the instance as an array.
+     *
+     * @return array
+     */
+    public function toArray();
+}
diff --git a/src/AmoCRM/Models/AccountSettings/AmojoRights.php b/src/AmoCRM/Models/AccountSettings/AmojoRights.php
index 94ca2c99..7215e58f 100644
--- a/src/AmoCRM/Models/AccountSettings/AmojoRights.php
+++ b/src/AmoCRM/Models/AccountSettings/AmojoRights.php
@@ -2,7 +2,7 @@
 
 namespace AmoCRM\Models\AccountSettings;
 
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class AmojoRights implements Arrayable
 {
diff --git a/src/AmoCRM/Models/AccountSettings/DateTimeSettings.php b/src/AmoCRM/Models/AccountSettings/DateTimeSettings.php
index 3ef6c14f..b5e94051 100644
--- a/src/AmoCRM/Models/AccountSettings/DateTimeSettings.php
+++ b/src/AmoCRM/Models/AccountSettings/DateTimeSettings.php
@@ -2,7 +2,7 @@
 
 namespace AmoCRM\Models\AccountSettings;
 
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class DateTimeSettings implements Arrayable
 {
diff --git a/src/AmoCRM/Models/AccountSettings/InvoicesSettings.php b/src/AmoCRM/Models/AccountSettings/InvoicesSettings.php
index f5548bfd..3156382c 100644
--- a/src/AmoCRM/Models/AccountSettings/InvoicesSettings.php
+++ b/src/AmoCRM/Models/AccountSettings/InvoicesSettings.php
@@ -2,7 +2,7 @@
 
 namespace AmoCRM\Models\AccountSettings;
 
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class InvoicesSettings implements Arrayable
 {
diff --git a/src/AmoCRM/Models/AccountSettings/TaskType.php b/src/AmoCRM/Models/AccountSettings/TaskType.php
index bf5d7ac9..333d1d9f 100644
--- a/src/AmoCRM/Models/AccountSettings/TaskType.php
+++ b/src/AmoCRM/Models/AccountSettings/TaskType.php
@@ -3,7 +3,7 @@
 namespace AmoCRM\Models\AccountSettings;
 
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class TaskType extends BaseApiModel implements Arrayable
 {
diff --git a/src/AmoCRM/Models/AccountSettings/UsersGroup.php b/src/AmoCRM/Models/AccountSettings/UsersGroup.php
index 48c2519b..6642c06e 100644
--- a/src/AmoCRM/Models/AccountSettings/UsersGroup.php
+++ b/src/AmoCRM/Models/AccountSettings/UsersGroup.php
@@ -3,7 +3,7 @@
 namespace AmoCRM\Models\AccountSettings;
 
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class UsersGroup extends BaseApiModel implements Arrayable
 {
diff --git a/src/AmoCRM/Models/BaseApiModel.php b/src/AmoCRM/Models/BaseApiModel.php
index 569fb260..da2b2695 100644
--- a/src/AmoCRM/Models/BaseApiModel.php
+++ b/src/AmoCRM/Models/BaseApiModel.php
@@ -2,7 +2,7 @@
 
 namespace AmoCRM\Models;
 
-use Illuminate\Support\Str;
+use AmoCRM\Support\Str;
 
 use function is_callable;
 
diff --git a/src/AmoCRM/Models/Chats/Templates/Buttons/AbstractButtonModel.php b/src/AmoCRM/Models/Chats/Templates/Buttons/AbstractButtonModel.php
index 4e4af6e0..76ec8be1 100644
--- a/src/AmoCRM/Models/Chats/Templates/Buttons/AbstractButtonModel.php
+++ b/src/AmoCRM/Models/Chats/Templates/Buttons/AbstractButtonModel.php
@@ -7,7 +7,7 @@
 use AmoCRM\Enum\Chats\Templates\Buttons\ButtonsEnums;
 use AmoCRM\Exceptions\InvalidArgumentException;
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 /**
  * Class AbstractButtonModel
diff --git a/src/AmoCRM/Models/CustomFields/EnumModel.php b/src/AmoCRM/Models/CustomFields/EnumModel.php
index c81b3f8b..80f48f9c 100644
--- a/src/AmoCRM/Models/CustomFields/EnumModel.php
+++ b/src/AmoCRM/Models/CustomFields/EnumModel.php
@@ -3,7 +3,7 @@
 namespace AmoCRM\Models\CustomFields;
 
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 /**
  * Class EnumModel
diff --git a/src/AmoCRM/Models/CustomFields/NestedModel.php b/src/AmoCRM/Models/CustomFields/NestedModel.php
index ce91a253..b98d71a9 100644
--- a/src/AmoCRM/Models/CustomFields/NestedModel.php
+++ b/src/AmoCRM/Models/CustomFields/NestedModel.php
@@ -4,7 +4,7 @@
 
 use AmoCRM\Exceptions\InvalidArgumentException;
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 use function is_null;
 use function preg_match;
diff --git a/src/AmoCRM/Models/CustomFields/RequiredStatusModel.php b/src/AmoCRM/Models/CustomFields/RequiredStatusModel.php
index 5f7cfd5f..cab9ccec 100644
--- a/src/AmoCRM/Models/CustomFields/RequiredStatusModel.php
+++ b/src/AmoCRM/Models/CustomFields/RequiredStatusModel.php
@@ -3,7 +3,7 @@
 namespace AmoCRM\Models\CustomFields;
 
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 /**
  * Class RequiredStatusModel
diff --git a/src/AmoCRM/Models/Customers/Statuses/StatusModel.php b/src/AmoCRM/Models/Customers/Statuses/StatusModel.php
index f6038ee7..11970e84 100644
--- a/src/AmoCRM/Models/Customers/Statuses/StatusModel.php
+++ b/src/AmoCRM/Models/Customers/Statuses/StatusModel.php
@@ -5,7 +5,7 @@
 use AmoCRM\Models\BaseApiModel;
 use AmoCRM\Models\Interfaces\HasIdInterface;
 use AmoCRM\Models\Traits\RequestIdTrait;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class StatusModel extends BaseApiModel implements Arrayable, HasIdInterface
 {
diff --git a/src/AmoCRM/Models/Leads/Pipelines/PipelineModel.php b/src/AmoCRM/Models/Leads/Pipelines/PipelineModel.php
index a5001fca..184f6778 100644
--- a/src/AmoCRM/Models/Leads/Pipelines/PipelineModel.php
+++ b/src/AmoCRM/Models/Leads/Pipelines/PipelineModel.php
@@ -9,7 +9,7 @@
 use AmoCRM\Models\Interfaces\HasIdInterface;
 use AmoCRM\Models\Leads\Pipelines\Statuses\StatusModel;
 use AmoCRM\Models\Traits\RequestIdTrait;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class PipelineModel extends BaseApiModel implements Arrayable, HasIdInterface
 {
diff --git a/src/AmoCRM/Models/Leads/Pipelines/Statuses/StatusModel.php b/src/AmoCRM/Models/Leads/Pipelines/Statuses/StatusModel.php
index 95cb90e4..66f2d519 100644
--- a/src/AmoCRM/Models/Leads/Pipelines/Statuses/StatusModel.php
+++ b/src/AmoCRM/Models/Leads/Pipelines/Statuses/StatusModel.php
@@ -5,7 +5,7 @@
 use AmoCRM\Models\BaseApiModel;
 use AmoCRM\Models\Interfaces\HasIdInterface;
 use AmoCRM\Models\Traits\RequestIdTrait;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class StatusModel extends BaseApiModel implements Arrayable, HasIdInterface
 {
diff --git a/src/AmoCRM/Models/NoteModel.php b/src/AmoCRM/Models/NoteModel.php
index 3b429564..bfbd0b5f 100644
--- a/src/AmoCRM/Models/NoteModel.php
+++ b/src/AmoCRM/Models/NoteModel.php
@@ -5,7 +5,7 @@
 use AmoCRM\Models\Factories\NoteFactory;
 use AmoCRM\Models\Interfaces\HasIdInterface;
 use AmoCRM\Models\Traits\RequestIdTrait;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 /**
  * Class NoteModel
diff --git a/src/AmoCRM/Models/SourceModel.php b/src/AmoCRM/Models/SourceModel.php
index 26d2372f..7c189780 100644
--- a/src/AmoCRM/Models/SourceModel.php
+++ b/src/AmoCRM/Models/SourceModel.php
@@ -5,7 +5,7 @@
 use AmoCRM\Collections\Sources\SourceServicesCollection;
 use AmoCRM\Models\Interfaces\HasIdInterface;
 use AmoCRM\Models\Traits\RequestIdTrait;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class SourceModel extends BaseApiModel implements Arrayable, HasIdInterface
 {
diff --git a/src/AmoCRM/Models/Sources/SourceServiceModel.php b/src/AmoCRM/Models/Sources/SourceServiceModel.php
index d2bc6ae3..a9a7fed9 100644
--- a/src/AmoCRM/Models/Sources/SourceServiceModel.php
+++ b/src/AmoCRM/Models/Sources/SourceServiceModel.php
@@ -4,7 +4,7 @@
 
 use AmoCRM\Collections\Sources\SourceServicesPagesCollection;
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class SourceServiceModel extends BaseApiModel implements Arrayable
 {
diff --git a/src/AmoCRM/Models/Sources/SourceServicePageModel.php b/src/AmoCRM/Models/Sources/SourceServicePageModel.php
index 94fce830..82311882 100644
--- a/src/AmoCRM/Models/Sources/SourceServicePageModel.php
+++ b/src/AmoCRM/Models/Sources/SourceServicePageModel.php
@@ -3,7 +3,7 @@
 namespace AmoCRM\Models\Sources;
 
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class SourceServicePageModel extends BaseApiModel implements Arrayable
 {
diff --git a/src/AmoCRM/Models/TagModel.php b/src/AmoCRM/Models/TagModel.php
index 83bea809..6aeeb383 100644
--- a/src/AmoCRM/Models/TagModel.php
+++ b/src/AmoCRM/Models/TagModel.php
@@ -9,7 +9,7 @@
 use AmoCRM\Models\Interfaces\EntityApiInterface;
 use AmoCRM\Models\Interfaces\HasIdInterface;
 use AmoCRM\Models\Traits\RequestIdTrait;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 use function in_array;
 
diff --git a/src/AmoCRM/Models/Unsorted/AcceptUnsortedModel.php b/src/AmoCRM/Models/Unsorted/AcceptUnsortedModel.php
index abef1396..8e12d9a9 100644
--- a/src/AmoCRM/Models/Unsorted/AcceptUnsortedModel.php
+++ b/src/AmoCRM/Models/Unsorted/AcceptUnsortedModel.php
@@ -6,7 +6,7 @@
 use AmoCRM\Collections\CompaniesCollection;
 use AmoCRM\Collections\ContactsCollection;
 use AmoCRM\Collections\Leads\LeadsCollection;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 /**
  * Class AcceptUnsortedModel
diff --git a/src/AmoCRM/Models/Unsorted/ChatsMetadata.php b/src/AmoCRM/Models/Unsorted/ChatsMetadata.php
index da2c7705..506b2f3a 100644
--- a/src/AmoCRM/Models/Unsorted/ChatsMetadata.php
+++ b/src/AmoCRM/Models/Unsorted/ChatsMetadata.php
@@ -4,7 +4,7 @@
 
 use AmoCRM\Models\Unsorted\Interfaces\UnsortedMetadataInterface;
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class ChatsMetadata extends BaseApiModel implements Arrayable, UnsortedMetadataInterface
 {
diff --git a/src/AmoCRM/Models/Unsorted/DeclineUnsortedModel.php b/src/AmoCRM/Models/Unsorted/DeclineUnsortedModel.php
index a9d2ea35..81f6c4c7 100644
--- a/src/AmoCRM/Models/Unsorted/DeclineUnsortedModel.php
+++ b/src/AmoCRM/Models/Unsorted/DeclineUnsortedModel.php
@@ -6,7 +6,7 @@
 use AmoCRM\Collections\CompaniesCollection;
 use AmoCRM\Collections\ContactsCollection;
 use AmoCRM\Collections\Leads\LeadsCollection;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class DeclineUnsortedModel implements Arrayable
 {
diff --git a/src/AmoCRM/Models/Unsorted/FormsMetadata.php b/src/AmoCRM/Models/Unsorted/FormsMetadata.php
index 770d202b..58623df3 100644
--- a/src/AmoCRM/Models/Unsorted/FormsMetadata.php
+++ b/src/AmoCRM/Models/Unsorted/FormsMetadata.php
@@ -4,7 +4,7 @@
 
 use AmoCRM\Models\BaseApiModel;
 use AmoCRM\Models\Unsorted\Interfaces\UnsortedMetadataInterface;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 use function array_key_exists;
 use function is_null;
diff --git a/src/AmoCRM/Models/Unsorted/LinkUnsortedModel.php b/src/AmoCRM/Models/Unsorted/LinkUnsortedModel.php
index fedcecb1..b3db8a0b 100644
--- a/src/AmoCRM/Models/Unsorted/LinkUnsortedModel.php
+++ b/src/AmoCRM/Models/Unsorted/LinkUnsortedModel.php
@@ -6,7 +6,7 @@
 use AmoCRM\Collections\CompaniesCollection;
 use AmoCRM\Collections\ContactsCollection;
 use AmoCRM\Collections\Leads\LeadsCollection;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class LinkUnsortedModel implements Arrayable
 {
diff --git a/src/AmoCRM/Models/Unsorted/MailMetadata.php b/src/AmoCRM/Models/Unsorted/MailMetadata.php
index 97920db3..f21b7635 100644
--- a/src/AmoCRM/Models/Unsorted/MailMetadata.php
+++ b/src/AmoCRM/Models/Unsorted/MailMetadata.php
@@ -4,7 +4,7 @@
 
 use AmoCRM\Models\Unsorted\Interfaces\UnsortedMetadataInterface;
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class MailMetadata extends BaseApiModel implements Arrayable, UnsortedMetadataInterface
 {
diff --git a/src/AmoCRM/Models/Unsorted/SipMetadata.php b/src/AmoCRM/Models/Unsorted/SipMetadata.php
index 020c8c2d..44b044fd 100644
--- a/src/AmoCRM/Models/Unsorted/SipMetadata.php
+++ b/src/AmoCRM/Models/Unsorted/SipMetadata.php
@@ -4,7 +4,7 @@
 
 use AmoCRM\Models\Unsorted\Interfaces\UnsortedMetadataInterface;
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 use function is_scalar;
 
diff --git a/src/AmoCRM/Models/Unsorted/UnsortedSummaryModel.php b/src/AmoCRM/Models/Unsorted/UnsortedSummaryModel.php
index 9006bde4..0c762cac 100644
--- a/src/AmoCRM/Models/Unsorted/UnsortedSummaryModel.php
+++ b/src/AmoCRM/Models/Unsorted/UnsortedSummaryModel.php
@@ -2,7 +2,7 @@
 
 namespace AmoCRM\Models\Unsorted;
 
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class UnsortedSummaryModel implements Arrayable
 {
diff --git a/src/AmoCRM/Models/Widgets/SettingTemplateModel.php b/src/AmoCRM/Models/Widgets/SettingTemplateModel.php
index f531b2a3..8689faeb 100644
--- a/src/AmoCRM/Models/Widgets/SettingTemplateModel.php
+++ b/src/AmoCRM/Models/Widgets/SettingTemplateModel.php
@@ -3,7 +3,7 @@
 namespace AmoCRM\Models\Widgets;
 
 use AmoCRM\Models\BaseApiModel;
-use Illuminate\Contracts\Support\Arrayable;
+use AmoCRM\Contracts\Support\Arrayable;
 
 class SettingTemplateModel extends BaseApiModel implements Arrayable
 {
diff --git a/src/AmoCRM/Support/Str.php b/src/AmoCRM/Support/Str.php
new file mode 100644
index 00000000..b98376e3
--- /dev/null
+++ b/src/AmoCRM/Support/Str.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace AmoCRM\Support;
+
+class Str
+{
+    /**
+     * The cache of camel-cased words.
+     *
+     * @var array
+     */
+    protected static $camelCache = [];
+
+    /**
+     * The cache of studly-cased words.
+     *
+     * @var array
+     */
+    protected static $studlyCache = [];
+
+    /**
+     * Convert the given string to upper-case.
+     *
+     * @param  string  $value
+     * @return string
+     */
+    public static function upper($value)
+    {
+        return mb_strtoupper($value, 'UTF-8');
+    }
+
+    /**
+     * Returns the portion of the string specified by the start and length parameters.
+     *
+     * @param  string  $string
+     * @param  int  $start
+     * @param  int|null  $length
+     * @return string
+     */
+    public static function substr($string, $start, $length = null)
+    {
+        return mb_substr($string, $start, $length, 'UTF-8');
+    }
+
+    /**
+     * Make a string's first character uppercase.
+     *
+     * @param  string  $string
+     * @return string
+     */
+    public static function ucfirst($string)
+    {
+        return static::upper(static::substr($string, 0, 1)) . static::substr($string, 1);
+    }
+
+    /**
+     * Convert a value to studly caps case.
+     *
+     * @param  string  $value
+     * @return string
+     */
+    public static function studly($value)
+    {
+        $key = $value;
+
+        if (isset(static::$studlyCache[$key])) {
+            return static::$studlyCache[$key];
+        }
+
+        $words = explode(' ', static::replace(['-', '_'], ' ', $value));
+
+        $studlyWords = array_map(function ($word) {
+            return static::ucfirst($word);
+        }, $words);
+
+        return static::$studlyCache[$key] = implode($studlyWords);
+    }
+
+    /**
+     * Convert a value to camel case.
+     *
+     * @param  string  $value
+     * @return string
+     */
+    public static function camel($value)
+    {
+        if (isset(static::$camelCache[$value])) {
+            return static::$camelCache[$value];
+        }
+
+        return static::$camelCache[$value] = lcfirst(static::studly($value));
+    }
+
+    /**
+     * Replace the given value in the given string.
+     *
+     * @param  string|string[]  $search
+     * @param  string|string[]  $replace
+     * @param  string|string[]  $subject
+     * @return string
+     */
+    public static function replace($search, $replace, $subject)
+    {
+        return str_replace($search, $replace, $subject);
+    }
+}